python 前夕,基于令牌的身份验证出错

Getting error in token based authentication in python 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')

在用户成功登录后,按以下方式将我的 return 令牌更新到数据库中

accounts = app.data.driver.db['people']
 accounts.update({'email': request.json['email']},{"$set":{'token':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}}

我认为问题出在:

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

我正在使用以下 url 来获取登录的用户 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 

我使用了这两个函数:

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

这对我有用