change Social Sign On use JustAuth

change Social Sign On use JustAuth,
dingtalk
sinaweibo
is tested
This commit is contained in:
shimingxy
2020-02-05 19:42:35 +08:00
parent b7a0ecddc0
commit d294444352
20 changed files with 233 additions and 409 deletions

View File

@@ -3,25 +3,18 @@
*/
package org.maxkey.authn.support.socialsignon;
import java.util.HashMap;
import java.util.Map;
import org.maxkey.authn.support.socialsignon.service.SocialSignOnProvider;
import org.maxkey.authn.support.socialsignon.service.SocialSignOnProviderService;
import org.maxkey.authn.support.socialsignon.service.SocialSignOnUserTokenService;
import org.maxkey.client.http.HttpVerb;
import org.maxkey.client.http.Response;
import org.maxkey.client.oauth.model.OAuthRequest;
import org.maxkey.client.oauth.model.Token;
import org.maxkey.client.oauth.model.Verifier;
import org.maxkey.client.oauth.oauth.OAuthService;
import org.maxkey.util.JsonUtils;
import org.maxkey.util.StringUtils;
import org.maxkey.web.WebContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import me.zhyd.oauth.model.AuthCallback;
import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.request.AuthRequest;
/**
* @author Crystal.Sea
*
@@ -45,11 +38,10 @@ public class AbstractSocialSignOnEndpoint {
public final static String SOCIALSIGNON_TYPE_BIND="socialsignon_type_bind";
}
protected Token accessToken;
protected SocialSignOnProvider socialSignOnProvider;
protected OAuthService oauthService;
protected AuthRequest authRequest;
protected String accountJsonString;
@@ -65,103 +57,41 @@ public class AbstractSocialSignOnEndpoint {
protected OAuthService buildOAuthService(String provider){
protected AuthRequest buildAuthRequest(String provider){
SocialSignOnProvider socialSignOnProvider = socialSignOnProviderService.get(provider);
_logger.debug("socialSignOn Provider : "+socialSignOnProvider);
if(socialSignOnProvider!=null){
OAuthServiceBuilder oAuthServiceBuilder=new OAuthServiceBuilder(socialSignOnProvider);
oauthService=oAuthServiceBuilder.builderOAuthService();
WebContext.setAttribute(SOCIALSIGNON_OAUTH_SERVICE_SESSION, socialSignOnProvider);
WebContext.setAttribute(SOCIALSIGNON_PROVIDER_SESSION, oauthService);
return oauthService;
authRequest=socialSignOnProviderService.getAuthRequest(provider);
WebContext.setAttribute(SOCIALSIGNON_OAUTH_SERVICE_SESSION, authRequest);
WebContext.setAttribute(SOCIALSIGNON_PROVIDER_SESSION, socialSignOnProvider);
return authRequest;
}
return null;
}
/**
* get accessToken
* @param service
* @return
*/
protected Token getAccessToken() {
socialSignOnProvider=(SocialSignOnProvider)WebContext.getAttribute(SOCIALSIGNON_OAUTH_SERVICE_SESSION);
oauthService=(OAuthService)WebContext.getAttribute(SOCIALSIGNON_PROVIDER_SESSION);
String oauthVerifier = WebContext.getRequest().getParameter(socialSignOnProvider.getVerifierCode());
protected String authCallback() {
authRequest=(AuthRequest)WebContext.getAttribute(SOCIALSIGNON_OAUTH_SERVICE_SESSION);
socialSignOnProvider=(SocialSignOnProvider)WebContext.getAttribute(SOCIALSIGNON_PROVIDER_SESSION);
WebContext.removeAttribute(SOCIALSIGNON_OAUTH_SERVICE_SESSION);
WebContext.removeAttribute(SOCIALSIGNON_PROVIDER_SESSION);
if(StringUtils.isNullOrBlank(socialSignOnProvider.getVerifierCode()))
return null;
// getting access token
Verifier verifier = new Verifier(oauthVerifier);
this.accessToken=oauthService.getAccessToken(null, verifier);
return accessToken;
}
protected String requestAccountJson() {
OAuthRequest oauthRequest = new OAuthRequest(HttpVerb.GET, this.convertAccountUrl(socialSignOnProvider.getAccountUrl(),socialSignOnProvider.getProvider(), accessToken));
oauthService.signRequest(accessToken, oauthRequest);
Response oauthResponse = oauthRequest.send();
accountJsonString=oauthResponse.getBody();
_logger.debug("requestAccountJson : "+accountJsonString);
return accountJsonString;
}
@SuppressWarnings("unchecked")
protected String getAccountId() {
//if(StringUtils.isNullOrBlank(accountJsonString)) {
requestAccountJson();
//}
if(this.provider.equals("qq")){
accountJsonString=accountJsonString.substring(accountJsonString.indexOf("{"), accountJsonString.indexOf("}")+1);
}
Map<String,Object> map = new HashMap<String,Object>();
map=(HashMap<String,Object>)JsonUtils.json2Object(accountJsonString, map);
if(this.provider.equals("qqweibo")){
if(accessToken.getResponseObject().get(socialSignOnProvider.getAccountId())!=null){
accountId=accessToken.getResponseObject().get(socialSignOnProvider.getAccountId()).toString();
}
}else if(this.provider.equals("qq")){
accountId=map.get(socialSignOnProvider.getAccountId()).toString();
}else{
if(map.get(socialSignOnProvider.getAccountId())!=null){
accountId=map.get(socialSignOnProvider.getAccountId()).toString();
}
}
AuthCallback authCallback=new AuthCallback();
authCallback.setCode(WebContext.getRequest().getParameter("code"));
authCallback.setAuth_code(WebContext.getRequest().getParameter("auth_code"));
authCallback.setOauthToken(WebContext.getRequest().getParameter("oauthToken"));
authCallback.setAuthorization_code(WebContext.getRequest().getParameter("authorization_code"));
authCallback.setOauthVerifier(WebContext.getRequest().getParameter("oauthVerifier"));
authCallback.setState(WebContext.getRequest().getParameter("state"));
AuthResponse<?> authResponse=authRequest.login(authCallback);
_logger.debug("Response : "+authResponse);
accountId=socialSignOnProviderService.getAccountId(socialSignOnProvider.getProvider(), authResponse);
_logger.debug("getAccountId : "+accountId);
return accountId;
}
private String convertAccountUrl(String accountUrl,String provider,Token accessToken) {
if("sinaweibo".equals(provider)) {
if(null!=accessToken.getResponseObject()) {
Object uid = accessToken.getResponseObject().get("uid");
accountUrl = this.convertUrl(accountUrl, "uid", uid == null ? "" : uid.toString());
}
}
return accountUrl;
}
private String convertUrl(String url,String paramName,String paramVal) {
StringBuilder sb = new StringBuilder(url);
if (url.indexOf('?') < 0) {
sb.append('?');
}
else {
sb.append('&');
}
sb.append(paramName+"=").append(paramVal);
return sb.toString();
}
}

