使用 Reddit API 授权,无法为不记名令牌交换代码,授权无效?
Authorizing with Reddit API, Can't exchange code for bearer token, invalid grant?
我正在关注 documentation from reddit,我得到了一个授权码,但是当我尝试用它交换不记名令牌时,我收到错误 invalid_grant
,即使我已经设置了它到我可以使用的唯一选项。我更愿意使用这种授权方法,这样我就不必与用户凭据进行交互。
from flask import Flask, redirect, request
import requests
import requests.auth
import json
import urllib
app = Flask(__name__)
@app.route('/')
def main():
return "<a href='/authorize'>Authorize</a>"
@app.route("/authorize")
def authorize():
params = {
"client_id": "client id",
"response_type": "code",
"state": "randomStateKey",
"redirect_uri": "http://127.0.0.1:5000/callback",
"duration": "temporary",
"scope": "edit",
}
url = "https://www.reddit.com/api/v1/authorize?"
return redirect(url + urllib.parse.urlencode(params))
@app.route("/callback")
def callback():
authorization_code = request.args.get("code")
response = code_token_exchange(authorization_code)
return json.dumps(response)
def code_token_exchange(authorization_code):
client_auth = requests.auth.HTTPBasicAuth('client id', 'client secret')
headers = {"User-Agent": "MyApp/v1"}
data = {
"grant_type": "authorization_code",
"code": authorization_code,
"redirect_uri": "127.0.0.1:5000/callback"
}
url = "https://www.reddit.com/api/v1/access_token"
response = requests.post(url=url, data=data, auth=client_auth, headers=headers)
return response.json()
if __name__ == '__main__':
app.run()
多么愚蠢的错误,但万一有人遇到同样的问题:
"redirect_uri": "127.0.0.1:5000/callback"
我错过了开头的 "http://"。确保这与您的 reddit 应用程序帐户中的重定向 url 匹配。
我正在关注 documentation from reddit,我得到了一个授权码,但是当我尝试用它交换不记名令牌时,我收到错误 invalid_grant
,即使我已经设置了它到我可以使用的唯一选项。我更愿意使用这种授权方法,这样我就不必与用户凭据进行交互。
from flask import Flask, redirect, request
import requests
import requests.auth
import json
import urllib
app = Flask(__name__)
@app.route('/')
def main():
return "<a href='/authorize'>Authorize</a>"
@app.route("/authorize")
def authorize():
params = {
"client_id": "client id",
"response_type": "code",
"state": "randomStateKey",
"redirect_uri": "http://127.0.0.1:5000/callback",
"duration": "temporary",
"scope": "edit",
}
url = "https://www.reddit.com/api/v1/authorize?"
return redirect(url + urllib.parse.urlencode(params))
@app.route("/callback")
def callback():
authorization_code = request.args.get("code")
response = code_token_exchange(authorization_code)
return json.dumps(response)
def code_token_exchange(authorization_code):
client_auth = requests.auth.HTTPBasicAuth('client id', 'client secret')
headers = {"User-Agent": "MyApp/v1"}
data = {
"grant_type": "authorization_code",
"code": authorization_code,
"redirect_uri": "127.0.0.1:5000/callback"
}
url = "https://www.reddit.com/api/v1/access_token"
response = requests.post(url=url, data=data, auth=client_auth, headers=headers)
return response.json()
if __name__ == '__main__':
app.run()
多么愚蠢的错误,但万一有人遇到同样的问题:
"redirect_uri": "127.0.0.1:5000/callback"
我错过了开头的 "http://"。确保这与您的 reddit 应用程序帐户中的重定向 url 匹配。