Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

Gray-Ice

个人博客兼个人网站

钉钉的第三方登录,乍一看开发文档觉得没什么,然而越往下进行越觉得棘手,到了最后我努力的三个小时终于能成功登录了,然而只成功登录了一次,我只是在代码下面加了几条判断,按理说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
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"))+"&timestamp="+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地址
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;

这样就接收到了。

那么本篇博客就到此为止吧,我实在是累得不行了,但是怕明天一觉醒来再忘掉,所以还是先写下来。

评论



愿火焰指引你