2015-03-23 4 views
1

Привет Я использую аутентификацию маркера eve (http://python-eve.org/tutorials/account_management.html#accounts-with-token-authentication), но застрял в сообщении 401.ошибка аутентификации EVE


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 

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

Я использую тест имя пользователя и пароль 1234> это приводит к base64 кодированные; dGVzdDoxMjM0

Когда я использую локон


curl -X "GET" "http://api.domain.com:5000/people/obama" -H "Authorization: Basic dGVzdDoxMjM0" 

это приводит к 401

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

я проверил MongoDB и маркер там

{ 
    "_id" : ObjectId("551004d6714e7a5fec0729e3"), 
    "username" : "test", 
    "_updated" : ISODate("2015-03-23T12:19:34.000Z"), 
    "roles" : [ 
     "admin", 
     "superuser" 
    ], 
    "token" : "dGVzdDoxMjM0", 
    "_created" : ISODate("2015-03-23T12:19:34.000Z"), 
    "password" : "1234", 
    "_etag" : "96b41717630a49bca41b89f971cc3b8bd8d518a3" 
} 

Что-то не в команде cURL?

ответ

0

Там несколько вещей неправильно с вашим кодом:

  1. Вы отправляете имя пользователя и пароль с заголовком авторизации, а ваш класс RolesAuth выполняет поиск по token. Попробуйте передать кодированный токен.
  2. Вы сохранили маркер с кодировкой base64 в Mongo, но вы, вероятно, захотите вместо этого сохранить чистый токен, так как метод check_auth получит декодированное значение как аргумент token (или вам нужно его снова закодировать перед выполнением поиска).
  3. Вы действительно не хотите хранить чистый пароль в базе данных. Они должны быть хэшированы/соленые.
+0

Пункт 1. ОК спасибо, у меня создалось впечатление, что базовое имя пользователя и пароль пользователя стали маркером в заголовке авторизации. Итак, теперь я добавляю и отправляю заголовок авторизации с маркером, закодированным как curl -X «GET» «http://api.domain.com:5000/people/obama» -H «Авторизация: bGVvdG9rZW4 =», в котором Авторизация: bGVvdG9rZW4 = авторизация: + base64 encode однако я все еще получаю 401 Пункт 2.Правильное спасибо изменило его Пункт 3. Правильно, был для целей тестирования, будет удален после испытания –

1

Вы должны закодировать в base64 свой токен перед отправкой и в mongodb не закодированы.

Когда Ева извлекла токен, его декодировали, а затем сравнили с db.

если вы пришлете:

curl -X "GET" "http://api.domain.com:5000/people/obama" -H "Authorization: Basic dGVzdDoxMjM0" 

В БД должна храниться:

"token" : "1234", 

Кроме того, вы должны закодированной знак +: Например, если ваш маркер значение в БД «1234» вы должны закодировать и отправить «1234:»

+0

Пожалуйста, объясните свой ответ немного больше. Зачем это делать? Возможно, вы могли бы связать источник с вашим ответом. –