Получение ошибки при аутентификации на основе токенов в канун python

Я использую аутентификацию на основе токенов, чтобы предоставить доступ к API моего веб-сайта зарегистрированным пользователям для доступа к нему.

Я получаю следующую ошибку.

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

Я храню имя пользователя, пароль, адрес электронной почты, токен в схеме моих людей.

    "token" : "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MzAxMzg4NTQsInN1YiI6IjU1M2RlMjcwYmVkMDY5MTYwOWRiMWRkNyIsImV4cCI6MTQzMTM0ODQ1NH0.-H8m19tWeOgDXcem9pNjD3XXefMgGKv-ao3U8W9_P1U",

"username": <username>,
"password": <password>,
"email": <email>

Я кодирую свой токен следующим образом, используя

def create_token(user):
payload = {
    'sub': str(user['_id']),
    'iat': datetime.now(),
    'exp': datetime.now() + timedelta(days=14)
}

token = jwt.encode(payload, TOKEN_SECRET)
return token.decode('unicode_escape')

обновление моего токена возврата в базу данных следующим образом после успешного входа пользователя в систему

accounts = app.data.driver.db['people']
 accounts.update({'email': request.json['email']},{"$set":{'token':token}})

Функция аутентификации My Token показана ниже.

class TokenAuth(TokenAuth):
def check_auth(self, token, allowed_roles, resource, method):
    accounts = app.data.driver.db['people']
    return accounts.find_one({'token': token})

Мой TokenAuth включается следующим образом.

app = Eve(__name__,static_url_path='/static', auth=TokenAuth)

отправка запроса с помощью curl следующим образом

curl -X GET "http://127.0.0.1:8000/api/people" -H "Content-Type: application/json" -H "Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MzAxMzg4NTQsInN1YiI6IjU1M2RlMjcwYmVkMDY5MTYwOWRiMWRkNyIsImV4cCI6MTQzMTM0ODQ1NH0.-H8m19tWeOgDXcem9pNjD3XXefMgGKv-ao3U8W9_P1U"

получение следующей ошибки

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

person narayanaraju raju    schedule 27.04.2015    source источник


Ответы (3)


Думаю проблема может быть в:

curl -X GET "http://127.0.0.1:8000/api/people" -H "Content-Type: application/json" -H "Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MzAxMzg4NTQsInN1YiI6IjU1M2RlMjcwYmVkMDY5MTYwOWRiMWRkNyIsImV4cCI6MTQzMTM0ODQ1NH0.-H8m19tWeOgDXcem9pNjD3XXefMgGKv-ao3U8W9_P1U"

Особенно в:

-H "Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MzAxMzg4NTQsInN1YiI6IjU1M2RlMjcwYmVkMDY5MTYwOWRiMWRkNyIsImV4cCI6MTQzMTM0ODQ1NH0.-H8m19tWeOgDXcem9pNjD3XXefMgGKv-ao3U8W9_P1U"

Думаю должно быть: Basic + base64(token+':')

Я использую эту функцию в python:

def authorization(token):
    return 'Basic ' + str(base64.b64encode(token + ':'))

In [6]: token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MzAxMzg4NTQsInN1YiI6IjU1M2RlMjcwYmVkMDY5MTYwOWRiMWRkNyIsImV4cCI6MTQzMTM0ODQ1NH0.-H8m19tWeOgDXcem9pNjD3XXefMgGKv-ao3U8W9_P1U"

In [7]: print 'Basic ' + str(base64.b64encode(token + ':'))
Basic ZXlKaGJHY2lPaUpJVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5LmV5SnBZWFFpT2pFME16QXhNemc0TlRRc0luTjFZaUk2SWpVMU0yUmxNamN3WW1Wa01EWTVNVFl3T1dSaU1XUmtOeUlzSW1WNGNDSTZNVFF6TVRNME9EUTFOSDAuLUg4bTE5dFdlT2dEWGNlbTlwTmpEM1hYZWZNZ0dLdi1hbzNVOFc5X1AxVTo=

Следовательно:

-H "Authorization: Basic ZXlKaGJHY2lPaUpJVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5LmV5SnBZWFFpT2pFME16QXhNemc0TlRRc0luTjFZaUk2SWpVMU0yUmxNamN3WW1Wa01EWTVNVFl3T1dSaU1XUmtOeUlzSW1WNGNDSTZNVFF6TVRNME9EUTFOSDAuLUg4bTE5dFdlT2dEWGNlbTlwTmpEM1hYZWZNZ0dLdi1hbzNVOFc5X1AxVTo="
person Anihur    schedule 27.04.2015

Я использую следующий URL-адрес, чтобы получить идентификатор зарегистрированного пользователя.

@app.route('/api/me')
@login_required
def me():
    return Response(json.dumps(g.user_id),  mimetype='application/json'

отправка зашифрованного токена пользователю с помощью следующего кода.

def create_token(user):
payload = {
   'sub': str(user['_id']),
   'iat': datetime.now(),
   'exp': datetime.now() + timedelta(days=14)
}

  token = jwt.encode(payload, TOKEN_SECRET)
return token.decode('unicode_escape')

Итак, мой вопрос: как зашифровать токен для ответа выше

  Basic base64.encode(token+':') format in my code

Я получаю следующую ошибку при выполнении следующего пути

'Basic ' + str(base64.b64encode(token + ':'))

ошибка:

decoder error not enough segments for api/me url 
person narayanaraju raju    schedule 28.04.2015

Я использовал эти две функции:

def headers(token, etag=False):
   headers = { 
            'Content-type': 'application/json; charset=utf-8',
            'Accept': 'application/json',
            'Authorization': authorization(token)
        }   
    if etag:
        headers['If-Match'] = etag
    return headers


def authorization(token):
    import base64
    return 'Basic ' + str(base64.b64encode(token + ':'))

Это работает для меня

person Anihur    schedule 29.04.2015
comment
где мне нужно определить эти две функции и когда мне нужно их вызвать. - person narayanaraju raju; 30.04.2015
comment
Код моего сервера определен по следующей ссылке [ссылка] github.com/suryamuppalla/ forsatya/blob/master/server.py - person narayanaraju raju; 30.04.2015
comment
через curl ваш приведенный выше ответ выполняется отлично. На сервере, как получить токен из внешнего интерфейса, я точно не знаю. - person narayanaraju raju; 30.04.2015
comment
Я использую эти функции для подключения к серверу Eve. С обоими я делаю правильные заголовки для HTTP-запроса - person Anihur; 01.05.2015