尝试在 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的主要内容,如果未能解决你的问题,请参考以下文章