django实现钉钉二维码登录


1. 钉钉部分
 链接: https://open-doc.dingtalk.com/microapp/serverapi2/kymkv6

2.login页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="login_container"></div>

<script src="http://g.alicdn.com/dingding/dinglogin/0.0.5/ddLogin.js"></script>
<script>

    var url = encodeURIComponent('http://10.0.5.189:8000/#/user/login');
    var goto = encodeURIComponent('https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=xxxxxxx&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=' + url)

    var obj = DDLogin({
        id: "login_container",//这里需要你在自己的页面定义一个HTML标签并设置id,例如<div id="login_container"></div>或<span id="login_container"></span>
 goto: goto,
        style: "border:none;background-color:#FFFFFF;",
        width: "300",
        height: "400"
 });

    var hanndleMessage = function (event) {
        var origin = event.origin;
        console.log("origin", event.origin);
        if (origin == "https://login.dingtalk.com") { //判断是否来自ddLogin扫码事件。
 var loginTmpCode = event.data; //拿到loginTmpCode后就可以在这里构造跳转链接进行跳转了
 console.log("loginTmpCode", loginTmpCode);
            var url2 = "https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=xxxxxxx&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=" + url + "&loginTmpCode=" + loginTmpCode;
            window.location.href = url2;
        }
    };

    if (typeof window.addEventListener != 'undefined') {
        window.addEventListener('message', hanndleMessage, false);
    } else if (typeof window.attachEvent != 'undefined') {
        window.attachEvent('onmessage', hanndleMessage);
    }

</script>

</body>
</html>



3. django view视图

def login(request):
    """登录验证"""

    if request.method == "GET":
        ##########二维码认证登录#############
        code = request.GET.get('code', )
        appId = 'xxxxxxx'
        appSecret = 'xxxxxxxx'

        token = requests.get(
            'https://oapi.dingtalk.com/sns/gettoken?appid={appId}&appsecret={appSecret}'.format(appId=appId,
                                                                                                appSecret=appSecret))
        access_token = token.json()["access_token"]

        tmp_auth_code = requests.post(
            "https://oapi.dingtalk.com/sns/get_persistent_code?access_token={access_token}".format(
                access_token=access_token),
            json={
                "tmp_auth_code": code
            })
        tmp_code = tmp_auth_code.json()
        print(tmp_code)
        openid = tmp_code['openid']
        persistent_code = tmp_code['persistent_code']
        sns_token_request = requests.post(
            "https://oapi.dingtalk.com/sns/get_sns_token?access_token={access_token}".format(access_token=access_token),
            json={
                "openid": openid,
                "persistent_code": persistent_code
            })

        sns_token = sns_token_request.json()['sns_token']

        user_info_request = requests.get(
            'https://oapi.dingtalk.com/sns/getuserinfo?sns_token={sns_token}'.format(sns_token=sns_token))

        user_info = user_info_request.json()['user_info']
        unionid = user_info.get('unionid')
        user_obj = UserInfo.objects.filter(unionid=unionid).first()
        request.session['username'] = user_obj.username  # 登录成功后,用户登录信息存>放于session
        request.session.set_expiry(86400)  # 设置登录过期时间

        content = {'code': 0,
                   'msg': 'success',
                   'user_info': {
                       'user_id': user_obj.id,
                       'username': user_obj.username,
                       'user_iphone': user_obj.phone,
                       'user_email': user_obj.email,
                       'user': user_obj.user,
                       'D_user': user_obj.D_user
                   }
                   }
        ####################################
        content = {'code': 0, 'msg':'success',}
        return JsonResponse(data=content,status=status.HTTP_200_OK)


上一篇:[seaborn] seaborn学习笔记3——直方图Histogramplot


下一篇:seaborn