我正在使用Eve 0.7,Eve-Sqlalchemy 0.7.1和在我的域上实现并设置的TokenBasedAuth类。它用作通过授权标头发送令牌的请求的设计。
根据本地设计的示例:
curl -sk -X GET -H "Authorization:Bearer $MY_JWT" localhost:5000/my_domain
我有一个用例,其中客户端希望发送其中包含auth令牌的Cookie标头。但是,当我尝试这种请求时
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的身份验证?
到目前为止,我已经尝试在on_pre_GET
事件挂钩中添加一些日志记录语句,以尝试了解正在发生的事情,但是该挂钩永远不会触发。我假设内部可能正在发生某些事情,以返回401,因为没有auth标头(我还没有看过源代码,所以只是猜测)。
我也在设置中设置了X_ALLOW_CREDENTIALS = True
,但我认为这不是解决问题的方法(如果我错了,请告诉我!)。
感谢您阅读和提供任何帮助!
我通读eve / auth.py(https://github.com/pyeve/eve/blob/52a927fe69ff05d3098d62145efe1fbfaddb5cf9/eve/auth.py),我相信我可以重写授权(https://github.com/pyeve/eve/blob/52a927fe69ff05d3098d62145efe1fbfaddb5cf9/eve/auth.py#L258)来完成我需要的工作。确认后,我可以再次更新。
令牌身份验证类(https://github.com/pyeve/eve/blob/52a927fe69ff05d3098d62145efe1fbfaddb5cf9/eve/auth.py#L230)具有可以覆盖的authorized()
方法。
但是],这不是文档化的覆盖方法,所以要知道这样做可能会在不同版本的Eve中遇到问题。
我修改方法的方法是让它查找Cookie标头,如果找到,请尝试从中获取身份验证令牌。如果找到一个,并且check_auth
返回true,则调用set_user_or_token
并返回。
如果没有cookie标头,或者令牌没有成功check_auth
,请使用父类的授权方法来处理其他情况(例如Authorization标头)。
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)