From 6df7b34b4a914b83a60083c9dc08e9468b96762d Mon Sep 17 00:00:00 2001
From: 疯狂的狮子Li <15040126243@163.com>
Date: 星期四, 13 七月 2023 15:37:54 +0800
Subject: [PATCH] add 新增 对接 maxkey 三方单点登录

---
 ruoyi-admin/src/main/resources/application-prod.yml                                                                         |    6 ++
 ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeyRequest.java                      |   80 ++++++++++++++++++++++++++
 ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java                             |    2 
 ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeySource.java                       |   52 +++++++++++++++++
 ruoyi-common/ruoyi-common-social/pom.xml                                                                                    |    5 +
 ruoyi-admin/src/main/resources/application-dev.yml                                                                          |    6 ++
 ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialLoginConfigProperties.java |    5 +
 7 files changed, 156 insertions(+), 0 deletions(-)

diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml
index 122a653..fbd134f 100644
--- a/ruoyi-admin/src/main/resources/application-dev.yml
+++ b/ruoyi-admin/src/main/resources/application-dev.yml
@@ -184,6 +184,12 @@
   enabled: true
   address: http://localhost:80
   type:
+    maxkey:
+      # maxkey 鏈嶅姟鍣ㄥ湴鍧�
+      server-url: http://localhost:8080
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=maxkey
     qq:
       client-id: 10**********6
       client-secret: 1f7d08**********5b7**********29e
diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml
index 2d62c4f..5cbe552 100644
--- a/ruoyi-admin/src/main/resources/application-prod.yml
+++ b/ruoyi-admin/src/main/resources/application-prod.yml
@@ -186,6 +186,12 @@
   enabled: true
   address: http://localhost:80
   type:
+    maxkey:
+      # maxkey 鏈嶅姟鍣ㄥ湴鍧�
+      server-url: http://localhost:8080
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=maxkey
     qq:
       client-id: 10**********6
       client-secret: 1f7d08**********5b7**********29e
diff --git a/ruoyi-common/ruoyi-common-social/pom.xml b/ruoyi-common/ruoyi-common-social/pom.xml
index 77135a6..9f9a965 100644
--- a/ruoyi-common/ruoyi-common-social/pom.xml
+++ b/ruoyi-common/ruoyi-common-social/pom.xml
@@ -23,6 +23,11 @@
 
         <dependency>
             <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-json</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
             <artifactId>ruoyi-common-redis</artifactId>
         </dependency>
     </dependencies>
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialLoginConfigProperties.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialLoginConfigProperties.java
index 69d453c..76be234 100644
--- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialLoginConfigProperties.java
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialLoginConfigProperties.java
@@ -60,4 +60,9 @@
      */
     private String clientOsType;
 
