浙政钉(专有钉钉)扫码登录
前言
此文章主要是补充一下目前网上浙政钉(专有钉钉)的扫码登录的问题。
正文
官方文档:
链接: 官方文档.
官方文档里的获取二维码的地址:https://login.dg-work.cn/oauth2/auth.htm?response_type=code&client_id=应用标识&redirect_uri=回调地址&scope=get_user_info&authType=QRCODE
这个是有问题的
原文链接:修改参考.
需要注意的是,以浙政钉获取二维码为例:APP_NAME=应用标识_dingoa,这个_dingoa如果你的应用标识里有了就在写的时候不要再带了
https://login-pro.ding.zj.gov.cn/qrlogin/webAppLogin.htm?APP_NAME=应用标识***_dingoa***&protocolKey=自定义(如:UUID)&protocol=oauth2&BACK_URL=回调地址&scope=get_user_info&state=
下面展示一些 内联代码片
。
下面的是获取前端二维码页面的HTML,可以测试一下,实际开发最好是让前端获取。
/***
* 浙政钉应用标识
*/
private static final String appID="*****_dingoa";
/***
* 浙政钉APPKey
*/
private static final String appKey="*********";
/***
* 浙政钉appSecret
*/
private static final String appSecret ="*********";
/***
* 浙政钉扫码后回调地址(回调地址是你去申请的)
*/
private static final String redirectUrl = "*********";
/***
* 各环境域名/登录域名(这边看情况选,域名在官方文档里找)
*/
private static final String domainName ="openplatform-pro.ding.zj.gov.cn";
/***
* 各环境域名/登录域名(这边看情况选,域名在官方文档里找)
*/
private static final String getUserInfoUrl= "login-pro.ding.zj.gov.cn";
public void toALiDingDing(HttpServletResponse response) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("https://login-pro.ding.zj.gov.cn/qrlogin/webAppLogin.htm?APP_NAME=")
.append(appID)
.append("&protocolKey=UUID&protocol=oauth2&BACK_URL=")
.append(redirectUrl)
.append("&scope=get_user_info&state=");
try {
response.sendRedirect(stringBuilder.toString());
} catch (IOException e1) {
}
}
前端页面在扫码后会得到一个code,我这边是前端返回的pram,所以写了实体类接收,最好是直接返回data
要注意的是code只能用一次,且不是auth_code
获取人员信息需要accessToken和code,获取接口看看官方文档,这边分别是
accessToken:/gettoken.json
人员信息:/rpc/oauth2/getuserinfo_bycode.json
我是直接把获取accessToken和获取人员信息直接写一块了,因为我后面不需要accessToken了
private JSONObject getDingTalk(@RequestBody DingLogin entity){
//获取token
ExecutableClient executableClient =ExecutableClient.getInstance();
executableClient.setAccessKey(appKey);
executableClient.setSecretKey(appSecret);
executableClient.setDomainName(domainName);
executableClient.setProtocal("https");
executableClient.init();
//executableClient要单例,并且使用前要初始化,只需要初始化一次
String api = "/gettoken.json";
GetClient getClient = executableClient.newGetClient(api);
String apiResult = getClient.get();
JSONObject map = JSON.parseObject(apiResult);
//提取返回值中的token
String token = map0.getJSONObject("content").getJSONObject("data").getString("accessToken");
String api = "/rpc/oauth2/getuserinfo_bycode.json";
PostClient postClient = executableClient.newPostClient(api);
postClient.addParameter("access_token", token);
postClient.addParameter("code", entity.getCode());
String apiResult = postClient.post();
JSONObject map = JSON.parseObject(apiResult);
System.out.println(apiResult);
return map;
}
返回结果和官方文档相同,就不展示了。
免登的和上面代码差不多,获取auth_code交给前端获取,要注意似乎是只有手机能干这个。