在 Flask 中,实现 google oauth,我收到 psycopg2 错误

问题描述 投票:0回答:1

我在使用 Flask 进行 google 身份验证时遇到问题,我已经实现了 github oauth,看起来效果很好,但是使用 google auth,我无法将身份验证 ID、电子邮件等添加到 postgresql 数据库,并且无法查询数据

`sqlalchemy.exc.DataError:(psycopg2.errors.NumericValueOutOfRange)值“102734810329599019513”超出整数类型的范围 第 1 行:...th (user_id、provider、created_at、token) VALUES ('102734810... ^

[SQL:插入flask_dance_oauth(user_id,provider,created_at,token)值(%(user_id)s,%(provider)s,%(created_at)s,%(token)s)返回flask_dance_oauth.id] [参数: {'user_id': '102734810329599019513', 'provider': 'google', 'created_at': datetime.datetime(2023, 10, 24, 22, 33, 40, 232815), 'token': '{" access_token": "ya29.a0AfB_byDRRI73viV12s8KegSDmRuM2Y_AjdpFN7_x_-mNmBFj0HoO2Y_X8GS9MdheuAyLFpWC9tcIuOjNTCl_xCRb_tOqd4r_QLO_QcuwOOc68kh5IBz3Dzzhknsc ...(截断 1185 个字符)已完成)... ZHnFVTXZBv8nm0AvQrtIIkD2vyeNl49KagRJ94MIk7e5Kd7Afd2BiVnIn_1Km38CffgoZOXow8Uc3-s5vE_mcTnz3M0JVt1Wz0CoHnCyfKUVQNLLw”,“expires_at”:1698190418.52 01585}'}] (此错误的背景位于:https://sqlalche.me/e/20/9h9h)`


    __tablename__ = 'Users'

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True)
    email = db.Column(db.String(64), unique=True)
    password = db.Column(db.LargeBinary)

    oauth_github  = db.Column(db.String(100), nullable=True)
    oauth_google = db.Column(db.String(100), nullable=True)
    api_token     = db.Column(db.String(100))
    api_token_ts  = db.Column(db.Integer)    

    def __init__(self, **kwargs):
        for property, value in kwargs.items():
            # depending on whether value is an iterable or not, we must
            # unpack it's value (when **kwargs is request.form, some values
            # will be a 1-element list)
            if hasattr(value, '__iter__') and not isinstance(value, str):
                # the ,= unpack of a singleton fails PEP8 (travis flake8 test)
                value = value[0]

            if property == 'password':
                value = hash_pass(value)  # we need bytes here (not plain str)

            setattr(self, property, value)

    def __repr__(self):
        return str(self.username)



@login_manager.user_loader
def user_loader(id):
    return Users.query.filter_by(id=id).first()


@login_manager.request_loader
def request_loader(request):
    username = request.form.get('username')
    user = Users.query.filter_by(username=username).first()
    return user if user else None

class OAuth(OAuthConsumerMixin, db.Model):
    user_id = db.Column(db.Integer, db.ForeignKey("Users.id", ondelete="cascade"), nullable=False)
    user = db.relationship(Users)

@oauth_authorized.connect_via(google_blueprint)
def google_logged_in(blueprint, token):
    info = google.get('/oauth2/v1/userinfo')
    if info.ok:
        account_info = info.json()
        print(account_info, "infoooo1")
        user_id = account_info['id']

        query = Users.query.filter_by(oauth_google=user_id)
        try:
            user = query.one()
            login_user(user)
        except NoResultFound:
            oauth = OAuth(
                provider=blueprint.name,
                token=token,
                user_id=user_id
            )

            user = Users()
            user.username = 'google_' + account_info['given_name']
            user.email = account_info['email']
            user.oauth_google = user_id
    
            db.session.add_all([user, oauth])
            db.session.commit()
    
            login_user(user)

我尝试将 id 更改为字符串,但这些都不起作用,似乎是与 postgresql 数据库交互时出现的错误,似乎无法找出错误帮助,非常感谢

flask sqlalchemy google-oauth flask-sqlalchemy flask-login
1个回答
0
投票

正如错误消息所述,您作为

user_id
传递的值(即
102734810329599019513
)超出了 PostgreSQL 中整数字段的范围。 (PostgreSQL 数字字段范围)。

要解决此问题,只需将字段类型更改为

bigint
,在 SqlAlchemy 中对应于 BigInteger

更换即可

db.Integer

db.BigInteger

在用户表的

user_id
id

© www.soinside.com 2019 - 2024. All rights reserved.