ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

使用django钉钉第三方扫码登录

2020-04-30 19:00:06  阅读:533  来源: 互联网

标签:redirect 扫码 code 登录 url res django user import


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

在移动应用中选择登录


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


随后,查看官方文档,查看如何构造登录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 , 就可以进行扫码

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


SDK请求示例(JAVA):

DefaultDingTalkClient  client = new DefaultDingTalkClient("https://oapi.dingtalk.com/sns/getuserinfo_bycode");
OapiSnsGetuserinfoBycodeRequest req = new OapiSnsGetuserinfoBycodeRequest();
req.setTmpAuthCode("4a2c5695b78738d495f47b5fee9160cd");
OapiSnsGetuserinfoBycodeResponse response = client.execute(req,"yourAppId","yourAppSecret");

SDK请求示例(PHP):

include "TopSdk.php";
$c = new DingTalkClient(DingTalkConstant::$CALL_TYPE_OAPI, DingTalkConstant::$METHOD_POST , DingTalkConstant::$FORMAT_JSON);
$req = new OapiSnsGetuserinfoBycodeRequest;
$req->setTmpAuthCode("4a2c5695b78738d495f47b5fee9160cd");
$resp=$c->executeWithAccessKey($req, "https://oapi.dingtalk.com/sns/getuserinfo_bycode","yourAppId","yourAppSecret");
var_dump($resp)

python 逻辑很简单,将时间戳,秘钥进行hmac加密即可

# 构造钉钉回调方法
# 导包:
import hmac
import base64
from hashlib import sha256
import urllib
import json

def ding_url(request):
    appid = 'dingoadckiwhdceemaxrza',
    redirect_uri = 'http://127.0.0.1:8000/ding_url'
    # 获取code
    code = request.GET.get("code")
    t = time.time()
    # 时间戳
    timestamp = str((int(round(t * 1000))))
    # 密钥
    appSecret = 'Uym9ecJfNF4vlQ9-8wAGl2J10GvyZNKJqiXvcuf0blp7ERTpWrif8IwWk_AGI1j-'
    # 构造签名
    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'}
    # parse(alt+回车 第二个 导包)
    res = requests.post('https://oapi.dingtalk.com/sns/getuserinfo_bycode?signature=' + urllib.parse.quote(
        signature.decode("utf-8")) + "&timestamp=" + timestamp + "&accessKey=dingoadckiwhdceemaxrza",
                        data=json.dumps(payload), headers=headers)
    res_dict = json.loads(res.text)
    print(res_dict)

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


vue与django结合 钉钉第三放登录

//vue登录页面内点击事件

//钉钉登录
      dingding() {
        //拼接钉钉url
        let url = "https://oapi.dingtalk.com/connect/qrconnect?appid=dingoadckiwhdceemaxrza&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=http://127.0.0.1:8000/ding_url"
        //进行站外跳转
        window.location.href = url;
      },
# django视图页面:
# 导包:
import hmac
import base64
from hashlib import sha256
import urllib
import json

def ding_url(request):
    appid = 'dingoadckiwhdceemaxrza',
    redirect_uri = 'http://127.0.0.1:8000/ding_url'
    # 'https: // oapi.dingtalk.com / connect / qrconnect?appid =dingoamo0tezhk5hsckrrk & response_type = code & scope = snsapi_login & state = STATE & redirect_uri =http://localhost:8000/dingding_back/'
    # 获取code
    code = request.GET.get("code")
    t = time.time()
    # 时间戳
    timestamp = str((int(round(t * 1000))))
    appSecret = 'Uym9ecJfNF4vlQ9-8wAGl2J10GvyZNKJqiXvcuf0blp7ERTpWrif8IwWk_AGI1j-'
    # 构造签名
    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'}
    # parse(alt+回车 第二个 导包)
    res = requests.post('https://oapi.dingtalk.com/sns/getuserinfo_bycode?signature=' + urllib.parse.quote(
        signature.decode("utf-8")) + "&timestamp=" + timestamp + "&accessKey=dingoadckiwhdceemaxrza",
                        data=json.dumps(payload), headers=headers)
    res_dict = json.loads(res.text)
    #判断是否为第一次登录
    user = models.User.objects.filter(username=str(res_dict['user_info']['nick'])).first()

    sina_name = ''
    user_id = ''
    # 代表曾经登陆
    if user:
        sina_name = user.username
        user_id = user.id
    else:
        # 首次登录 建立账号保存到数据库
        models.User(username=str(res_dict['user_info']['nick']), password=make_password(''), type=0).save()
        print('已创建钉钉账户')
        # 查询用户
        user = models.User.objects.filter(username=str(res_dict['user_info']['nick'])).first()
        sina_name = res_dict['user_info']['nick']
        user_id = user.id
    # 进行跳转
    return redirect("http://localhost:8080?sina_name=" + str(sina_name) + "&uid=" + str(user_id))

标签:redirect,扫码,code,登录,url,res,django,user,import
来源: https://www.cnblogs.com/z-han/p/12810737.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有