你如何处理 Eve 中基于 cookie 的身份验证?
How do you handle cookie based authentication in Eve?
我正在使用 Eve 0.7、Eve-Sqlalchemy 0.7.1,以及在我的域上实施和设置的 TokenBasedAuth class。它作为通过授权发送令牌的请求的设计 header.
按本地设计工作的示例:
curl -sk -X GET -H "Authorization:Bearer $MY_JWT" localhost:5000/my_domain
我有一个用例,客户端想发送一个 Cookie header,其中包含身份验证令牌。然而,当我尝试那种请求时
curl -sk -X GET -H "Cookie: $MY_COOKIE" localhost:5000/my_domain
我收到的回复是
{
"_status": "ERR",
"_error": {
"code": 401,
"message": "Please provide proper credentials"
}
}
有没有办法在 Eve 0.7 中处理 Cookie based-authentication?
到目前为止,我已经尝试将一些日志记录语句添加到 on_pre_GET
事件挂钩以尝试了解正在发生的事情,但挂钩从未触发。我假设 return a 401 内部可能发生了一些事情,因为没有 auth header(我还没有看过源代码,所以只是猜测)。
我还在我的设置中设置了 X_ALLOW_CREDENTIALS = True
,但我认为这不是解决问题的方法(如果我错了请告诉我!)。
感谢您的阅读以及您能提供的任何帮助!
更新
我通读了 eve/auth.py (https://github.com/pyeve/eve/blob/52a927fe69ff05d3098d62145efe1fbfaddb5cf9/eve/auth.py) and I believe I can override authorized (https://github.com/pyeve/eve/blob/52a927fe69ff05d3098d62145efe1fbfaddb5cf9/eve/auth.py#L258) 来做我需要的。一旦我确认我可以再次更新。
令牌验证 class (https://github.com/pyeve/eve/blob/52a927fe69ff05d3098d62145efe1fbfaddb5cf9/eve/auth.py#L230) 有一个 authorized()
方法,您可以覆盖它。
但是,它不是一个记录在案的覆盖方法,所以要知道这样做你可以 运行 解决不同版本的 Eve 中的问题。
我修改该方法的方式是让它查找 Cookie header,如果找到,则尝试从中获取身份验证令牌。如果找到一个并且 check_auth
return 为真,则调用 set_user_or_token
和 return.
如果没有 cookie header,或者令牌没有 check_auth
成功,则通过 parent class' 授权方法来处理其他情况(例如作为授权 header).
class MyTokenAuth(TokenAuth):
def authorized(self, allowed_roles, resource, method):
auth = None
if request.headers.get("Cookie"):
auth = self.try_to_get_auth_from_cookie(request.headers.get("Cookie"))
if auth and self.check_auth(auth, allowed_roles, resource, method):
super().set_user_or_token(auth)
return True
return super().authorized(allowed_roles, resource, method)
我正在使用 Eve 0.7、Eve-Sqlalchemy 0.7.1,以及在我的域上实施和设置的 TokenBasedAuth class。它作为通过授权发送令牌的请求的设计 header.
按本地设计工作的示例:
curl -sk -X GET -H "Authorization:Bearer $MY_JWT" localhost:5000/my_domain
我有一个用例,客户端想发送一个 Cookie header,其中包含身份验证令牌。然而,当我尝试那种请求时
curl -sk -X GET -H "Cookie: $MY_COOKIE" localhost:5000/my_domain
我收到的回复是
{
"_status": "ERR",
"_error": {
"code": 401,
"message": "Please provide proper credentials"
}
}
有没有办法在 Eve 0.7 中处理 Cookie based-authentication?
到目前为止,我已经尝试将一些日志记录语句添加到 on_pre_GET
事件挂钩以尝试了解正在发生的事情,但挂钩从未触发。我假设 return a 401 内部可能发生了一些事情,因为没有 auth header(我还没有看过源代码,所以只是猜测)。
我还在我的设置中设置了 X_ALLOW_CREDENTIALS = True
,但我认为这不是解决问题的方法(如果我错了请告诉我!)。
感谢您的阅读以及您能提供的任何帮助!
更新
我通读了 eve/auth.py (https://github.com/pyeve/eve/blob/52a927fe69ff05d3098d62145efe1fbfaddb5cf9/eve/auth.py) and I believe I can override authorized (https://github.com/pyeve/eve/blob/52a927fe69ff05d3098d62145efe1fbfaddb5cf9/eve/auth.py#L258) 来做我需要的。一旦我确认我可以再次更新。
令牌验证 class (https://github.com/pyeve/eve/blob/52a927fe69ff05d3098d62145efe1fbfaddb5cf9/eve/auth.py#L230) 有一个 authorized()
方法,您可以覆盖它。
但是,它不是一个记录在案的覆盖方法,所以要知道这样做你可以 运行 解决不同版本的 Eve 中的问题。
我修改该方法的方式是让它查找 Cookie header,如果找到,则尝试从中获取身份验证令牌。如果找到一个并且 check_auth
return 为真,则调用 set_user_or_token
和 return.
如果没有 cookie header,或者令牌没有 check_auth
成功,则通过 parent class' 授权方法来处理其他情况(例如作为授权 header).
class MyTokenAuth(TokenAuth):
def authorized(self, allowed_roles, resource, method):
auth = None
if request.headers.get("Cookie"):
auth = self.try_to_get_auth_from_cookie(request.headers.get("Cookie"))
if auth and self.check_auth(auth, allowed_roles, resource, method):
super().set_user_or_token(auth)
return True
return super().authorized(allowed_roles, resource, method)