在 web2py 中使用 JWT 进行身份验证

Auth with JWT in web2py

我 运行 使用 web2py 在控制器中休息 api 并且我的 jwt 和令牌可以工作。在模型中,我使用具有默认值的字段,但该字段永远不会自动填充,因为 auth.user 是 None。我试图手动初始化它,但它不起作用。

Sites.py:

if auth.user is None:
    auth = Auth(db, jwt = {'secret_key':'..hnv', 'user_param':"email"})
    #auth.jwt()
    auth.basic()
    #auth.user.update()

我也尝试在 db.py 中添加参数但没有成功:

auth = Auth(db,jwt = {'secret_key':'...', 'user_param':"email"}, host_names=configuration.get('host.names'))

是我期望过高还是做错了什么?

auth = Auth(db, jwt = {'secret_key':'...', 'user_param':"email"})

如果您如上所述实例化 Auth(即添加 JWT 功能),当带有 JWT 令牌的请求进入时,执行上述行时不会立即填充 auth.user。相反,令牌仅在 @auth.allows_jwt() 装饰器执行时(即在请求的控制器中)被读取和填充 auth.user 。这意味着在您的模型文件中,您有 DAL table 定义,auth.user(以及 auth.user_idauth.user_groups)仍然是 None在通过 JWT 授权的请求期间,因此您不能直接将这些值用作字段默认值。

作为替代方案,您可以指定一个函数作为字段默认值,该函数返回相关的 auth 属性:

db.define_table('mytable',
    ...,
    Field('created_by', default=lambda: auth.user_id))

上面定义的lambda函数不会在定义table时被调用,而只会在以后实际创建记录时调用,这大概只会发生在已经装饰过的控制器中@auth.allows_jwt()(因此,auth.user 将在那时填充)。

另一种选择是通过在模型文件中调用 auth.allows_jwt 强制将 auth.user 填充到模型文件中(它 returns 是一个装饰器,但由于我们没有将其用作装饰器, 我们必须改为传递一个 no-op 函数然后调用返回的函数):

auth = Auth(db, jwt = {'secret_key':'...', 'user_param':"email"})
if not auth.user:
    try:
        # If there is a token, this will populate `auth.user`, 
        # `auth.user_id`, and `auth.user_groups` from the token data.
        auth.allows_jwt()(lambda: None)()
    except:
        # An error means the token is absent, expired, or invalid.
        pass

执行上述操作后,您可以使用 auth.userauth.user_id 在模型定义中指定字段默认值。