in passport/src/main/java/org/apache/ofbiz/passport/event/GitHubEvents.java [133:225]
public static String parseGitHubResponse(HttpServletRequest request, HttpServletResponse response) {
String authorizationCode = request.getParameter(PassportUtil.COMMON_CODE);
String state = request.getParameter(PassportUtil.COMMON_STATE);
if (!state.equals(request.getSession().getAttribute(SESSION_GITHUB_STATE))) {
String errMsg = UtilProperties.getMessage(RESOURCE, "GitHubFailedToMatchState", UtilHttp.getLocale(request));
request.setAttribute("_ERROR_MESSAGE_", errMsg);
return "error";
}
if (UtilValidate.isEmpty(authorizationCode)) {
String error = request.getParameter(PassportUtil.COMMON_ERROR);
String errorDescpriton = request.getParameter(PassportUtil.COMMON_ERROR_DESCRIPTION);
String errMsg = null;
try {
errMsg = UtilProperties.getMessage(RESOURCE, "FailedToGetGitHubAuthorizationCode", UtilMisc.toMap(PassportUtil.COMMON_ERROR,
error, PassportUtil.COMMON_ERROR_DESCRIPTION, URLDecoder.decode(errorDescpriton, "UTF-8")), UtilHttp.getLocale(request));
} catch (UnsupportedEncodingException e) {
errMsg = UtilProperties.getMessage(RESOURCE, "GitHubGetAuthorizationCodeError", UtilHttp.getLocale(request));
}
request.setAttribute("_ERROR_MESSAGE_", errMsg);
return "error";
}
Debug.logInfo("GitHub authorization code: " + authorizationCode, MODULE);
GenericValue oauth2GitHub = getOAuth2GitHubConfig(request);
if (UtilValidate.isEmpty(oauth2GitHub)) {
String errMsg = UtilProperties.getMessage(RESOURCE, "GitHubGetOAuth2ConfigError", UtilHttp.getLocale(request));
request.setAttribute("_ERROR_MESSAGE_", errMsg);
return "error";
}
String clientId = oauth2GitHub.getString(PassportUtil.COMMON_CLIENT_ID);
String secret = oauth2GitHub.getString(PassportUtil.COMMON_CLIENT_SECRET);
String returnURI = oauth2GitHub.getString(PassportUtil.COMMON_RETURN_RUL);
// Grant token from authorization code and oauth2 token
// Use the authorization code to obtain an access token
String accessToken = null;
String tokenType = null;
try {
URI uri = new URIBuilder()
.setScheme(TOKEN_END_POINT.substring(0, TOKEN_END_POINT.indexOf(":")))
.setHost(TOKEN_END_POINT.substring(TOKEN_END_POINT.indexOf(":") + 3))
.setPath(TOKEN_SERVICE_URI)
.setParameter("client_id", clientId)
.setParameter("client_secret", secret)
.setParameter("code", authorizationCode)
.setParameter("redirect_uri", returnURI)
.build();
HttpPost postMethod = new HttpPost(uri);
CloseableHttpClient jsonClient = HttpClients.custom().build();
// Debug.logInfo("GitHub get access token query string: " + postMethod.getURI(), MODULE);
postMethod.setConfig(PassportUtil.STANDARD_REQ_CONFIG);
postMethod.setHeader(PassportUtil.ACCEPT_HEADER, "application/json");
CloseableHttpResponse postResponse = jsonClient.execute(postMethod);
String responseString = new BasicResponseHandler().handleResponse(postResponse);
// Debug.logInfo("GitHub get access token response code: " + postResponse.getStatusLine().getStatusCode(), MODULE);
// Debug.logInfo("GitHub get access token response content: " + responseString, MODULE);
if (postResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
Debug.logInfo("Json Response from GitHub: " + responseString, MODULE);
JSON jsonObject = JSON.from(responseString);
JSONToMap jsonMap = new JSONToMap();
Map<String, Object> userMap = jsonMap.convert(jsonObject);
accessToken = (String) userMap.get("access_token");
tokenType = (String) userMap.get("token_type");
// Debug.logInfo("Generated Access Token : " + accessToken, MODULE);
// Debug.logInfo("Token Type: " + tokenType, MODULE);
} else {
String errMsg = UtilProperties.getMessage(RESOURCE, "GitHubGetOAuth2AccessTokenError",
UtilMisc.toMap("error", responseString), UtilHttp.getLocale(request));
request.setAttribute("_ERROR_MESSAGE_", errMsg);
return "error";
}
} catch (URISyntaxException | ConversionException | IOException e) {
request.setAttribute("_ERROR_MESSAGE_", e.toString());
return "error";
}
// Get User Profile
HttpGet getMethod = new HttpGet(API_END_POINT + USER_API_URI);
Map<String, Object> userInfo = null;
try {
userInfo = GitHubAuthenticator.getUserInfo(getMethod, accessToken, tokenType, UtilHttp.getLocale(request));
} catch (AuthenticatorException e) {
request.setAttribute("_ERROR_MESSAGE_", e.toString());
return "error";
} finally {
getMethod.releaseConnection();
}
// Debug.logInfo("GitHub User Info:" + userInfo, MODULE);
// Store the user info and check login the user
return checkLoginGitHubUser(request, userInfo, accessToken);
}