OSC 的 openapi 拿 code 获取 AccessToken 时返回 Invalid authorization code: hzmng9? 400 报错
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里提取到的信息(第一次接口请求)
GeneralRequest URL:https://www.oschina.net/action/oauth2/authorize Request Method:POST Status Code:302 Found Remote Address:218.60.112.57:443Response 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=jsmindRequest 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*****X0uQ5Form 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"}
不知道是否有其他人碰到相同的问题没有。
问题已解决。
原因是把 User-Agent 设为 "Mozilla/5.0" 是不行的,总是会返回 400。
最终的解决方案是把 request 里的 User-Agent 取出来,并添加到对这个 api 的请求头上。
GET POST 没有影响。
######你好,我也遇到了这个问题,“并添加到对这个 api 的请求头上”是添加到哪里呀。######这个我们要查下。######您好,这个问题的原因:第一个接口获取的code,按照你的参数在第二个接口中,只能使用一次,第二次使用时就会报你说的错误。解决方案:第一个接口获取的code,调用第二个接口oauth2_token时,指定grant_type为refresh_token即可。
另外注意access_token的过期时间expires_in,过期后需要重新通过第二个接口获取新的access_token。
######解决方案:第一个接口获取的code,调用第二个接口oauth2_token时,指定grant_type为refresh_token即可。
另外注意access_token的过期时间expires_in,过期后需要重新通过第二个接口获取新的access_token。
我的做法(也应该是通行做法)是:从第一个接口获取到code后,立即使用该code调用第二个接口。这中间没有其他的逻辑,因此不存在多次使用此code调用第二个接口的问题,应该也不会过期。
再次向你们确认一下,code 这么短是正常的吗? 我使用相同的代码(稍有改动)接入新浪微博,接入 github 都是没有问题的,再次求助。
######你再次确认过吗?######这是刚刚的调试数据:# 这个 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 : 客气######回复 @卜祥龙 : 非常感谢,我直接在浏览器里访问这个接口是可以的。感谢帮助,下面我自己处理吧。谢谢。######回复 @卜祥龙 : 我 GET /action/openapi/token 这个接口,还是同样的响应。 看来还是我这边的问题。 非常感谢你的帮助,不知你能否把你测试时的请求报文发我一下。想必是 python 这个库我没有用对。######回复 @卜祥龙 : 这里使用POST会报500错误。######回复 @hizzgdev : 使用GET method请求。根据你提供的appid和appsecret,我请求到了access_token。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。