当前位置:   article > 正文

钉钉H5免登录流程前后端实现_钉钉h5登录

钉钉h5登录

这里简单介绍一下实现过程和整合后的代码,官网的代码比较分散,新手看起来有点困难

免登流程

免登是指用户进入应用后,无需输入钉钉用户名和密码,应用程序可自动获取当前用户身份,进而登录系统的流程。

获取微应用免登授权码

使用以下代码获取免登授权码(调用此api不需要进行鉴权,即不需要进行dd.config)。获取的免登授权码有效期5分钟,且只能使用一次。接口说明,请参考获取微应用免登授权码

说明 第三方企业应用可以在微应用的首页URL中使用$CORPID$做为参数占位符,钉钉容器会将$CORPID$替换为当前访问用户的企业corpId。

例如,微应用首页地址为https://www.dingtalk.com,需要获取当前访问用户的企业corpId值,微应用首页地址可改为https://www.dingtalk.com?corpId=$CORPID$。在进入该首页地址页面时,使用js方法获取当前页面URL,即可获取corpId值。

CORPID获取

c6e3dc15a4a645139a6982537c34c62f.png

地址配置

f9f5ec8efb5b417585aea126193f51ba.png

 前端实现代码,移动端和PC端可以用同样的代码实现

  1. <script type="text/javascript">
  2. function GetQueryString(name)
  3. {
  4. var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
  5. var r = window.location.search.substr(1).match(reg);
  6. if(r!=null)return unescape(r[2]); return null;
  7. }
  8. dd.runtime.permission.requestAuthCode({
  9. corpId: GetQueryString("corpId"),
  10. onSuccess: function(result) {
  11. console.log(result)
  12. // $("#userName").text(JSON.stringify(result));
  13. //获取当前用户信息
  14. getUserInfo(result.code)
  15. },
  16. onFail: function(err) {
  17. console.log(err)
  18. }
  19. })
  20. function getUserInfo(code) {
  21. $.ajax({
  22. async: false, //同步,异步
  23. url: "获取用户信息的接口地址", //请求的服务端地址
  24. data: {
  25. code: code,
  26. },
  27. type: "post",
  28. success: function(datas) {
  29. //成功之后的处理,返回的数据就是 data
  30. $("#userId").text(JSON.stringify(datas));
  31. //进行登录逻辑处理
  32. },
  33. error: function() {
  34. alert(e); //错误的处理
  35. }
  36. });
  37. }
  38. </script>

后端获取登录用户信息的接口代码

调用过程和步骤

 这里的代码是自己封装的框架,不必完全照抄,可按照自己实际情况进行参数接收和处理即可,主要关注中间部分

  1. @MethodAnnotation(method = "getUserInfo", methodWay = "ALL", methoddes = "获取钉钉用户信息")
  2. public void getUserInfo(HttpServletRequest request, HttpServletResponse response) throws Exception {
  3. String authCode=request.getParameter("code");
  4. // 1. 获取access_token
  5. String accessToken = TestDingDing.getAccessToken();
  6. // 2. 获取用户ID
  7. String userId = getUserId(authCode, accessToken);
  8. //3. 获取用户详情
  9. UserGetResponse r = getOapiV2UserGetResponseByUserId(userId, accessToken);
  10. System.out.println(JSON.toJSONString(r));
  11. qury(request, response, r, false, 0);
  12. }

获取授权token 

  1. public static String getAccessToken() {
  2. try {
  3. return (JSON.parseObject(getAccessTokenJSON())).getString("access_token");
  4. } catch (Exception e) {
  5. e.printStackTrace();
  6. }
  7. return null;
  8. }
  9. private static String getAccessTokenJSON() {
  10. try {
  11. String token = HttpClient.doGetStr(access_token_url.replaceAll("_appkey", appkey).replaceAll("_appsecret", appsecret));
  12. return token;
  13. } catch (Exception e) {
  14. e.printStackTrace();
  15. }
  16. return null;
  17. }

 根据授权码和accessToken获取用户ID信息

  1. /**
  2. * 根据authCode获取用户ID
  3. *
  4. * @param authCode
  5. * @param accessToken
  6. * @return
  7. */
  8. private static String getUserId(String authCode, String accessToken) {
  9. DingTalkClient client = new DefaultDingTalkClient(GET_USER_INFO_URL);
  10. OapiV2UserGetuserinfoRequest req = new OapiV2UserGetuserinfoRequest();
  11. req.setCode(authCode);
  12. OapiV2UserGetuserinfoResponse oapiV2UserGetuserinfoResponse;
  13. try {
  14. oapiV2UserGetuserinfoResponse = client.execute(req, accessToken);
  15. if (oapiV2UserGetuserinfoResponse.isSuccess()) {
  16. OapiV2UserGetuserinfoResponse.UserGetByCodeResponse userGetByCodeResponse = oapiV2UserGetuserinfoResponse.getResult();
  17. return userGetByCodeResponse.getUserid();
  18. } else {
  19. System.out.println(oapiV2UserGetuserinfoResponse.getErrcode()+oapiV2UserGetuserinfoResponse.getErrmsg());
  20. }
  21. } catch (ApiException e) {
  22. // 需要自己处理异常
  23. e.printStackTrace();
  24. }
  25. return null;
  26. }

 根据用户ID信息获取钉钉用户详情

  1. /**
  2. * 根据用户ID获取用户详情
  3. *
  4. * @param userId
  5. * @param accessToken
  6. * @return
  7. */
  8. private static OapiV2UserGetResponse.UserGetResponse getOapiV2UserGetResponseByUserId(String userId, String accessToken) {
  9. DingTalkClient client = new DefaultDingTalkClient(USER_GET_URL);
  10. OapiV2UserGetRequest req = new OapiV2UserGetRequest();
  11. req.setUserid(userId);
  12. req.setLanguage("zh_CN");
  13. try {
  14. OapiV2UserGetResponse oapiV2UserGetResponse = client.execute(req, accessToken);
  15. if (oapiV2UserGetResponse.isSuccess()) {
  16. return oapiV2UserGetResponse.getResult();
  17. } else {
  18. System.out.println(oapiV2UserGetResponse.getErrcode()+oapiV2UserGetResponse.getErrmsg());
  19. }
  20. } catch (ApiException e) {
  21. // 需要自己处理异常
  22. e.printStackTrace();
  23. }
  24. return null;
  25. }

接下来将数据返回给前端,前端根据身份信息做登录的业务逻辑处理

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/617301
推荐阅读
相关标签
  

闽ICP备14008679号