在python前夕获取基于令牌的身份验证中的错误

时间:2015-04-27 07:34:32

标签: python authentication jwt eve

我正在使用基于令牌的身份验证,以便让已登录的用户访问我的网站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}})

我的令牌认证功能如下所示。

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}}

3 个答案:

答案 0 :(得分:0)

我认为问题出在:

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="

答案 1 :(得分:0)

我正在使用以下网址获取记录用户ID。

@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 

答案 2 :(得分:0)

我使用了这两个功能:

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 + ':'))

这对我有用