Flask:如何在会话中存储凭据并检索它们?

时间:2013-04-13 22:02:13

标签: python rest authentication flask flask-sqlalchemy

我正在开展一个项目,我的每个REST端点都需要进行身份验证。一个例子是

@login_required
def get_transactions(self):
  pass

我有User模型,看起来像

class User(UserMixin, db.Model):
    __tablename__ = 'users'
    # noinspection PyShadowingBuiltins
    uuid = Column('uuid', GUID(), default=uuid.uuid4, primary_key=True,
                  unique=True)
    email = Column('email', String, nullable=False, unique=True)
    _password = Column('password', String, nullable=False)
    created_on = Column('created_on', sa.types.DateTime(timezone=True),
                        default=datetime.utcnow(), nullable=False)
    last_login = Column('last_login', sa.types.DateTime(timezone=True),
                        onupdate=datetime.utcnow())

    def __init__(self, email, password):
        self.email = email
        self._password = hash_password(password) # hash_password does md5 of password
  • 一旦用户登录,我想在客户端会话上存储安全令牌,并希望每个进一步的请求都有该令牌
  • 我查找了示例,但不明白如何在客户端会话PLUS中保存这样的安全令牌
  • 如何确保进一步的请求从客户端会话中向我发送该令牌。

我不知道它是如何工作的,请帮忙

2 个答案:

答案 0 :(得分:0)

你见过这个例子吗? http://flask.pocoo.org/docs/patterns/viewdecorators/?highlight=login_required

如果您不想自己重写这些内容,还可以使用这些模块:

无论如何,至于在会话中存储数据,这应该相当容易。简单地把它放在flask.session中:

import flask
# You want to automatically generate the token and store it somewhere on the server (database for example)
flask.session['some_token'] = some_token

您的令牌可能是这样的:

class Session(db.Model):
    token = Column('token') # auto generated thingy
    # foreign key to user for example
    # expiration time/date

答案 1 :(得分:0)

服务器无法使REST客户端接受并返回cookie。当用户手动登录时,Web浏览器将在某些条件下执行此操作,但除非您的服务仅由托管在同一域中的交互式Web应用程序访问,并且每个用户都在您的服务上拥有帐户,否则您可能会忘记这种方法。 (即使CORS对拒绝跨域cookie的浏览器/用户也无济于事。)

最常见的解决方案是要求REST客户端在每个请求中发送其凭据,通常使用标准的http auth标头,并使用https保护传输。

如果您希望将身份验证与授权分开,则OAuth / OAuth2在此处非常有用,但会牺牲简单性。

相关问题