尝试在 Eve Flask 框架中验证用户时出现 401

Posted

技术标签:

【中文标题】尝试在 Eve Flask 框架中验证用户时出现 401【英文标题】:401 when trying to authenticate user in Eve flask framework 【发布时间】:2015-02-14 13:13:40 【问题描述】:

我正在使用很棒的 Eve REST-framework 创建一个带有 JWT 身份验证的 CRUD API。我查看了教程posted here,但在向需要令牌身份验证的端点发出 POST 请求时收到 401 错误。

我读过这个 SO 问题:Issue with the Python Eve TokenAuth Feature 但我很确定令牌是 Base64 编码的。

这是我在执行 cURL GET 请求时从服务器返回的响应:

curl -H "Authorization: <MYTOKEN>" -i http://MY_IP/users/548f6ecd64e6d12236c9576b

---- Response ----

HTTP/1.1 401 UNAUTHORIZED
Server: nginx/1.4.6 (Ubuntu)
Date: Tue, 16 Dec 2014 10:49:25 GMT
Content-Type: application/json
Content-Length: 91
Connection: keep-alive
WWW-Authenticate: Basic realm:"eve"

"_status": "ERR", "_error": "message": "Please provide proper credentials", "code": 401

下面是我的代码:

app.py

from eve import Eve
from eve.auth import TokenAuth

import jwt


class RolesAuth(TokenAuth):

    def check_auth(self, token, allowed_roles, resource, method):
        users = app.data.driver.db['users']
        # Add check of user credentials by decoding JWT
        user = users.find_one('token': token)
        return user


def add_token(documents):
    for document in documents:
        payload = 'username': document['username']
        document["token"] = jwt.encode(payload, 'secret')


if __name__ == '__main__':
    app = Eve(auth=RolesAuth)
    app.on_insert_users += add_token
    app.run()

settings.py

users_schema = 
    'username': 
        'type': 'string',
        'required': True,
    ,
    'password': 
        'type': 'string',
        'required': True,
    ,
    'email': 
        'type': 'string',
        'minlength': 1,
        'maxlength': 200,
        'required': True,
    ,
    'token': 
        'type': 'string',
    ,
    'created': 
        'type': 'datetime',
    


users = 
    'cache_control': '',
    'cache_expires': 0,
    'extra_response_fields': ['token'],
    'public_methods': ['POST'],
    'schema': users_schema


DOMAIN = 
    'users': users,

我在我的 MongoDB 中为用户存储了一个令牌,我正在使用 Postman 发出请求,并且我将令牌包含在 Authorization 标头中,如下所示:

Authorization: <USERTOKEN> 

关于为什么这给我一个 401 的任何想法。

谢谢!

【问题讨论】:

【参考方案1】:

我测试了你的代码,但为了简单起见,我去掉了jwt.encode

def add_token(documents):
    for document in documents:
        payload = 'username': document['username']
        document["token"] = 'hello'

我向/users 发布了一个新用户,然后使用 Postman 对同一个端点进行了 GET:它就像一个魅力 (200)。然后我用curl做了同样的测试:

curl -H "Authorization: Basic Y2lhbzo=" -i http://localhost:5000/users

这也会返回200。如您所见,Auth 标头已编码(从 Postman 请求预览中复制和粘贴)。只要确保你传递了正确的东西,也许在check_auth 中设置一个断点来验证其中的内容以及数据库查找是否成功。

希望这有助于诊断您的问题。

PS:请注意,在 curl 中,Authorization 标头在令牌之前还有一个 Basic 语句,您的代码 sn-p 中似乎缺少该语句。

更新

为此,我还安装了 PyJWT 并测试了您的代码,并且......它在我的最终工作得很好。您的请求一定有问题。

更新2

可能不太明显的一件事是,您仍然需要将(编码的): 附加到您的身份验证标头(它是基本身份验证,它会解析用户名和密码)。这就是为什么在上面的示例中,您在编码的“hello”末尾有一个=

【讨论】:

感谢您的回复!所以基本上 Auth 服务会解码我在 Authorization 标头中发送的令牌? 您能否也发布您对 PyJWT 所做的实现。不确定我是否以正确的方式进行操作。再次感谢。 啊,我现在看到了这个问题。已解决 :) 感谢您抽出宝贵时间。 我认为@nicola-iarocci 的意思是使用: 而不是; 所以要编码的字符串是"hello:" @HenriqueB。感谢您指出了这一点。我编辑了 Nicola 的答案并将; 更改为:

以上是关于尝试在 Eve Flask 框架中验证用户时出现 401的主要内容,如果未能解决你的问题,请参考以下文章

Flask:当我尝试访问索引时出现错误 404

EVE验证失败

尝试验证数据库中已存在的电子邮件时出现问题

如何在 Flask 中实现令牌认证?

为啥通过 django rest 框架注册用户时出现状态码错误

在 SQLAlchemy Flask 中创建对象时出现 NoForeignKeysError