ruoyi-admin/src/main/resources/application-dev.yml
@@ -189,6 +189,13 @@ client-id: 876892492581044224 client-secret: x1Y5MTMwNzIwMjMxNTM4NDc3Mzche8 redirect-uri: ${justauth.address}/social-callback?source=maxkey topiam: # topiam æå¡å¨å°å server-url: http://127.0.0.1:1989/api/v1/authorize/y0q************spq***********8ol client-id: 449c4*********937************759 client-secret: ac7***********1e0************28d redirect-uri: ${justauth.address}/social-callback?source=topiam scopes: [openid, email, phone, profile] qq: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialLoginConfigProperties.java
@@ -2,6 +2,8 @@ import lombok.Data; import java.util.List; /** * 社交ç»å½é ç½® * @@ -65,4 +67,9 @@ */ private String serverUrl; /** * 请æ±èå´ */ private List<String> scopes; } ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/topiam/AuthTopIamRequest.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,100 @@ package org.dromara.common.social.topiam; import cn.hutool.core.lang.Dict; import cn.hutool.core.util.StrUtil; import com.xkcoding.http.support.HttpHeader; import lombok.extern.slf4j.Slf4j; import me.zhyd.oauth.cache.AuthStateCache; import me.zhyd.oauth.config.AuthConfig; import me.zhyd.oauth.exception.AuthException; import me.zhyd.oauth.model.AuthCallback; import me.zhyd.oauth.model.AuthToken; import me.zhyd.oauth.model.AuthUser; import me.zhyd.oauth.request.AuthDefaultRequest; import me.zhyd.oauth.utils.HttpUtils; import me.zhyd.oauth.utils.UrlBuilder; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.json.utils.JsonUtils; import static org.dromara.common.social.topiam.AuthTopiamSource.TOPIAM; /** * TopIAM 认è¯è¯·æ± * * @author xlsea * @since 2024-01-06 */ @Slf4j public class AuthTopIamRequest extends AuthDefaultRequest { public static final String SERVER_URL = SpringUtils.getProperty("justauth.type.topiam.server-url"); /** * 设å®å½å±å */ public AuthTopIamRequest(AuthConfig config) { super(config, TOPIAM); } public AuthTopIamRequest(AuthConfig config, AuthStateCache authStateCache) { super(config, TOPIAM, authStateCache); } @Override protected AuthToken getAccessToken(AuthCallback authCallback) { String body = doPostAuthorizationCode(authCallback.getCode()); Dict object = JsonUtils.parseMap(body); checkResponse(object); return AuthToken.builder() .accessToken(object.getStr("access_token")) .refreshToken(object.getStr("refresh_token")) .idToken(object.getStr("id_token")) .tokenType(object.getStr("token_type")) .scope(object.getStr("scope")) .build(); } @Override protected AuthUser getUserInfo(AuthToken authToken) { String body = doGetUserInfo(authToken); Dict object = JsonUtils.parseMap(body); checkResponse(object); return AuthUser.builder() .uuid(object.getStr("sub")) .username(object.getStr("preferred_username")) .nickname(object.getStr("nickname")) .avatar(object.getStr("picture")) .email(object.getStr("email")) .token(authToken) .source(source.toString()) .build(); } @Override protected String doGetUserInfo(AuthToken authToken) { return new HttpUtils(config.getHttpConfig()).get(source.userInfo(), null, new HttpHeader() .add("Content-Type", "application/json") .add("Authorization", "Bearer " + authToken.getAccessToken()), false).getBody(); } @Override public String authorize(String state) { return UrlBuilder.fromBaseUrl(super.authorize(state)) .queryParam("scope", StrUtil.join("%20", config.getScopes())) .build(); } public static void checkResponse(Dict object) { // oauth/token éªè¯å¼å¸¸ if (object.containsKey("error")) { throw new AuthException(object.getStr("error_description")); } // user éªè¯å¼å¸¸ if (object.containsKey("message")) { throw new AuthException(object.getStr("message")); } } } ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/topiam/AuthTopiamSource.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,51 @@ package org.dromara.common.social.topiam; import me.zhyd.oauth.config.AuthSource; import me.zhyd.oauth.request.AuthDefaultRequest; /** * Oauth2 é»è®¤æ¥å£è¯´æ * * @author xlsea * @since 2024-01-06 */ public enum AuthTopiamSource implements AuthSource { /** * æµè¯ */ TOPIAM { /** * ææçapi */ @Override public String authorize() { return AuthTopIamRequest.SERVER_URL + "/oauth2/auth"; } /** * è·åaccessTokençapi */ @Override public String accessToken() { return AuthTopIamRequest.SERVER_URL + "/oauth2/token"; } /** * è·åç¨æ·ä¿¡æ¯çapi */ @Override public String userInfo() { return AuthTopIamRequest.SERVER_URL + "/oauth2/userinfo"; } /** * å¹³å°å¯¹åºç AuthRequest å®ç°ç±»ï¼å¿ 须继æ¿èª {@link AuthDefaultRequest} */ @Override public Class<? extends AuthDefaultRequest> getTargetClass() { return AuthTopIamRequest.class; } } } ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java
@@ -11,6 +11,7 @@ import org.dromara.common.social.config.properties.SocialLoginConfigProperties; import org.dromara.common.social.config.properties.SocialProperties; import org.dromara.common.social.maxkey.AuthMaxKeyRequest; import org.dromara.common.social.topiam.AuthTopIamRequest; /** * è®¤è¯ææå·¥å ·ç±» @@ -38,7 +39,8 @@ AuthConfig.AuthConfigBuilder builder = AuthConfig.builder() .clientId(obj.getClientId()) .clientSecret(obj.getClientSecret()) .redirectUri(obj.getRedirectUri()); .redirectUri(obj.getRedirectUri()) .scopes(obj.getScopes()); return switch (source.toLowerCase()) { case "dingtalk" -> new AuthDingTalkRequest(builder.build(), STATE_CACHE); case "baidu" -> new AuthBaiduRequest(builder.build(), STATE_CACHE); @@ -63,6 +65,7 @@ case "wechat_mp" -> new AuthWeChatMpRequest(builder.build(), STATE_CACHE); case "aliyun" -> new AuthAliyunRequest(builder.build(), STATE_CACHE); case "maxkey" -> new AuthMaxKeyRequest(builder.build(), STATE_CACHE); case "topiam" -> new AuthTopIamRequest(builder.build(), STATE_CACHE); default -> throw new AuthException("æªè·åå°ææçAuthé ç½®"); }; } script/sql/ry_vue_5.X.sql
@@ -21,7 +21,7 @@ union_id varchar(255) default null comment 'ç¨æ·ç unionid', scope varchar(255) default null comment 'æäºçæéï¼é¨åå¹³å°å¯è½æ²¡æ', token_type varchar(255) default null comment '个å«å¹³å°çææä¿¡æ¯ï¼é¨åå¹³å°å¯è½æ²¡æ', id_token varchar(255) default null comment 'id tokenï¼é¨åå¹³å°å¯è½æ²¡æ', id_token text default null comment 'id tokenï¼é¨åå¹³å°å¯è½æ²¡æ', mac_algorithm varchar(255) default null comment 'å°ç±³å¹³å°ç¨æ·çé另屿§ï¼é¨åå¹³å°å¯è½æ²¡æ', mac_key varchar(255) default null comment 'å°ç±³å¹³å°ç¨æ·çé另屿§ï¼é¨åå¹³å°å¯è½æ²¡æ', code varchar(255) default null comment 'ç¨æ·çææcodeï¼é¨åå¹³å°å¯è½æ²¡æ',