钉钉的第三方登录,乍一看开发文档觉得没什么,然而越往下进行越觉得棘手,到了最后我努力的三个小时终于能成功登录了,然而只成功登录了一次,我只是在代码下面加了几条判断,按理说python这种结构的下面的代码是不会影响到上面的代码的,然而再次运行的时候却不行了,告诉我签名校验失败,当时想死的心都有了。。。直到现在我也没弄明白为什么,明明代码第一次跑的好好的,第二次却不行了。但是现在有能够运行的代码了(本文使用的django项目):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| import time import hmac import base64 from hashlib import sha256 import urllib import json
def ding_back(request):
code = request.GET.get("code", None)
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"))+"×tamp="+timestamp+"&accessKey=dingoaukgkwqknzjvamdqh",data=json.dumps(payload),headers=headers)
res_dict = json.loads(res.text) print(res_dict) return HttpResponse(res.text)
|
这代码中构造签名是最令人难受的地方,钉钉那里只提供了PHP和Java的构造方法,却没有python的,虽然我们有万能的百度,但是百度到的代码可能在别人那里可以,在你这里就不行了,这不就整个人都裂开了嘛。但是本文中这个方法是可以使的,我试了试没有什么问题,可以成功的拿到数据,而不是提醒你: 时间戳有误、签名校验失败、签名不对之类的(我都要被折磨到崩溃了)。
接下来是微博的第三方登录,微博的这个我个人感觉还是很好搞的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| def Weibo(request): code = request.GET.get('code', None) url = "https://api.weibo.com/oauth2/access_token" re = requests.post(url, data={ "client_id": 你的Key, "client_secret": "你的密钥", "grant_type": 'authorization_code', 'code': code, 'redirect_uri': 'http://127.0.0.1:8000/sina_login' }) res = requests.get('https://api.weibo.com/2/users/show.json', params={'access_token': re.json()['access_token'], 'uid': re.json()['uid']}) print(res.json()) return HttpResponse(res.json())
|
然后是带参重定向:
1
| return redirect("http://localhost:8080?username=%s&uid=%s" % (sina_id, user_id))
|
前端接收参数:
1 2
| var username = this.$route.query.username; var uid = this.$route.query.uid;
|
这样就接收到了。
那么本篇博客就到此为止吧,我实在是累得不行了,但是怕明天一觉醒来再忘掉,所以还是先写下来。