From df87904f33b7a2d678e5ff47539a167aca5a8aad Mon Sep 17 00:00:00 2001
From: zhanghua <314079846@qq.com>
Date: 星期一, 04 十一月 2024 23:39:51 +0800
Subject: [PATCH] 钉钉登录bug修改

---
 ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java |  111 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 106 insertions(+), 5 deletions(-)

diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
index a1bf9ba..de50a6a 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
@@ -3,7 +3,21 @@
 import cn.dev33.satoken.annotation.SaIgnore;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSON;
+import com.aliyun.dingtalkcontact_1_0.models.GetUserHeaders;
+import com.aliyun.dingtalkcontact_1_0.models.GetUserResponseBody;
+import com.aliyun.dingtalkoauth2_1_0.models.GetUserTokenRequest;
+import com.aliyun.dingtalkoauth2_1_0.models.GetUserTokenResponse;
+import com.aliyun.teautil.models.RuntimeOptions;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.dingtalk.api.DefaultDingTalkClient;
+import com.dingtalk.api.DingTalkClient;
+import com.dingtalk.api.request.*;
+import com.dingtalk.api.response.OapiUserGetbyunionidResponse;
+import com.dingtalk.api.response.OapiUserGetuserinfoResponse;
+import com.dingtalk.api.response.OapiV2UserGetResponse;
+import com.dingtalk.api.response.OapiV2UserGetuserinfoResponse;
+import com.taobao.api.ApiException;
 import jakarta.servlet.http.HttpServletRequest;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -26,7 +40,6 @@
 import org.dromara.system.domain.SysClient;
 import org.dromara.system.domain.SysUser;
 import org.dromara.system.domain.bo.SysTenantBo;
-import org.dromara.system.domain.bo.SysUserBo;
 import org.dromara.system.domain.vo.SysTenantVo;
 import org.dromara.system.mapper.SysUserMapper;
 import org.dromara.system.service.*;
@@ -39,6 +52,7 @@
 import org.dromara.web.service.SysRegisterService;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import com.aliyun.teaopenapi.models.Config;
 
 import java.net.URL;
 import java.util.List;
@@ -194,8 +208,8 @@
      * 鑷姩娉ㄥ唽骞剁櫥褰�
      */
 //    @SaCheckPermission("system:user:auto")
-    @PutMapping(value = "auto")
-    public R<LoginVo> auto(@Validated @RequestBody RegisterBody user) {
+    @GetMapping(value = "auto")
+    public R<LoginVo> auto(RegisterBody user) {
         AutoLoginUtil.padding(user);
         String clientId = "e5cd7e4891bf95d1d19206ce24a7b32e";
         //pc
@@ -205,13 +219,100 @@
             .eq(SysUser::getUserName, user.getUsername())
             .eq(SysUser::getStatus, "0")
             .eq(SysUser::getDelFlag, "0"));
-        if(!exists){
+        if (!exists) {
             registerService.register(user);
         }
 
-        LoginBody loginBody = AutoLoginUtil.create(user,clientId);
+        LoginBody loginBody = AutoLoginUtil.create(user, clientId);
 //         鐧诲綍
         return R.ok(IAuthStrategy.login(loginBody, client));
     }
 
+
+    public static com.aliyun.dingtalkoauth2_1_0.Client authClient() throws Exception {
+        Config config = new Config();
+        config.protocol = "https";
+        config.regionId = "central";
+        return new com.aliyun.dingtalkoauth2_1_0.Client(config);
+    }
+
+    /**
+     * 鑾峰彇鐢ㄦ埛token
+     *
+     * @param authCode
+     * @return
+     * @throws Exception
+     */
+    //鎺ュ彛鍦板潃锛氭敞鎰�/auth涓庨拤閽夌櫥褰曚笌鍒嗕韩鐨勫洖璋冨煙鍚嶅湴鍧�涓�鑷�
+    @RequestMapping(value = "/dingdingLogin", method = RequestMethod.GET)
+    public String getAccessToken(@RequestParam(value = "authCode") String authCode, @RequestParam(value = "code") String code) throws Exception {
+
+        com.aliyun.dingtalkoauth2_1_0.Client client = authClient();
+        GetUserTokenRequest getUserTokenRequest = new GetUserTokenRequest()
+
+            //搴旂敤鍩虹淇℃伅-搴旂敤淇℃伅鐨凙ppKey,璇峰姟蹇呮浛鎹负寮�鍙戠殑搴旂敤AppKey
+            .setClientId("dingl5dxahaj3uzfug66")
+
+            //搴旂敤鍩虹淇℃伅-搴旂敤淇℃伅鐨凙ppSecret锛�,璇峰姟蹇呮浛鎹负寮�鍙戠殑搴旂敤AppSecret
+            .setClientSecret("AGDu7NfzkverlMXq8CUDiy6EXx5jSL4v2p-Odz1mpXV5e4_K3kB1Acat0RftzBXC")
+            .setCode(authCode)
+            .setGrantType("authorization_code");
+        GetUserTokenResponse getUserTokenResponse = client.getUserToken(getUserTokenRequest);
+        System.out.println(getUserTokenResponse.getBody());
+        if ("dingf4816bf92d85d84435c2f4657eb6378f".equals(getUserTokenResponse.getBody().getCorpId())) {
+
+            //鑾峰彇鐢ㄦ埛涓汉token
+            String accessToken = getUserTokenResponse.getBody().getAccessToken();
+            GetUserResponseBody userResponseBody = getUserinfoNoId(accessToken);
+            return JSON.toJSONString(userResponseBody);
+        }
+
+
+        return "";
+    }
+
+    public static com.aliyun.dingtalkcontact_1_0.Client contactClient() throws Exception {
+        Config config = new Config();
+        config.protocol = "https";
+        config.regionId = "central";
+        return new com.aliyun.dingtalkcontact_1_0.Client(config);
+    }
+
+    /**
+     * 鑾峰彇鐢ㄦ埛涓汉淇℃伅
+     *
+     * @param accessToken
+     * @return
+     * @throws Exception
+     */
+    public GetUserResponseBody getUserinfoNoId(String accessToken) throws Exception {
+        com.aliyun.dingtalkcontact_1_0.Client client = contactClient();
+        GetUserHeaders getUserHeaders = new GetUserHeaders();
+        getUserHeaders.xAcsDingtalkAccessToken = accessToken;
+        //鑾峰彇鐢ㄦ埛涓汉淇℃伅锛屽闇�鑾峰彇褰撳墠鎺堟潈浜虹殑淇℃伅锛寀nionId鍙傛暟蹇呴』浼爉e
+        GetUserResponseBody userResponse = client.getUserWithOptions("me", getUserHeaders, new RuntimeOptions()).getBody();
+
+        return userResponse;
+    }
+
+    public String getUserId(String accessToken, String unionId) throws ApiException {
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/user/getbyunionid");
+        OapiUserGetbyunionidRequest req = new OapiUserGetbyunionidRequest();
+        req.setUnionid(unionId);
+        OapiUserGetbyunionidResponse rsp = client.execute(req, accessToken);
+        if (rsp.isSuccess()) {
+            return rsp.getResult().getUserid();
+        }
+        return null;
+    }
+
+    public OapiV2UserGetResponse.UserGetResponse getUserinfo(String accessToken, String userId) throws Exception {
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
+        OapiV2UserGetRequest req = new OapiV2UserGetRequest();
+        req.setUserid(userId);
+        req.setLanguage("en_US");
+        OapiV2UserGetResponse rsp = client.execute(req, accessToken);
+        return rsp.getResult();
+    }
+
 }

--
Gitblit v1.8.0