我正在创建一个API来包装googleoauth。我正在使用谷歌python客户端库。
api.py 中的代码
from flask import request, g
from ..helpers import config_helper
from ..adapters.youtube.oauth_adapter import OauthAdapter
from ..api import api_blueprint as api
@api.before_app_request
def before_request():
client_id, client_secret, scope, callback = config_helper.get_config()
g.auth = OauthAdapter(client_id, client_secret, scope, callback)
@api.route('/authorisation_url/')
def authorisation_url():
auth = g.get('auth', None)
return auth.get_authorisation_url()
@api.route('/oauth2callback/')
def callback():
authorisation_code = request.args.get('code')
return authorisation_code
@api.route('/save_oauth2credential/', methods=['POST'])
def oauth2_credentials():
auth = g.get('auth', None)
user = request.form.get('user')
authorisation_code = request.form.get('authorisation_code')
auth.save_credentials(user, authorisation_code)
@api.teardown_app_request
def after_request(response):
g.auth = None
return response
oauth_adapter.py 中的代码
from oauth2client.client import OAuth2WebServerFlow
from ..repositories import oauth_credentials_repository
class OauthAdapter:
def __init__(self, client_id, client_secret, scope, callback):
self.flow = OAuth2WebServerFlow(client_id=client_id,
client_secret=client_secret,
scope=scope,
redirect_uri=callback)
def get_authorisation_url(self):
return self.flow.step1_get_authorize_url()
def save_credentials(self, user, authorisation_code):
credentials = self.flow.step2_exchange(authorisation_code)
oauth_credentials_repository.save(user, credentials, 'Google')
我需要针对登录的用户保存凭据对象,以便稍后可以使用它代表该用户调用其他GoogleAPI。
当我调用@api.route('/save_oauth2credential/',methods=['POST'])以使用在@api.rroute('/oauth2callback/')步骤中检索到的authorization_code检索凭据时。我一直在获取FlowExchange错误:invalid_grant
有什么想法吗?
看看Chrome Devtools中的网络对话,看看线路上发生了什么。我猜在某个地方有一个403无效的授权响应。因此,您需要找出无效拨款的原因。我刚刚在Getting';invalid_grant';来自第二次的谷歌oauth错误
一般来说,你需要做两件事。
首先,检查您的代码是否正确,您的作用域和客户端id是否可靠,以及您是否正确保存了刷新令牌。
一旦你完成了所有这些,你需要将无效授权作为职业危害进行处理,并重新请求用户授权,以获得新的刷新令牌。