我很难用Flask-Dance实现Google OAuth。这是交易。为了使一切正常,我需要设置offline=True
以及创建谷歌蓝图时的reprompt_consent=True
:
google_bp = make_google_blueprint(
client_id="trololo",
client_secret="ololo",
offline=True,
reprompt_consent=True,
scope=["email"],
redirect_url="/callback/google"
)
但是,reprompt_consent=True
自然会使应用程序在每次用户登录时重新提示用户进行离线访问。
这两个参数的任何其他组合都会导致缺少Oauth2lib
refresh_token
。
我本身不需要离线访问,但正如我认为的那样,这似乎是摆脱缺少参数错误的唯一方法。那么,有没有其他方法可以通过Flask-Dance登录Google并传递refresh_token
呢?
特别是在谷歌的烧瓶舞中,你需要实现一个Backend
来存储OAuth Dance中的任何内容。以下是文档中的片段,可帮助您入门。
from flask_sqlalchemy import SQLAlchemy
from flask_login import current_user
from flask_dance.consumer.backend.sqla import OAuthConsumerMixin, SQLAlchemyBackend
db = SQLAlchemy()
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
# ... other columns as needed
class OAuth(OAuthConsumerMixin, db.Model):
user_id = db.Column(db.Integer, db.ForeignKey(User.id))
user = db.relationship(User)
blueprint.backend = SQLAlchemyBackend(OAuth, db.session, user=current_user)
在上面的示例中,您现在可以查询用户的 SQL 数据库。
对于其他寻找答案的人:如果您已经在没有offline=True
设置的情况下授予访问权限,则必须转到您的 Google 帐户并撤消对您的应用的访问权限,然后才能自行运行。否则,将需要reprompt_consent=True
。