概述

本文将介绍一些钉钉的自动登录集成方法,自动登录包括 小程序的自动登录和H5的自动登录。不过他们的思路都是类似的。

主要流程是:

  1. 根据API获取上下文的授权码。
  2. 根据授权码获取当前登录的用户信息。
  3. 利用这个用户信息和系统绑定实现自动登录。

实现方法

H5免登录

1.获取授权码

dd.ready(function() {
    dd.runtime.permission.requestAuthCode({
        corpId: corpId, // 企业id
        onSuccess: function (info) {
                  code = info.code // 通过该免登授权码可以获取用户身份
        }});
});

传入企业ID,返回免登录授权码。

2.获取token

根据应用的 appkey 和 secret 获取token。

DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
OapiGettokenRequest request = new OapiGettokenRequest();

request.setAppkey(appKey);
request.setAppsecret(secret);
request.setHttpMethod("GET");
OapiGettokenResponse response = client.execute(request);
accessToken=response.getAccessToken();

3.根据授权码 获取当前用户ID.

@RequestMapping(value = "/login", method = RequestMethod.POST)
 public ServiceResult<Map<String, Object>> login (@RequestParam("authCode") String requestAuthCode) {

  // 获取access_token,注意正式代码要有异常流处理
  String access_token= AccessTokenUtil.getToken();
  // 获取用户信息
  DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/getuserinfo");
  OapiUserGetuserinfoRequest request = new OapiUserGetuserinfoRequest();
  request.setCode(requestAuthCode);
  request.setHttpMethod("GET");
  OapiUserGetuserinfoResponse response;
  try {
   response = client.execute(request, access_token);
  } catch (ApiException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   return null;
  }
  // 查询得到当前用户的userId    
  // 获得到userId之后应用应该处理应用自身的登录会话管理(session),避免后续的业务交互(前端到应用服务端)每次都要重新获取用户身份,提升用户体验
  String userId = response.getUserid();
  Map<String, Object> returnMap = new HashMap<String,Object>();
  returnMap.put("userId", userId);
  return ServiceResult.success(returnMap);
 }
}

小程序免登录

1.获取授权码

dd.getAuthCode({
    success:function(res){
        /*{
            authCode: 'hYLK98jkf0m' //string authCode
        }*/
    },
    fail:function(err){
    }
});

后续的步骤同上。

文档更新时间: 2021-03-29 11:53   作者:zyg