EVE REST-在python Eve框架错误401中使用AuthToken发出问题

时间:2015-06-23 09:26:03

标签: python mongodb authentication flask eve

我目前正在使用python-eve库来创建一个非常好的API,但是当我按照本教程实现一个"令牌认证"时,我遇到了一些问题。我得到错误401说"请提供正确的凭证"。

这是我的用户架构:

RESOURCE_METHODS = ['GET', 'POST']
ITEM_METHODS = ['GET','PATCH','DELETE']

DOMAIN = {
'user': {
    'additional_lookup': {
            'url': 'regex("[\w]+")',
            'field': 'username',
            #'url': '[\w]+',
        },
    'schema': {
        'firstname': {
            'type': 'string'
        },
        'lastname': {
            'type': 'string'
        },
        'phone': {
            'type': 'string'
        },
        'username': {
            'type': 'string',
            'required': True,
            'unique': True,
        },
        'password': {
            'type': 'string',
            'required': True,
        },
        'roles': {
            'type': 'list',
            'allowed': ['user', 'superuser', 'admin'],
            'required': True,
        },
        'token': {
            'type': 'string',
            'required': True,
        }
    },

    'cache_control': '',
    'cache_expires': 0,
    'allowed_roles': ['superuser', 'admin'],
    },

'item': {
    'schema': {
        'name':{
            'type': 'string'
            },
        'username': {
            'type': 'string'
            }
        }
    },

}

这是我的app.py

from eve import Eve
from eve.auth import TokenAuth
import random
import string


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

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

app = Eve(settings='settings.py')

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

任何想法为什么以401结束。

我正在使用python 3.4

如果可能,请向我提供工作代码。我是这个领域的菜鸟。

谢谢!

1 个答案:

答案 0 :(得分:0)

您需要按如下方式对令牌进行编码:

echo "54321:" | base64

请不要忘记上次:

由于您直接查找token(根据您的代码),因此不需要username