Python Eve TokenAuth特性问题

1 投票
1 回答
1223 浏览
提问于 2025-04-18 11:27

我最近在测试一个叫做python-eve的库,想用它来创建一个RESTful API,但在按照这个教程实现“令牌认证”时遇到了一些问题。

这是我的用户架构:

users_schema = {
    'username': {
         'type': 'string',
         'required': True,
         'unique': True,
         },
     'password': {
         'type': 'string',
         'required': True,
     },
     'roles': {
         'type': 'list',
         'allowed': ['user', 'sudo', 'admin'],
         'required': True,
     },
     'token': {
         'type': 'string',
         'required': True,
     }
 }

这是我的用户域配置:

users = {
    'title': 'user',
    'additional_lookup': {
        'url': 'regex("[\w]+")',
        'field': 'username'
    },
    'cache_control': '',
    'cache_expires': 0,
    'allowed_roles': ['sudo', 'admin', 'user'],
    'extra_response_fields': ['token'],
    'schema': users_schema
}

这是我用来测试我的API的代码:

class RolesAuth(TokenAuth):
    def check_auth(self, token,  allowed_roles, resource, method):
        users = app.data.driver.db['users']
        lookup = {'token': token}
        if allowed_roles:
            lookup['roles'] = {'$in': allowed_roles}
        user = users.find_one(lookup)
        return user

    def add_token(documents):
        for document in documents:
            document["token"] = (''.join(random.choice(string.ascii_uppercase) for x in range(10)))

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

我的问题是,当我尝试在用户端点发起请求时,像这样:

curl -X GET "http://localhost:5000/users" -H "Content-Type: application/json" -H "Authorization: Basic <MY_TOKEN>"

使用存储在用户集合中的令牌时,我总是收到以下错误信息:

请提供正确的凭据

在API的日志中显示:

127.0.0.1 - [29/Jun/2014 03:12:32] "GET /users HTTP/1.1" 401 -

这是我在mongodb中为用户的令牌所存储的一个示例:

{
    "username" : "cmorent",
    "password" : "<MY_PASSWORD>"
    "roles" : [
        "sudo",
        "admin",
        "user"
    ],
    "token" : "<MY_TOKEN>"
}

你们有没有想过我哪里做错了?我发送的Authorization头部有什么问题吗?

谢谢大家的帮助!

1 个回答

2

你发送请求时,有没有正确地对令牌进行编码呢?基本的令牌认证需要把它用Base64编码。我建议你试试一些客户端工具,比如Chrome里的Postman,这样你可以看到实际发生了什么,以及认证令牌是怎么被编码的。

撰写回答