开发者社区> 问答> 正文

OSC 的 openapi 拿 code 获取 AccessToken 时返回 ?400报错

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里提取到的信息(第一次接口请求)

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"}


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

展开
收起
爱吃鱼的程序员 2020-06-03 11:43:44 1095 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    问题已解决。

    原因是把 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,按照你的参数在第二个接口中,只能使用一次,第二次使用时就会报你说的错误。

    解决方案:第一个接口获取的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。
    2020-06-03 11:44:04
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
AutoTalk第七期:自动化工具-OpenAPI在线调试 立即下载
最大化阿里云OpenAPI能力的方法和实践 立即下载
低代码开发师(初级)实战教程 立即下载