文档章节

钉钉扫码登录

xpbob
 xpbob
发布于 2018/11/22 13:50
字数 1071
阅读 100
收藏 0

功能描述

通过钉钉扫码登录,并且获取到登录的用户信息。这样省去自己开发一套登录系统。相对比较方便。

背景描述

现在钉钉主推E应用,官方的案例也是E应用的,其实这个E应用的后台调用的过程和原来的扫码的登录的已经是不一样了。所以要做这个功能需要查旧的api文档。地址如下:https://open-doc.dingtalk.com/dingdocold

为了兼容性,旧的api以及url应该不会再有改动了。所以现在做一套模板上来,大家可以直接复制代码。修改一些配置就可以运行了。

开发流程

这里根据场景稍微做了一些改变。(sdk的下载自己做)
创建扫码传递的检验信息
在钉钉的开发者平台,扫码登录创建一个授权。主要有如下信息

| 需提交字段 | 说明 | | :- | :- | |名称 |授权微应用的名称| |描述 |扫码登录用于,主要是说明,使用的场景| |授权页面LOGO地址 |这个会显示在授权页面的中间页中,以http或https开头| |回调域名 |回调的URL,以http或https开头|

这里需要注意的是回调域名,就是扫码后跳转的页面,这个后面会用到。创建好以后,我们就可以看到appId及appSecret。
创建二维码
这里主要使用的是跳转,比较方便,一个url解决。

https://oapi.dingtalk.com/connect/qrconnect?appid=APPID&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=REDIRECT_URI

就是上面的url。传递的参数有需要修改的几个地方appid就是第一步获取的id。redirect_uri就是第一步写的跳转页面(跳转页面其实就是要获取具体的信息的请求,扫描只是通过验证了,我们还要记录谁登录等信息,获取具体信息再跳转的页面做)。state这里其实主要是用来禁止缓存的,这是一个get请求,需要做这些操作,其余参数不改。
剩余步骤

后面的步骤比较机械化,如果有兴趣就去看官方文档。这些代码是不需要修改的,我已经抽象成了方法。

重点强调

我们需要获取的一些信息,appid,appSecret,回调的url。

代码

@RestController
@RequestMapping("")
public class DingLoginController {

    private static final String URL = "http://127.0.0.1:8080/loginInfo";
    private static final String DINGDING_URL = "https://oapi.dingtalk.com";
    private static final String METHOD_GET = "GET";
    private static final String APP_ID = "";
    private static final String APP_SECRET = "";

    @RequestMapping("/login")
    public void login(HttpServletResponse response) throws IOException {

        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(DINGDING_URL).append("/connect/qrconnect?appid=" + APP_ID + "&")
                .append("response_type=code&scope=snsapi_login&state=")
                .append(System.currentTimeMillis()).append("&redirect_uri=").append(URL);
        response.sendRedirect(stringBuilder.toString());
    }

    @RequestMapping("/loginInfo")
    public JSONResult login(String code) throws ApiException {
        String accessToken = getAccessToken(APP_ID, APP_SECRET);
        String persistentCode = getPersistentCode(accessToken, code);
        JSONObject infos= JSONObject.parseObject(persistentCode);
        String openid = infos.getString("openid");
        String persistent_code = infos.getString("persistent_code");
        String unionid = infos.getString("unionid");
        String snsToken = getSnsToken(accessToken,openid,persistent_code);
        String userInfo = getUserInfo(snsToken);
        return JSONResult.ok(userInfo);


    }


    public String getAccessToken(String appId, String appSecret) throws ApiException {
        OapiSnsGettokenResponse response = null;

        DingTalkClient client = new DefaultDingTalkClient(DINGDING_URL + "/sns/gettoken");
        OapiSnsGettokenRequest request = new OapiSnsGettokenRequest();
        request.setAppid(appId);
        request.setAppsecret(appSecret);
        request.setHttpMethod(METHOD_GET);
        response = client.execute(request);
        String body = response.getBody();
        JSONObject jo = JSON.parseObject(body);
        String errcode = jo.getString("errcode");
        String access_token = null;
        if ("0".equals(errcode)) {
            access_token = (String) jo.get("access_token");
        }
        return access_token;
    }


    public String getPersistentCode(String accessToken, String code) throws ApiException {
        OapiSnsGetPersistentCodeResponse response = null;

        DingTalkClient client = new DefaultDingTalkClient(DINGDING_URL + "/sns/get_persistent_code");
        OapiSnsGetPersistentCodeRequest request = new OapiSnsGetPersistentCodeRequest();
        request.setTmpAuthCode(code);
        response = client.execute(request, accessToken);

        return response.getBody();
    }