View File

@@ -1,91 +0,0 @@
package org.maxkey.authn.support.socialsignon;
import org.maxkey.authn.support.socialsignon.service.SocialSignOnProvider;
import org.maxkey.client.http.SignatureType;
import org.maxkey.client.oauth.builder.ServiceBuilder;
import org.maxkey.client.oauth.builder.api.Api;
import org.maxkey.client.oauth.builder.api.OAuthApi20;
import org.maxkey.client.oauth.oauth.OAuthService;
import org.maxkey.web.WebContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class OAuthServiceBuilder {
private static Logger _logger = LoggerFactory.getLogger(OAuthServiceBuilder.class);
private SocialSignOnProvider socialSignOnProvider;
private Api api;
/**
*
*/
public OAuthServiceBuilder() {
}
/**
* @param socialSignOnProvider
*/
public OAuthServiceBuilder(SocialSignOnProvider socialSignOnProvider) {
this.socialSignOnProvider = socialSignOnProvider;
String callbackUrl=WebContext.getHttpContextPath()+ "/logon/oauth20/callback/"+socialSignOnProvider.getProvider();
socialSignOnProvider.setCallBack(callbackUrl);
api = new OAuthApi20(socialSignOnProvider.getAuthorizeUrl(),
socialSignOnProvider.getAccessTokenUrl(),
socialSignOnProvider.getAccessTokenMethod());
_logger.debug("api : "+api);
}
public OAuthService builderOAuthService() {
if(socialSignOnProvider.getScope()==null||socialSignOnProvider.getScope().equals("")){
return new ServiceBuilder().provider(api)
.apiKey(socialSignOnProvider.getClientId())
.apiSecret(socialSignOnProvider.getClientSecret())
.callback(socialSignOnProvider.getCallBack())
.signatureType(SignatureType.QueryString)
.debug()
.build();
}else{
return new ServiceBuilder().provider(api)
.apiKey(socialSignOnProvider.getClientId())
.apiSecret(socialSignOnProvider.getClientSecret())
.scope(socialSignOnProvider.getScope())
.callback(socialSignOnProvider.getCallBack())
.signatureType(SignatureType.QueryString)
.debug()
.build();
}
}
public SocialSignOnProvider getSocialSignOnProvider() {
return socialSignOnProvider;
}
public void setSocialSignOnProvider(SocialSignOnProvider socialSignOnProvider) {
this.socialSignOnProvider = socialSignOnProvider;
}
public Api getApi() {
return api;
}
public void setApi(Api api) {
this.api = api;
}
}

