2

使用Django2.0.4集成钉钉第三方扫码登录

 1 year ago
source link: https://v3u.cn/a_id_124
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

使用Django2.0.4集成钉钉第三方扫码登录

首页 - Python/2019-12-21

    钉钉作为阿里旗下的一款免费移动通讯软件,受众群体越来越多,这里我们使用Django来集成一下钉钉的三方账号登录,首先注册钉钉开发平台:https://open-dev.dingtalk.com/

    在移动应用中选择登录

    

20191221095402_74481.png

    创建一个网站应用,其中有用的信息是appid,appsecret,还有回调网址

    

20191221095537_44738.png

    随后,查看官方文档,查看如何构造登录url:https://ding-doc.dingtalk.com/doc#/serverapi2/kymkv6

    这里我们用django的视图来操作

#构造钉钉登录url
def ding_url(request):
    appid = 'dingoaukgkwqknzjvamdqh'
    redirect_uri = 'http://localhost:8000/dingding_back/'

    return redirect('https://oapi.dingtalk.com/connect/qrconnect?appid='+appid+'&response_type=code&scope=snsapi_login&state=STATE&redirect_uri='+redirect_uri)

    然后访问http://localhost:8000/ding_url,就可以进行扫码

    

20191221100217_14450.png

    随后,钉钉会将code返回到回调网址中,查看官方文档,只有java和php的sdk,并没有python的

    

20191221100604_41675.png

    怎么办,没关系,自己写,逻辑很简单,将时间戳,秘钥进行hmac加密即可

import time
import hmac
import base64
from hashlib import sha256
import urllib
import json

#构造钉钉回调方法
def ding_back(request):

    #获取code
    code = request.GET.get("code")

    t = time.time()
    #时间戳
    timestamp = str((int(round(t * 1000))))
    appSecret ='ly-AzMKMmCKQP3geaILT_An32kEfKO3HeOtApy5CgKwjytevVZC0WYsT2gxMB160'
    #构造签名
    signature = base64.b64encode(hmac.new(appSecret.encode('utf-8'),timestamp.encode('utf-8'), digestmod=sha256).digest())
    #请求接口,换取钉钉用户名
    payload = {'tmp_auth_code':code}
    headers = {'Content-Type': 'application/json'}
    res = requests.post('https://oapi.dingtalk.com/sns/getuserinfo_bycode?signature='+urllib.parse.quote(signature.decode("utf-8"))+"&timestamp="+timestamp+"&accessKey=dingoaukgkwqknzjvamdqh",data=json.dumps(payload),headers=headers)

    res_dict = json.loads(res.text)
    print(res_dict)
    return HttpResponse(res.text)

     访问一下,显示出了钉钉的用户名

    

20191221101323_79824.png

    就是这么简单,最后附上项目地址:https://gitee.com/QiHanXiBei/mydjango


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK