二、实现钉钉免登流程

    免登流程分四步:1、前端获取钉钉免登授权码 code;2、后端获取 access_token;3、使用授权码 code 和 access_token 换取用户 userid;4、通过 access_token 和 userid 换取用户详情 userinfo。

    前端获取授权码 code。

    1. <script src="https://g.alicdn.com/dingding/dingtalk-jsapi/2.7.13/dingtalk.open.js"></script>
    2. <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
    3. <script type="text/javascript">
    4. // 获取当前网页的url:http://ding-web.lnexin.cn/?corpid=ding46a9582af5b7541b35c2f4657eb6378f
    5. var currentUrl = document.location.toString()
    6. $("#url").append(currentUrl)
    7. // 解析url中包含的corpId
    8. var corpId = currentUrl.split("corpid=")\[1\];
    9. $("#corpId").append(corpId)
    10. // 钉钉sdk初始化:dd.ready参数为回调函数,在环境准备就绪时触发,jsapi的调用需要保证在该回调函数触发后调用,否则无效。
    11. dd.ready(function () {
    12. // 使用SDK 获取免登授权码
    13. dd.runtime.permission.requestAuthCode({
    14. corpId: 'dingovyrjosjwioznxqn',
    15. onSuccess: function (result) {
    16. alert(JSON.stringify(result));
    17. var code = result.code;
    18. //$.get("http://49.232.56.68:8006/get/user",'code='+info.code,function(response){
    19. $.get("http://49.232.56.68:8006/get/user?code=" + code, function (response) {
    20. var response = JSON.parse(response)
    21. // 下面的业务根据自己的需求来写
    22. if (response.user) {
    23. for (item in response.user) {
    24. $("#result").append("<li>\\t\[user 属性\] " + item + " : " + response.user\[item\] + "</li>")
    25. }
    26. }
    27. });
    28. },
    29. onFail: function(err) {
    30. alert('fail: ' + JSON.stringify(err)); //处理失败的情况
    31. },
    32. });
    33. });
    34. // 如果没有走ready方法的话会走error方法。
    35. // dd.error(function(error){
    36. dd.error((error) => {
    37. alert('dd error: ' + JSON.stringify(error));
    38. alert(\`dd error: ${JSON.stringify(error)}\`);
    39. });
    40. </script>

    后台获取 access_token,然后获取 userId,最后换取 userInfo。

    1. class AdminUser(BaseHandler):
    2. def get(self):
    3. info = self.request.arguments
    4. code = self.get\_argument("code", None)
    5. # 获取access\_token
    6. AppKey = "ding4itesoimljq9ksmz"
    7. AppSecret = "BW8XFsbesRJdOjmt\_peYOQBTwVWUkQKONxZ2\_2\_fXhBQjmgq2Q6tRWrq867l84ht"
    8. url = "https://oapi.dingtalk.com/gettoken?appkey={0}&appsecret={1}".format(AppKey, AppSecret)
    9. resp = requests.get(url)
    10. resp = resp.json()
    11. access\_token = resp\["access\_token"\]
    12. # 获取userId
    13. url1 = "https://oapi.dingtalk.com/user/getuserinfo?access\_token={0}&code={1}".format(access\_token, code)
    14. resp1 = requests.get(url1)
    15. resp1 = resp1.json()
    16. # 获取userInfo
    17. url2 = "https://oapi.dingtalk.com/user/get?access\_token={0}&userid={1}".format(access\_token, resp1\["userid"\])
    18. resp2 = requests.get(url2)
    19. resp2 = resp2.json()
    20. return self.write(json.dumps({"status": "success", "userinfo": resp2}))

    授权码 code 是每次请求都不一样,单次请求的数据 5 分钟有效,所以没必要缓存,直接用一次调一次。 正常情况下 access_token 有效期为 7200 秒,有效期内重复获取返回相同结果,并自动续期。缓不缓存根据自己需要吧。
    参考:https://hasfun.cn/2019/03/17/dingdingdev/https://www.jianshu.com/p/b02eea9f09ffhttps://www.anji66.net/article/id/143.htmlhttps://www.cnblogs.com/zuiwoshanlin/p/9481539.html

    三、获取钉钉后台人员

    https://hacpai.com/article/1569062348311

    四、

    https://blog.csdn.net/weixin_42336574/article/details/95485622

    https://blog.csdn.net/weixin_42042680/article/details/86661387

    https://blog.csdn.net/qq_26608423/article/details/90510923

    https://blog.csdn.net/Jason847/article/details/75007140

    https://www.cnblogs.com/applerosa/p/11509512.html

    https://dingtalk-sdk.readthedocs.io/zh_CN/latest/client/api/calendar.html

    https://ding-doc.dingtalk.com/doc.htm?docId=106834&docType=1#/serverapi2/gh60vz

    https://oa.dingtalk.com/index.htm?lwfrom=20180929152232431233#/login

    https://gitee.com/liu993083028/ding-server
    https://www.cnblogs.com/liuhaidon/archive/2019/11/26/11939257.html