你如何处理 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)