SpringBoot实现专有钉钉扫码登录

原文链接:https://blog.csdn.net/qq_40335247/article/details/118425126

专有钉钉扫码登录
参考专有钉钉开发文档,链接:https://openplatform-portal.dg-work.cn/portal/#/helpdoc?docKey=kfzn&slug=engk1k

一、官方流程


二、具体实现
1.准备工作,下载官方sdk
①.JAVA 语言
新文档对应sdk: zwdd-sdk-java-1.2.0.jar

旧文档对应sdk:zwdd-sdk-java-1.1.9.jar

②.PHP 语言
zwdd-sdk-php.php

③.Python 语言
zwdd-sdk-python.py

注:

遇到 org.joda.time.ReadableInstant 报错,请在 pom.xml 中添加如下内容

<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10</version>
</dependency>
1
2
3
4
5
如遇到 fastjson 相关报错,请在 pom.xml 中添加如下内容

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
1
2
3
4
5
2.准备工作,获取appKey和appSecrect
查看应用详情

登录开发者后台,点击“应用管理”-找到应用并点击详情,可以查看 AppKey 和 AppSecret 。

 

权限管理

申请API授

在我的应用页面,点击左侧接口权限,进入权限管理页面,开启应用功能所需要的权限。请仅仅选择需要的权限进行授权。

 

3.获取access_token
这里的ExecutableClient和GetClient,都是依赖第一步的sdk(mvn仓库也没有,协同开发时记得带上)

//调用dingding api
//private JSONObject getMsgByApi(String apiMethod,Map paramMap){
private JSONObject getMsgByApi(){
ExecutableClient executableClient =ExecutableClient.getInstance();
executableClient.setAccessKey(appKey); //appKey<1>
executableClient.setSecretKey(appSecret); //appSecret<2>
executableClient.setDomainName(domainName); //domainName<3>
executableClient.setProtocal("https");
executableClient.init();
//executableClient要单例,并且使用前要初始化,只需要初始化一次

String api = "/gettoken.json";
GetClient getClient = executableClient.newGetClient(api);
//设置参数
getClient.addParameter("appkey", appkey); //appKey<1>
getClient.addParameter("appsecret", appsecret); //appSecret<2>
//调用API
String apiResult = getClient.get();

JSONObject map = JSON.parseObject(apiResult);
System.out.println(apiResult);
return map;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
其中<1>、<2>参数都是来自第二步,而<3>参照下表填入对应接口环境域名

环境 开放平台域名(调接口使用) 登录域名(构造登录页面)
Saas openplatform.dg-work.cn login.dg-work.cn
浙政钉 openplatform-pro.ding.zj.gov.cn(域名对应政务外网IP:59.202.52.1) login-pro.ding.zj.gov.cn(域名对应政务外网IP:59.202.52.68)
完整接口地址:https://环境域名/+接口名 例如:https://openplatform.dg-work.cn/gettoken.json

返回的apiResult结果

{
"success":true,
"content":{
"data":{
"accessToken":"c139fe44362f41b6b84862ec82ab84d9", //这就是咱们要的
"expiresIn":"7200"
},
"requestId":"df04428415724925400701038d663a",
"responseMessage":"OK",
"responseCode":"0",
"success": true
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
4.获取免登授权码(若是前后端分离,可以交给前端来做)
构造扫码登录页面(官方)
Web系统可以通过两种方式实现政务钉钉扫码登录。

方式一 使用政务钉钉提供的扫码登录页面
在企业Web系统里,用户点击使用钉钉扫码登录,第三方Web系统跳转到如下地址:

https://login.dg-work.cn/oauth2/auth.htm?response_type=code&client_id=应用标识&redirect_uri=回调地址&scope=get_user_info&authType=QRCODE
1
URL中的client_id和redirect_uri两个参数的值填入第三方web系统的应用标识和回调地址。政务钉钉用户扫码登录并确认后,会302到你指定的redirect_uri,并向url参数中追加临时授权码code(此code非authcode)及state两个参数。

注意事项:

参数"redirect_uri=回调地址"涉及的域名,需和创建扫码登录应用授权时填写的回调域名一致,否则会提示无权限访问。

生成二维码大小固定为200*200px,不支持修改。


方式二 支持网站将政务钉钉登录二维码内嵌到自己页面中
步骤1:在****页面中通过iframe嵌入页面

通过方式一构造的地址增加embedMode=true的参数

https://login.dg-work.cn/oauth2/auth.htm?response_type=code&client_id=应用标识&redirect_uri=回调地址&scope=get_user_info&authType=QRCODE&embedMode=true
1
步骤2:扫码成功后需要在页面中监听扫码结果

<script type="application/javascript">
window.addEventListener('message', function(event) {
// 这里的event.data 就是登录成功的信息
// 数据格式:{ "code": "aaaa", "state": "bbbb" }
alert(JSON.stringify(event.data));
});
</script>
1
2
3
4
5
6
7
注意:生成二维码大小固定为200*200px,不支持修改。

 

参考方式一实现(clint_id就是所建应用的应用标识)
@Override
public void toALiDingDing(HttpServletResponse response) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("https://login.dg-work.cn/oauth2/auth.htm?response_type=code&client_id=")
.append(appID)
.append("&scope=get_user_info&authType=QRCODE")
.append("&redirect_uri=")
.append(redirectUrl);
try {
response.sendRedirect(stringBuilder.toString());
} catch (IOException e1) {

}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
5.获取用户详情
通过前面几个步骤,我们已经拿到了最关键的两个东西access_token调⽤接⼝凭证、code免登授权码

因此,同理,我们在调用接口如下:

//调用dingding api
//private JSONObject getMsgByApi(String apiMethod,Map paramMap){
private JSONObject getMsgByApi(){
ExecutableClient executableClient =ExecutableClient.getInstance();
executableClient.setAccessKey(appKey);
executableClient.setSecretKey(appSecret);
executableClient.setDomainName(domainName);
executableClient.setProtocal("https");
executableClient.init();
//executableClient要单例,并且使用前要初始化,只需要初始化一次

String api = "/rpc/oauth2/dingtalk_app_user.json";
GetClient getClient = executableClient.newGetClient(api);
//设置参数
getClient.addParameter("access_token", "xxxxx");
getClient.addParameter("code", "xxxxx");
//调用API
String apiResult = getClient.get();

JSONObject map = JSON.parseObject(apiResult);
System.out.println(apiResult);
return map;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
返回apiResult如下(以实际返回为主):

{
"success":true,
"content":{
"data":{
"accountId":100135,
"lastName":"俊锋",
"clientId":"mozi-buc-sso",
"realmId":12371,
"tenantName":"租户2",
"realmName":"租户2",
"namespace":"local",
"tenantId":12371,
"nickNameCn":"俊锋",
"tenantUserId":"12371$100135",
"account":"admin2"
},
"success":true,
"responseMessage":"成功",
"responseCode":"0"
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
错误码
responseCode responseMessage
240111 code失效或不存在
240133 应用accessToken失效或不存在
6.走自己的登录业务吧

posted @ 2022-08-08 08:26  枫树湾河桥  阅读(1701)  评论(0编辑  收藏  举报
Live2D