OSC 的 openapi 拿 code 获取 AccessToken 时返回 Invalid authorization code: hzmng9

hizzgdev 发布于 2016/05/18 02:03
阅读 362
收藏 0

1. 通过这个接口 /action/oauth2/authorize 的回调,得到的code是 hzmng9

2. 使用这个 code 请求接口 /action/openapi/token 时,得到的返回信息是 {"error_description":"Invalid authorization code: hzmng9","error":"400"}

我看别人发帖中所说的 OSC 的openapi 得到的 code 都没有这么短的。怀疑是否OSC 这边有bug。

下面是在chrome里提取到的信息(第一次接口请求)

General
Request URL:https://www.oschina.net/action/oauth2/authorize
Request Method:POST
Status Code:302 Found
Remote Address:218.60.112.57:443
Response Header:
HTTP/1.1 302 Found
Server: Tengine
Date: Tue, 17 May 2016 17:33:10 GMT
Content-Type: text/html;charset=utf-8
Content-Length: 0
Connection: keep-alive
Keep-Alive: timeout=20
Location: http://jsmind.sinaapp.com/user/login/oschina/success?code=hzmng9&state=jsmind
Request Header
POST /action/oauth2/authorize HTTP/1.1
Host: www.oschina.net
Connection: keep-alive
Content-Length: 185
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: https://www.oschina.net
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: https://www.oschina.net/action/oauth2/authorize?response_type=code&client_id=tcEfs*****hidden*****yjHVl&state=jsmind&redirect_uri=http%3A%2F%2Fjsmind.sinaapp.com%2Fuser%2Flogin%2Foschina%2Fsuccess
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.6
Cookie: oscid=EM9FBSUtcEfs*****hidden*****yjHVlsIy9RU4DtH; aliyungf_tc=AQAA*****hidden*****X0uQ5
Form Data:
client_id:tcEfs*****hidden*****yjHVl
response_type:code
redirect_uri:http://jsmind.sinaapp.com/user/login/oschina/success
scope:user_api,
state:jsmind
user_oauth_approval:true


第二次接口

request_url = 'https://www.oschina.net/action/openapi/token'
request_data = {
    'client_id' : OAUTH_OSCHINA_CLIENTID,
    'client_secret' : OAUTH_OSCHINA_CLIENTSECRET,
    'grant_type' : 'authorization_code',
    'redirect_uri' : 'http://jsmind.sinaapp.com/',
    'code' : 'hzmng9', 
    'dataType' : 'json'
}   
request_header = {
    'User-Agent' : 'Mozilla/5.0'
}
req = urllib2.Request(request_url, urllib.urlencode(request_data), headers=request_header)
resp = urllib2.urlopen(req).read()
print(resp)

# 输出
{"error_description":"Invalid authorization code: hzmng9","error":"400"}


不知道是否有其他人碰到相同的问题没有。

加载中
0
hizzgdev
hizzgdev

问题已解决。

原因是把 User-Agent 设为 "Mozilla/5.0" 是不行的,总是会返回 400。

最终的解决方案是把 request 里的 User-Agent 取出来,并添加到对这个 api 的请求头上。

GET POST 没有影响。

感谢 @卜祥龙 ,感谢 @翟志军

0
翟志军
翟志军
这个我们要查下。
0
降龙罗汉
降龙罗汉
您好,这个问题的原因:第一个接口获取的code,按照你的参数在第二个接口中,只能使用一次,第二次使用时就会报你说的错误。

解决方案:第一个接口获取的code,调用第二个接口oauth2_token时,指定grant_type为refresh_token即可。

另外注意access_token的过期时间expires_in,过期后需要重新通过第二个接口获取新的access_token。

0
hizzgdev
hizzgdev

引用来自“卜祥龙”的评论

您好,这个问题的原因:第一个接口获取的code,按照你的参数在第二个接口中,只能使用一次,第二次使用时就会报你说的错误。

解决方案:第一个接口获取的code,调用第二个接口oauth2_token时,指定grant_type为refresh_token即可。

另外注意access_token的过期时间expires_in,过期后需要重新通过第二个接口获取新的access_token。

我的做法(也应该是通行做法)是:从第一个接口获取到code后,立即使用该code调用第二个接口。这中间没有其他的逻辑,因此不存在多次使用此code调用第二个接口的问题,应该也不会过期。

再次向你们确认一下,code 这么短是正常的吗? 我使用相同的代码(稍有改动)接入新浪微博,接入 github 都是没有问题的,再次求助。

降龙罗汉
降龙罗汉
你再次确认过吗?
0
hizzgdev
hizzgdev
这是刚刚的调试数据:
# 这个 303 重定向到第一个接口
10.0.2.2 - - [18/May/2016 22:50:23] "GET /user/login/oschina HTTP/1.1" 303 0 

# 第一个接口授权后又重定向回来,见下一条access log 内容:/user/login/oschina/success?code=r6Ct0P&state=
# 下面这段是 urllib2 库的日志,可以看到只有这一次请求

send: 'POST /action/openapi/token HTTP/1.1\r\nAccept-Encoding: identity\r\nContent-Length: 203\r\nHost: www.oschina.net\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: close\r\nUser-Agent: Mozilla/5.0\r\n\r\ncode=r6Ct0P&dataType=json&redirect_uri=http%3A%2F%2Fjsmind.sinaapp.com%2Fuser%2Flogin%2Foschina&client_id=***************&client_secret=*******************************&grant_type=authorization_code'

reply: 'HTTP/1.1 200 OK\r\n'
header: Server: Tengine
header: Date: Wed, 18 May 2016 14:50:26 GMT
header: Content-Type: application/json;charset=utf-8
header: Content-Length: 72
header: Connection: close
header: Cache-Control: no-store

{"error_description":"Invalid authorization code: r6Ct0P","error":"400"}


#我的应用程序没有处理异常,因此最终 access log 记录到了 500 的状态码
10.0.2.2 - - [18/May/2016 22:50:28] "GET /user/login/oschina/success?code=r6Ct0P&state= HTTP/1.1" 500 794
降龙罗汉
降龙罗汉
回复 @hizzgdev : 客气
hizzgdev
hizzgdev
回复 @卜祥龙 : 非常感谢,我直接在浏览器里访问这个接口是可以的。感谢帮助,下面我自己处理吧。谢谢。
hizzgdev
hizzgdev
回复 @卜祥龙 : 我 GET /action/openapi/token 这个接口,还是同样的响应。 看来还是我这边的问题。 非常感谢你的帮助,不知你能否把你测试时的请求报文发我一下。想必是 python 这个库我没有用对。
降龙罗汉
降龙罗汉
回复 @卜祥龙 : 这里使用POST会报500错误。
降龙罗汉
降龙罗汉
回复 @hizzgdev : 使用GET method请求。根据你提供的appid和appsecret,我请求到了access_token。
下一页
返回顶部
顶部