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