    public String getSnsToken(String accessToken,String openId,String persistentCode) throws ApiException {
        OapiSnsGetSnsTokenResponse response = null;
        DingTalkClient client = new DefaultDingTalkClient(DINGDING_URL + "/sns/get_sns_token");
        OapiSnsGetSnsTokenRequest request = new OapiSnsGetSnsTokenRequest();
        request.setPersistentCode(persistentCode);
        request.setOpenid(openId);
        response = client.execute(request, accessToken);
        return response.getSnsToken();
    }


    public String getUserInfo(String snsToken) throws ApiException {
        OapiSnsGetuserinfoResponse response = null;
        DingTalkClient client = new DefaultDingTalkClient(DINGDING_URL + "/sns/getuserinfo");
        OapiSnsGetuserinfoRequest request = new OapiSnsGetuserinfoRequest();
        request.setSnsToken(snsToken);
        request.setHttpMethod(METHOD_GET);
        response = client.execute(request);
        return response.getBody();
    }


}

复制以上代码,然后修改APP_ID ,APP_SECRET ,这里URL = "http://127.0.0.1:8080/loginInfo"是因为我下面的代码写了是访问路径是loginInfo。如果要修改url,记得把下面的代码的url映射也修改掉。

然后就可以发布了,我们访问login就会弹出二维码,用钉钉扫码登录以后,就可以看到返回的扫码的用户信息了。

© 著作权归作者所有

xpbob

xpbob

粉丝 98
博文 98
码字总数 80029
作品 0
高级程序员
私信 提问
O2OA:开源免费智慧办公平台新版本即将发布!七大看点不可错过!

近日,基于AI大数据的智慧办公平台O2OA新版本即将发布,小智机器人、AI智能决策中心、企业数据中心、加强版流程引擎、第三方认证登录,扫码登录、人脸识别登录,全文检索、钉钉、企业微信等亮...

O2OA
2018/11/01
0
0
kooteam —— 轻量级在线协作与文档管理系统

kooteam 是一款轻量级的在线团队协作工具,提供各类文档工具、在线思维导图、在线流程图、项目管理、任务分发,知识库管理等工具。 kooteam 完全打通钉钉功能,同步企业通讯录,实现钉钉扫码...

王练
2018/11/22
0
0
阿里云招募大望京地区开发者啦

大望京地区的开发者们,我们总算要见面了~~ 从今天起,阿里云正式招募望京地区的开发者同学,邀请开发者加入到阿里云技术社群组织里~ 【我们是谁】 我们是阿里云开发者社区“ACE同城会”的组...

focuspython
06/27
0
0
O2OA新版本v20181101173308发布!

项目主页 : https://www.oschina.net/p/o2oa 下载地址 : http://www.o2oa.io v20181101173308更新: 新增功能: 1、企业微信,钉钉,政务钉钉组织同步,待办消息推送,通知消息群发,移动设备...

O2OA
2018/11/02
0
0
Linux Ubuntu 18.04实战安装大数据Hadoop 3.1.2版本 单节点模式

Linux Ubuntu 18.04实战安装大数据Hadoop 3.1.2版本。这里分别选择最新的Ubuntu系统 18.04,以及最新的Hadoop版本3.1.2 Hadoop是开源免费的大数据方案,官方网站https://hadoop.apache.org/,...

徐雷frank
03/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 带这么多钱,你要泡我吗

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :白给?#今日歌曲推荐# 分享Lana Del Rey的单曲《Yayo》: 《Yayo》- Lana Del Rey 手机党少年们想听歌,请使劲儿戳(这里) @红薯...

小小编辑
14分钟前
32
3
搭建tftp服务

前言: 最近整理一些以前的学习笔记。 过去都是存储在本地,此次传到网络留待备用。 TFTP服务: TFTP:Trivial File Transfer Protocol 不重要文件传输协议 主要用来传送小文件,不支持认证和...

迷失De挣扎
今天
4
0
rest 的理解

rest:表现层状态转移。 什么是restful协议?https://en.wikipedia.org/wiki/Representational_state_transfer 使用restful的好处。 Rest是一种体系结构样式,他定义了一组用于创建web服务的...

xiaoxiao_go
今天
5
0
聊聊spring cloud的CachingSpringLoadBalancerFactory

序 本文主要研究一下spring cloud的CachingSpringLoadBalancerFactory CachingSpringLoadBalancerFactory spring-cloud-openfeign-core-2.2.0.M1-sources.jar!/org/springframework/cloud/o......

go4it
昨天
8
0
一篇文章搞定——JDK8中新增的StampedLock

一、StampedLock类简介 StampedLock类,在JDK1.8时引入,是对读写锁ReentrantReadWriteLock的增强,该类提供了一些功能,优化了读锁、写锁的访问,同时使读写锁之间可以互相转换,更细粒度控...

须臾之余
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部