+    /**
+     * maxkey 鏈嶅姟鍣ㄥ湴鍧�
+     */
+    private String serverUrl;
+
 }
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeyRequest.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeyRequest.java
new file mode 100644
index 0000000..e8df79e
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeyRequest.java
@@ -0,0 +1,80 @@
+package org.dromara.common.social.maxkey;
+
+import cn.hutool.core.lang.Dict;
+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 org.dromara.common.core.utils.SpringUtils;
+import org.dromara.common.json.utils.JsonUtils;
+
+/**
+ *  @author 闀挎槬鍙摜 2023骞�03鏈�26鏃�
+ */
+public class AuthMaxKeyRequest extends AuthDefaultRequest {
+
+    public static final String SERVER_URL = SpringUtils.getProperty("justauth.type.maxkey.server-url");
+
+    /**
+     * 璁惧畾褰掑睘鍩�
+     */
+    public AuthMaxKeyRequest(AuthConfig config) {
+        super(config, AuthMaxKeySource.MAXKEY);
+    }
+
+    public AuthMaxKeyRequest(AuthConfig config, AuthStateCache authStateCache) {
+        super(config, AuthMaxKeySource.MAXKEY, authStateCache);
+    }
+
+    @Override
+    protected AuthToken getAccessToken(AuthCallback authCallback) {
+        String body = doPostAuthorizationCode(authCallback.getCode());
+        Dict object = JsonUtils.parseMap(body);
+        // oauth/token 楠岃瘉寮傚父
+        if (object.containsKey("error")) {
+            throw new AuthException(object.getStr("error_description"));
+        }
+        // user 楠岃瘉寮傚父
+        if (object.containsKey("message")) {
+            throw new AuthException(object.getStr("message"));
+        }
+        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);
+        // oauth/token 楠岃瘉寮傚父
+        if (object.containsKey("error")) {
+            throw new AuthException(object.getStr("error_description"));
+        }
+        // user 楠岃瘉寮傚父
+        if (object.containsKey("message")) {
+            throw new AuthException(object.getStr("message"));
+        }
+        return AuthUser.builder()
+            .uuid(object.getStr("id"))
+            .username(object.getStr("username"))
+            .nickname(object.getStr("name"))
+            .avatar(object.getStr("avatar_url"))
+            .blog(object.getStr("web_url"))
+            .company(object.getStr("organization"))
+            .location(object.getStr("location"))
+            .email(object.getStr("email"))
+            .remark(object.getStr("bio"))
+            .token(authToken)
+            .source(source.toString())
+            .build();
+    }
+
+}
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeySource.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeySource.java
new file mode 100644
index 0000000..1ff57f7
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeySource.java
@@ -0,0 +1,52 @@
+package org.dromara.common.social.maxkey;
+
+import me.zhyd.oauth.config.AuthSource;
+import me.zhyd.oauth.request.AuthDefaultRequest;
+
+/**
+ * Oauth2 榛樿鎺ュ彛璇存槑
+ *
+ * @author 闀挎槬鍙摜 2023骞�03鏈�26鏃�
+ *
+ */
+public enum AuthMaxKeySource implements AuthSource {
+
+    /**
+     * 鑷繁鎼缓鐨� maxkey 绉佹湇
+     */
+    MAXKEY {
+
+        /**
+         * 鎺堟潈鐨刟pi
+         */
+        @Override
+        public String authorize() {
+            return AuthMaxKeyRequest.SERVER_URL + "/sign/authz/oauth/v20/authorize";
+        }
+
+        /**
+         * 鑾峰彇accessToken鐨刟pi
+         */
+        @Override
+        public String accessToken() {
+            return AuthMaxKeyRequest.SERVER_URL + "/sign/authz/oauth/v20/token";
+        }
+
+        /**
+         * 鑾峰彇鐢ㄦ埛淇℃伅鐨刟pi
+         */
+        @Override
+        public String userInfo() {
+            return AuthMaxKeyRequest.SERVER_URL + "/sign/api/oauth/v20/me";
+        }
+
+        /**
+         * 骞冲彴瀵瑰簲鐨� AuthRequest 瀹炵幇绫伙紝蹇呴』缁ф壙鑷� {@link AuthDefaultRequest}
+         */
+        @Override
+        public Class<? extends AuthDefaultRequest> getTargetClass() {
+            return AuthMaxKeyRequest.class;
+        }
+
+    }
+}
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java
index 7d9f218..b3e801c 100644
--- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java
@@ -11,6 +11,7 @@
 import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.social.config.properties.SocialLoginConfigProperties;
 import org.dromara.common.social.config.properties.SocialProperties;
+import org.dromara.common.social.maxkey.AuthMaxKeyRequest;
 
 /**
  * 璁よ瘉鎺堟潈宸ュ叿绫�
@@ -61,6 +62,7 @@
             case "gitlab" -> new AuthGitlabRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret).redirectUri(redirectUri).build(), STATE_CACHE);
             case "wechat_mp" -> new AuthWeChatMpRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret).redirectUri(redirectUri).build(), STATE_CACHE);
             case "aliyun" -> new AuthAliyunRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret).redirectUri(redirectUri).build(), STATE_CACHE);
+            case "maxkey" -> new AuthMaxKeyRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret).redirectUri(redirectUri).build(), STATE_CACHE);
             default -> throw new AuthException("鏈幏鍙栧埌鏈夋晥鐨凙uth閰嶇疆");
         };
     }

--
Gitblit v1.9.3