【问题标题】:Authentication token to only apply to one id身份验证令牌仅适用于一个 id
【发布时间】:2015-09-14 02:59:41
【问题描述】:

我正在使用本教程将authentication 合并到我的app 中:http://blog.miguelgrinberg.com/post/restful-authentication-with-flask

目前我有以下route

@app.route('/checkin/venue/<int:venue_id>', methods = ['POST'])
@auth.login_required

我的verify_password 函数与教程中指定的函数非常相似,只是我访问的是我自己的db

问题是,当我生成一个token 时,它可以跨多个venue_id 使用,即使token 是使用单个venue 的凭据生成的。

有没有办法可以将venue_id 变量传递给函数verify_password(email_or_token, password),所以当我调用verify_auth_token 时,我将能够检查令牌中编码的venue_id 是否实际上对应于电话:

@app.route('/checkin/venue/<int:venue_id>', methods = ['POST'])

感谢您的帮助。

【问题讨论】:

  • 把id放入session.
  • 谢谢@Celeo。但是,如果在调用/checkin/venue/&lt;int:venue_id&gt; 时将控制权交给verify_password 函数,我应该什么时候将id 放入session?对不起,如果我误解了。
  • 为什么不将venue_id 作为另一个参数添加到verify_password
  • @dirn verify_password 的两个参数来自HTTP Authentication header 中指定的参数,所以我认为没有办法在其中添加另一个参数?
  • 根据教程中的版本,您可以在验证令牌的方法中将其作为过滤器添加到 SQLAlchemy 查询中。

标签: python authentication flask restful-authentication


【解决方案1】:

您没有明确说明这一点,但我假设您的令牌中有venue_id,对吗?如果没有,您应该添加它。令牌可以存储您想要的任何数据,因此除了 user_id 之外,还要添加 venue_id

因此,您需要将请求 URL 中给出的venue_id 与令牌中的进行比较。这很容易做到,因为您可以在您的 URL 中以 request.view_args['venue_id'] 访问场地 ID。

因此,假设您按照我的教程中的设计,您现在有一个 User.verify_auth_token(token) 方法来解码令牌并验证它。您可以向该方法添加一个参数 venue_id,并将该验证合并到该方法的逻辑中。

然后在您的verify_password 回调中,您可以执行以下操作:

@auth.verify_password
def verify_password(token, password):
    user = User.verify_auth_token(token, request.view_args.get('venue_id', 0))
    if not user:
        return False
    g.user = user
    return True

请注意,对于不包含 venue_id 参数的请求,我选择了默认值 0。这只是为了避免崩溃。在您的验证功能中,您可以选择接受 0 的 venue_id,这意味着此请求适用于所有场所,因此在这种情况下您可以跳过对场所的检查。

希望这会有所帮助!

【讨论】:

  • 谢谢@Miguel,这正是我想要的。
猜你喜欢
  • 2017-12-23
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
相关资源
最近更新 更多