У меня проблемы с получением клиентом и сервером простой AWS авторизации Cognito для согласования того, как должен выглядеть токен.
Мой клиент использует boto3 и запросы. Я передаю авторизацию в заголовке, который я видел в более чем половине учебников, но я также видел использование параметра auth, который я не использую.
Вот мой сервер:
from flask import request, jsonify, make_response
import flask.json
from flask_jwt_extended import (
JWTManager, jwt_required, create_access_token,
get_jwt_identity
)
app = flask.Flask(__name__)
# from: https://flask-jwt-extended.readthedocs.io/en/stable/basic_usage/
# Setup the Flask-JWT-Extended extension
app.config['JWT_SECRET_KEY'] = 'super-secret' # Change this!
jwt = JWTManager(app)
@app.route("/auth_test")
@jwt_required
def auth_test ():
current_user = get_jwt_identity()
return jsonify({"current_user": "current_user"})
if __name__ == "__main__":
app.run(debug=True)
Одна подсказка здесь заключается в том, что JWT_SECRET_KEY скопирован из учебника, но мне неясно, на что мне нужно его изменить. Возможно, это моя проблема, но если это так, я не вижу решения или того, как его изменить.
Вот мой клиент:
import requests
import boto3
host = "http://127.0.0.1:8000"
region = '...'
user_pool_id = '...'
username = '...'
password = '...'
app_client_id = '...'
client = boto3.client('cognito-idp', region_name = region)
auth_response = client.admin_initiate_auth(
UserPoolId = user_pool_id,
ClientId = app_client_id,
AuthFlow = 'ADMIN_NO_SRP_AUTH',
AuthParameters = {
'USERNAME' : username,
'PASSWORD' : password
}
)
id_token = auth_response['AuthenticationResult']['IdToken']
response = requests.get(host + "/auth_test" , headers = { 'Authorization': id_token })
print(response.json())
Он печатает: {'msg': «Неверный заголовок авторизации. Ожидаемое значение« Носитель »»}
Это указывает на то, что я должен передать "Bearer " + id_token
вместо id_token
, но это противоречит большинству учебных пособий, которые я прочитал, и более того, когда я это делаю что я все еще получаю ту же ошибку.
Кто-нибудь знает, что я делаю неправильно?
РЕДАКТИРОВАТЬ:
Я внес некоторые изменения из-за комментариев. Я добавил
app.config['JWT_ALGORITHM'] = 'RS256'
app.config['JWT_DECODE_ALGORITHMS'] = ['RS256']
#app.config['JWT_PUBLIC_KEY'] = '...' # value that I got from https://cognito-idp.us-east-1.amazonaws.com/<my pool id>/.well-known/jwks.json. There were two entries I tried both values found in kid
RS256 соответствует кодировке Cognito, поэтому я думаю, что мне нужно установить это для моего сервера. Однако теперь я просто получаю эту ошибку при запуске демонстрации:
ValueError: Could not deserialize key data.
Спасибо за помощь!