SpringBoot接入钉钉扫码登录

SpringBoot接入钉钉扫码登录



前言


一、思路说明

1、获取钉钉二维码界面
2、用户扫描二维码成功后进入回调方法
3、回调方法获取accessToken
4、回调方法根据code和accessToken获取用户信息
参考官方文档:官方文档

二、准备工作

需要先登录自己的钉钉账号,创建应用,并设置权限,配置回调地址。

1.创建应用

在这里插入图片描述
在这里插入图片描述

2.应用配置

在这里插入图片描述
权限功能,选择全部员工,申请这两个权限,其他权限根据自己需要添加
在这里插入图片描述
设置回调地址
在这里插入图片描述

回调地址的话,有服务器的直接用自己的服务器就行,没有的就本地虚拟机+内外穿透。
这里采用本地虚拟机演示。

内外穿透这里用的花生壳免费的、windows要下载对应的程序

穿透配置
在这里插入图片描述

配置成功
在这里插入图片描述

三、代码实现

依赖:

        <!-- dingtalk -->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>dingtalk</artifactId>
            <version>2.0.25</version>
        </dependency>
        <!-- hutool-all -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.20</version>
        </dependency>
        <!-- fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.6</version>
        </dependency>

1.跳转登录

public String genAuthorize() {
        HashMap<String, Object> map = new HashMap<>();
        map.put("redirect_uri", dingTalkAppConfig.getRedirectUri());
        map.put("response_type", dingTalkAppConfig.getResponseType());
        map.put("client_id", dingTalkAppConfig.getAppKey());
        map.put("scope", dingTalkAppConfig.getScope());
        map.put("prompt", dingTalkAppConfig.getPrompt());
        log.info("请求参数为:" + JSONUtil.toJsonStr(map));
        String response = HttpUtil.toParams(map);
        log.info("相应参数为:" + JSONUtil.toJsonStr(response));
        return response;
    }

2.登录回调

 public GetUserTokenResponseBody getAccessToken(String authCode) throws Exception {
        com.aliyun.dingtalkoauth2_1_0.Client client = dingtalkoauth2_1_0();
        GetUserTokenRequest getUserTokenRequest = new GetUserTokenRequest()
                .setClientId(dingTalkAppConfig.getAppKey())
                .setClientSecret(dingTalkAppConfig.getAppSecret())
                .setCode(authCode)
                .setGrantType(dingTalkAppConfig.getGrantType());
        try {
            GetUserTokenResponse userToken = client.getUserToken(getUserTokenRequest);
            log.info("userToken" + JSONObject.toJSONString(userToken));
            return userToken.getBody();
        } catch (TeaException err) {
            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                // err 中含有 code 和 message 属性,可帮助开发定位问题
            }

        } catch (Exception _err) {
            TeaException err = new TeaException(_err.getMessage(), _err);
            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                // err 中含有 code 和 message 属性,可帮助开发定位问题
            }

        }
        return null;
    }

四、实现效果

未登录状态需要扫码登录
在这里插入图片描述

已登录的直接登录

在这里插入图片描述

本地日志
在这里插入图片描述

五、系统结合

在用户登录之后,我们可以拿到手机号,openid。
我们可以根据openid和本地用户体系建立起联系,存到一张中间表。
在用户扫码登录成功的时候,判断当前用户是否是新用户。
如果是新用户则直接在本地创建一个账号并维护对应的关联关系,然后进入业务系统对应的功能模块。
如果不是新用户则直接进入对应的功能模块。
并且在登录的时候我们可以再url中携带自己想要的自定义参数,需要的可以自己去研究。

总结

代码已经上传到gitee需要自取:https://gitee.com/xyzissj/dingtalk-scanning-login.git

以上就是钉钉扫码登录的全部内容,有问题请留言。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值