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
以上就是钉钉扫码登录的全部内容,有问题请留言。