在 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_id
和 auth.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.user
和 auth.user_id
在模型定义中指定字段默认值。
我 运行 使用 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_id
和 auth.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.user
和 auth.user_id
在模型定义中指定字段默认值。