2

我正在使用 Flask-Dance 使用 Google 登录我的应用程序。我也在使用 SQLAlchemy 和 Flask-Login。

有关 Google 登录的所有内容都运行良好,但它应该将令牌数据保存在由 SQLAlchemy (flask_dance_oauth) 创建的表中,但事实并非如此。每次我登录时,它都不会将令牌数据保存在表中,即使我指定了它。

from app import db
from flask_dance.contrib.google import make_google_blueprint
from flask_dance.consumer.storage.sqla import SQLAlchemyStorage
from flask_login import current_user
from Tables import OAuth


blueprint = make_google_blueprint(
    client_id="clientid",
    client_secret="secret",
    scope=['https://www.googleapis.com/auth/userinfo.profile', 'https://www.googleapis.com/auth/userinfo.email',
           'openid'],
    storage=SQLAlchemyStorage(OAuth, db.session, user=current_user))

还有我的 SQLAlchemy 类:

from app import db
from datetime import *
from flask_dance.consumer.storage.sqla import OAuthConsumerMixin
from flask_login import UserMixin


class Users(UserMixin, db.Model):
    __bind_key__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    uuid = db.Column(db.String(50), index=True, unique=True)
    email = db.Column(db.String(100), unique=True)
    fname = db.Column(db.String(20))
    lname = db.Column(db.String(20))
    authenticated = db.Column(db.Boolean, default=True)


class OAuth(OAuthConsumerMixin, db.Model):
    __bind_key__ = 'users'
    user_id = db.Column(db.String(50), db.ForeignKey(Users.uuid))
    user = db.relationship(Users)

奇怪的是,我在另一个项目中做了完全相同的代码,而且效果很好。但在这一个它不会。可能是因为用户表的构建方式吗?这里有名字和姓氏,但我制作的另一个项目中的 User 表只有 UUID 和电子邮件。任何帮助将不胜感激。

4

1 回答 1

0

你解决了吗?数据库中的 OAuth 表名是什么?如果不是flask_dance_oauth,那么在我看来,您缺少OAuth 表的表名。它应该是:

class OAuth(OAuthConsumerMixin, db.Model):
    __bind_key__ = 'users'
    __tablename__ = 'flask_dance_oauth'
    user_id = db.Column(db.String(50), db.ForeignKey(Users.uuid))
    user = db.relationship(Users)

Flask Dance 期望您的数据库中有这个表,并更新该用户的令牌以供重用等。

于 2020-04-06T03:27:47.820 回答