forked from justauth/JustAuth
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
添加微软中国(世纪华联)第三方登录,新增微软方式登录的redirectUri校验
- Loading branch information
Showing
6 changed files
with
257 additions
and
158 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
181 changes: 181 additions & 0 deletions
181
src/main/java/me/zhyd/oauth/request/AbstractAuthMicrosoftRequest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,181 @@ | ||
package me.zhyd.oauth.request; | ||
|
||
import com.alibaba.fastjson.JSONObject; | ||
import com.xkcoding.http.support.HttpHeader; | ||
import com.xkcoding.http.util.MapUtil; | ||
import me.zhyd.oauth.cache.AuthStateCache; | ||
import me.zhyd.oauth.config.AuthConfig; | ||
import me.zhyd.oauth.config.AuthSource; | ||
import me.zhyd.oauth.enums.AuthResponseStatus; | ||
import me.zhyd.oauth.enums.AuthUserGender; | ||
import me.zhyd.oauth.enums.scope.AuthMicrosoftScope; | ||
import me.zhyd.oauth.exception.AuthException; | ||
import me.zhyd.oauth.model.AuthCallback; | ||
import me.zhyd.oauth.model.AuthResponse; | ||
import me.zhyd.oauth.model.AuthToken; | ||
import me.zhyd.oauth.model.AuthUser; | ||
import me.zhyd.oauth.utils.AuthScopeUtils; | ||
import me.zhyd.oauth.utils.HttpUtils; | ||
import me.zhyd.oauth.utils.UrlBuilder; | ||
|
||
import java.util.Map; | ||
|
||
/** | ||
* 微软登录抽象类,负责处理使用微软国际和微软中国账号登录第三方网站的登录方式 | ||
* | ||
* @author mroldx ([email protected]) | ||
* @since 1.16.4 | ||
*/ | ||
public abstract class AbstractAuthMicrosoftRequest extends AuthDefaultRequest { | ||
|
||
public AbstractAuthMicrosoftRequest(AuthConfig config, AuthSource source) { | ||
super(config, source); | ||
} | ||
|
||
|
||
public AbstractAuthMicrosoftRequest(AuthConfig config, AuthSource source, AuthStateCache authStateCache) { | ||
super(config, source, authStateCache); | ||
} | ||
|
||
@Override | ||
protected AuthToken getAccessToken(AuthCallback authCallback) { | ||
return getToken(accessTokenUrl(authCallback.getCode())); | ||
} | ||
|
||
/** | ||
* 获取token,适用于获取access_token和刷新token | ||
* | ||
* @param accessTokenUrl 实际请求token的地址 | ||
* @return token对象 | ||
*/ | ||
private AuthToken getToken(String accessTokenUrl) { | ||
HttpHeader httpHeader = new HttpHeader(); | ||
|
||
Map<String, String> form = MapUtil.parseStringToMap(accessTokenUrl, false); | ||
|
||
String response = new HttpUtils(config.getHttpConfig()).post(accessTokenUrl, form, httpHeader, false); | ||
JSONObject accessTokenObject = JSONObject.parseObject(response); | ||
|
||
this.checkResponse(accessTokenObject); | ||
|
||
return AuthToken.builder() | ||
.accessToken(accessTokenObject.getString("access_token")) | ||
.expireIn(accessTokenObject.getIntValue("expires_in")) | ||
.scope(accessTokenObject.getString("scope")) | ||
.tokenType(accessTokenObject.getString("token_type")) | ||
.refreshToken(accessTokenObject.getString("refresh_token")) | ||
.build(); | ||
} | ||
|
||
/** | ||
* 检查响应内容是否正确 | ||
* | ||
* @param object 请求响应内容 | ||
*/ | ||
private void checkResponse(JSONObject object) { | ||
if (object.containsKey("error")) { | ||
throw new AuthException(object.getString("error_description")); | ||
} | ||
} | ||
|
||
@Override | ||
protected AuthUser getUserInfo(AuthToken authToken) { | ||
String token = authToken.getAccessToken(); | ||
String tokenType = authToken.getTokenType(); | ||
String jwt = tokenType + " " + token; | ||
|
||
HttpHeader httpHeader = new HttpHeader(); | ||
httpHeader.add("Authorization", jwt); | ||
|
||
String userInfo = new HttpUtils(config.getHttpConfig()).get(userInfoUrl(authToken), null, httpHeader, false); | ||
JSONObject object = JSONObject.parseObject(userInfo); | ||
this.checkResponse(object); | ||
return AuthUser.builder() | ||
.rawUserInfo(object) | ||
.uuid(object.getString("id")) | ||
.username(object.getString("userPrincipalName")) | ||
.nickname(object.getString("displayName")) | ||
.location(object.getString("officeLocation")) | ||
.email(object.getString("mail")) | ||
.gender(AuthUserGender.UNKNOWN) | ||
.token(authToken) | ||
.source(source.toString()) | ||
.build(); | ||
} | ||
|
||
/** | ||
* 刷新access token (续期) | ||
* | ||
* @param authToken 登录成功后返回的Token信息 | ||
* @return AuthResponse | ||
*/ | ||
@Override | ||
public AuthResponse refresh(AuthToken authToken) { | ||
return AuthResponse.builder() | ||
.code(AuthResponseStatus.SUCCESS.getCode()) | ||
.data(getToken(refreshTokenUrl(authToken.getRefreshToken()))) | ||
.build(); | ||
} | ||
|
||
/** | ||
* 返回带{@code state}参数的授权url,授权回调时会带上这个{@code state} | ||
* | ||
* @param state state 验证授权流程的参数,可以防止csrf | ||
* @return 返回授权地址 | ||
* @since 1.9.3 | ||
*/ | ||
@Override | ||
public String authorize(String state) { | ||
return UrlBuilder.fromBaseUrl(super.authorize(state)) | ||
.queryParam("response_mode", "query") | ||
.queryParam("scope", this.getScopes(" ", true, AuthScopeUtils.getDefaultScopes(AuthMicrosoftScope.values()))) | ||
.build(); | ||
} | ||
|
||
/** | ||
* 返回获取accessToken的url | ||
* | ||
* @param code 授权code | ||
* @return 返回获取accessToken的url | ||
*/ | ||
@Override | ||
protected String accessTokenUrl(String code) { | ||
return UrlBuilder.fromBaseUrl(source.accessToken()) | ||
.queryParam("code", code) | ||
.queryParam("client_id", config.getClientId()) | ||
.queryParam("client_secret", config.getClientSecret()) | ||
.queryParam("grant_type", "authorization_code") | ||
.queryParam("scope", this.getScopes(" ", true, AuthScopeUtils.getDefaultScopes(AuthMicrosoftScope.values()))) | ||
.queryParam("redirect_uri", config.getRedirectUri()) | ||
.build(); | ||
} | ||
|
||
/** | ||
* 返回获取userInfo的url | ||
* | ||
* @param authToken 用户授权后的token | ||
* @return 返回获取userInfo的url | ||
*/ | ||
@Override | ||
protected String userInfoUrl(AuthToken authToken) { | ||
return UrlBuilder.fromBaseUrl(source.userInfo()).build(); | ||
} | ||
|
||
/** | ||
* 返回获取accessToken的url | ||
* | ||
* @param refreshToken 用户授权后的token | ||
* @return 返回获取accessToken的url | ||
*/ | ||
@Override | ||
protected String refreshTokenUrl(String refreshToken) { | ||
return UrlBuilder.fromBaseUrl(source.refresh()) | ||
.queryParam("client_id", config.getClientId()) | ||
.queryParam("client_secret", config.getClientSecret()) | ||
.queryParam("refresh_token", refreshToken) | ||
.queryParam("grant_type", "refresh_token") | ||
.queryParam("scope", this.getScopes(" ", true, AuthScopeUtils.getDefaultScopes(AuthMicrosoftScope.values()))) | ||
.queryParam("redirect_uri", config.getRedirectUri()) | ||
.build(); | ||
} | ||
} |
23 changes: 23 additions & 0 deletions
23
src/main/java/me/zhyd/oauth/request/AuthMicrosoftCnRequest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
package me.zhyd.oauth.request; | ||
|
||
import me.zhyd.oauth.cache.AuthStateCache; | ||
import me.zhyd.oauth.config.AuthConfig; | ||
import me.zhyd.oauth.config.AuthDefaultSource; | ||
|
||
/** | ||
* 微软中国登录(世纪华联) | ||
* | ||
* @author mroldx ([email protected]) | ||
* @since 1.16.4 | ||
*/ | ||
public class AuthMicrosoftCnRequest extends AbstractAuthMicrosoftRequest { | ||
|
||
public AuthMicrosoftCnRequest(AuthConfig config) { | ||
super(config, AuthDefaultSource.MICROSOFT_CN); | ||
} | ||
|
||
public AuthMicrosoftCnRequest(AuthConfig config, AuthStateCache authStateCache) { | ||
super(config, AuthDefaultSource.MICROSOFT_CN, authStateCache); | ||
} | ||
|
||
} |
Oops, something went wrong.