View File

@@ -8,7 +8,6 @@ import javax.servlet.http.HttpServletRequest;
import org.maxkey.authn.realm.AbstractAuthenticationRealm;
import org.maxkey.authn.support.socialsignon.service.SocialSignOnUserToken;
import org.maxkey.constants.LOGINTYPE;
import org.maxkey.util.JsonUtils;
import org.maxkey.web.WebContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -22,6 +21,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import me.zhyd.oauth.utils.AuthStateUtils;
/**
* @author Crystal.Sea
*
@@ -38,7 +39,7 @@ public class SocialSignOnEndpoint extends AbstractSocialSignOnEndpoint{
public ModelAndView socialSignOnAuthorize(String provider){
_logger.debug("SocialSignOn provider : "+provider);
String authorizationUrl=buildOAuthService(provider).getAuthorizationUrl(null);
String authorizationUrl=buildAuthRequest(provider).authorize(AuthStateUtils.createState());
_logger.debug("authorize SocialSignOn : "+authorizationUrl);
return WebContext.redirect(authorizationUrl);
}
@@ -89,8 +90,7 @@ public class SocialSignOnEndpoint extends AbstractSocialSignOnEndpoint{
public ModelAndView callback(@PathVariable String provider
) {
this.provider=provider;
this.getAccessToken();
this.getAccountId();
this.authCallback();
_logger.debug(this.accountId);
SocialSignOnUserToken socialSignOnUserToken =new SocialSignOnUserToken();
socialSignOnUserToken.setProvider(provider);
@@ -121,8 +121,8 @@ public class SocialSignOnEndpoint extends AbstractSocialSignOnEndpoint{
socialSignOnUserToken.setSocialUserInfo(accountJsonString);
socialSignOnUserToken.setUid(WebContext.getUserInfo().getId());
socialSignOnUserToken.setUsername(WebContext.getUserInfo().getUsername());
socialSignOnUserToken.setAccessToken(JsonUtils.object2Json(accessToken));
socialSignOnUserToken.setExAttribute(JsonUtils.object2Json(accessToken.getResponseObject()));
//socialSignOnUserToken.setAccessToken(JsonUtils.object2Json(accessToken));
//socialSignOnUserToken.setExAttribute(JsonUtils.object2Json(accessToken.getResponseObject()));
_logger.debug("Social Bind : "+socialSignOnUserToken);
this.socialSignOnUserTokenService.delete(socialSignOnUserToken);
this.socialSignOnUserTokenService.insert(socialSignOnUserToken);
@@ -139,9 +139,9 @@ public class SocialSignOnEndpoint extends AbstractSocialSignOnEndpoint{
_logger.debug("Social Sign On from "+socialSignOnUserToken.getProvider()+" mapping to user "+socialSignOnUserToken.getUsername());
if(WebContext.setAuthentication(socialSignOnUserToken.getUsername(), LOGINTYPE.SOCIALSIGNON,this.socialSignOnProvider.getProviderName(),"xe00000004","success")){
socialSignOnUserToken.setAccessToken(JsonUtils.object2Json(this.accessToken));
//socialSignOnUserToken.setAccessToken(JsonUtils.object2Json(this.accessToken));
socialSignOnUserToken.setSocialUserInfo(accountJsonString);
socialSignOnUserToken.setExAttribute(JsonUtils.object2Json(accessToken.getResponseObject()));
//socialSignOnUserToken.setExAttribute(JsonUtils.object2Json(accessToken.getResponseObject()));
this.socialSignOnUserTokenService.update(socialSignOnUserToken);
}

View File

@@ -11,13 +11,6 @@ public class SocialSignOnProvider {
private String icon;
private String clientId;
private String clientSecret;
private String callBack;
private String authorizeUrl;
private String accessTokenUrl;
private String accessTokenMethod;
private String scope;
private String verifierCode;
private String accountUrl;
private String accountId;
private int sortOrder;
@@ -30,96 +23,63 @@ public class SocialSignOnProvider {
public SocialSignOnProvider() {
}
public String getProvider() {
return provider;
}
public void setProvider(String provider) {
this.provider = provider;
}
public String getIcon() {
return icon;
}
public void setIcon(String icon) {
this.icon = icon;
}
public String getProviderName() {
return providerName;
}
public void setProviderName(String providerName) {
this.providerName = providerName;
}
public String getIcon() {
return icon;
}
public void setIcon(String icon) {
this.icon = icon;
}
public String getClientId() {
return clientId;
}
public void setClientId(String clientId) {
this.clientId = clientId;
}
public String getClientSecret() {
return clientSecret;
}
public void setClientSecret(String clientSecret) {
this.clientSecret = clientSecret;
}
public String getAuthorizeUrl() {
return authorizeUrl;
}
public void setAuthorizeUrl(String authorizeUrl) {
this.authorizeUrl = authorizeUrl;
}
public String getAccessTokenUrl() {
return accessTokenUrl;
}
public void setAccessTokenUrl(String accessTokenUrl) {
this.accessTokenUrl = accessTokenUrl;
}
public String getAccessTokenMethod() {
return accessTokenMethod;
}
public void setAccessTokenMethod(String accessTokenMethod) {
this.accessTokenMethod = accessTokenMethod;
}
public String getScope() {
return scope;
}
public void setScope(String scope) {
this.scope = scope;
}
public String getVerifierCode() {
return verifierCode;
}
public void setVerifierCode(String verifierCode) {
this.verifierCode = verifierCode;
}
public String getAccountUrl() {
return accountUrl;
}
public void setAccountUrl(String accountUrl) {
this.accountUrl = accountUrl;
}
public String getAccountId() {
return accountId;
}
public void setAccountId(String accountId) {
this.accountId = accountId;
}
public int getSortOrder() {
return sortOrder;
}
public void setSortOrder(int sortOrder) {
this.sortOrder = sortOrder;
}
public String getCallBack() {
return callBack;
}
public void setCallBack(String callBack) {
this.callBack = callBack;
}
public boolean isUserBind() {
return userBind;
}
@@ -127,17 +87,7 @@ public class SocialSignOnProvider {
public void setUserBind(boolean userBind) {
this.userBind = userBind;
}
@Override
public String toString() {
return "SocialSignOnProvider [provider=" + provider + ", providerName="
+ providerName + ", icon=" + icon + ", clientId=" + clientId
+ ", clientSecret=" + clientSecret + ", authorizeUrl="
+ authorizeUrl + ", accessTokenUrl=" + accessTokenUrl
+ ", accessTokenMethod=" + accessTokenMethod + ", scope="
+ scope + ", verifierCode=" + verifierCode + ", accountUrl="
+ accountUrl + ", accountId=" + accountId + ", sortOrder="
+ sortOrder + ", userBind=" + userBind + "]";
}
}

View File

@@ -3,9 +3,15 @@ package org.maxkey.authn.support.socialsignon.service;
import java.util.HashMap;
import java.util.List;
import org.maxkey.web.WebContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import me.zhyd.oauth.config.AuthConfig;
import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.model.AuthUser;
import me.zhyd.oauth.request.*;
public class SocialSignOnProviderService{
@@ -19,7 +25,62 @@ public class SocialSignOnProviderService{
public SocialSignOnProvider get(String provider){
return socialSignOnProviderMaps.get(provider);
}
public AuthRequest getAuthRequest(String provider) {
AuthRequest authRequest = null;
AuthConfig authConfig = AuthConfig.builder()
.clientId(this.get(provider).getClientId())
.clientSecret(this.get(provider).getClientSecret())
.redirectUri(WebContext.getHttpContextPath()+ "/logon/oauth20/callback/"+provider)
.build();
if(provider.equalsIgnoreCase("WeChatOpen")) {
authRequest = new AuthWeChatOpenRequest(authConfig);
}else if(provider.equalsIgnoreCase("sinaweibo")) {
authRequest = new AuthWeiboRequest(authConfig);
}else if(provider.equalsIgnoreCase("qq")) {
authRequest = new AuthQqRequest(authConfig);
}else if(provider.equalsIgnoreCase("Alipay")) {
authRequest = new AuthAlipayRequest(authConfig);
}else if(provider.equalsIgnoreCase("Twitter")) {
authRequest = new AuthTwitterRequest(authConfig);
}else if(provider.equalsIgnoreCase("google")) {
authRequest = new AuthGoogleRequest(authConfig);
}else if(provider.equalsIgnoreCase("Windows")) {
authRequest = new AuthMicrosoftRequest(authConfig);
}else if(provider.equalsIgnoreCase("Linkedin")) {
authRequest = new AuthLinkedinRequest(authConfig);
}else if(provider.equalsIgnoreCase("DingTalk")) {
authRequest = new AuthDingTalkRequest(authConfig);
}
return authRequest;
}
public String getAccountId(String provider,AuthResponse<?> authResponse) {
if(provider.equalsIgnoreCase("WeChatOpen")) {
return ((AuthUser)authResponse.getData()).getUuid();
}else if(provider.equalsIgnoreCase("sinaweibo")) {
return ((AuthUser)authResponse.getData()).getUuid();
}else if(provider.equalsIgnoreCase("qq")) {
return ((AuthUser)authResponse.getData()).getUuid();
}else if(provider.equalsIgnoreCase("Alipay")) {
return ((AuthUser)authResponse.getData()).getUuid();
}else if(provider.equalsIgnoreCase("Twitter")) {
return ((AuthUser)authResponse.getData()).getUuid();
}else if(provider.equalsIgnoreCase("google")) {
return ((AuthUser)authResponse.getData()).getUuid();
}else if(provider.equalsIgnoreCase("Windows")) {
return ((AuthUser)authResponse.getData()).getUuid();
}else if(provider.equalsIgnoreCase("Linkedin")) {
return ((AuthUser)authResponse.getData()).getUuid();
}else if(provider.equalsIgnoreCase("DingTalk")) {
return ((AuthUser)authResponse.getData()).getUuid();
}
return null;
}
public List<SocialSignOnProvider> getSocialSignOnProviders() {
return socialSignOnProviders;
}