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