Исправление «Состояние для CSRF не корректно» с Python flask -awscognito и boto3 / request - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь использовать flask -awscognito для создания простого примера сервера и клиента, который аутентифицируется с помощью AWS Cognito, но я получаю сообщение об ошибке, не могу найти документацию о том, как исправить.

Сервер падает с этой ошибкой:

flask_awscognito.exceptions.FlaskAWSCognitoError: State for CSRF is not correct

Это код сервера:

from flask import request, jsonify
import flask.json
from flask_awscognito import AWSCognitoAuthentication

app = flask.Flask(__name__)

app.config['AWS_DEFAULT_REGION'] = '...' # from the user pool console page
app.config['AWS_COGNITO_DOMAIN'] = '...' # just used the domain name of eventual app's domain here but I don't know if it's associate with the pool in any way. This might as well be a random string.
app.config['AWS_COGNITO_USER_POOL_ID'] = '...' # from the user pool console page
app.config['AWS_COGNITO_USER_POOL_CLIENT_ID'] = '...' # from the user pool console page
app.config['AWS_COGNITO_USER_POOL_CLIENT_SECRET'] = '' # from the user pool console page
app.config['AWS_COGNITO_REDIRECT_URL'] = 'http://localhost:5000/aws_cognito_redirect' # left this from the docs but not sure what I'll have it as in the future.

aws_auth = AWSCognitoAuthentication(app)

@app.route("/auth_test")
@aws_auth.authentication_required
def auth_test ():
    print (request.args)
    return jsonify({
        "claims" : aws_auth.claims,
        "token" : aws_auth.get_access_token(request.args)
    })

if __name__ == "__main__":
    app.run(debug=True)

Это код клиента:

import requests
import boto3

host = "http://127.0.0.1:5000"
region = '...' # same as in server
user_pool_id = '...' # same as in server
username = '...' # a user that is in the pool
password = '...' # correct password from the pool
app_client_id = '...' # same as in server
client = boto3.client('cognito-idp', region_name = region)
route = "/auth_test"

auth_response = client.admin_initiate_auth(
    UserPoolId = user_pool_id,
    ClientId = app_client_id,
    AuthFlow = 'ADMIN_NO_SRP_AUTH',
    AuthParameters = {
        'USERNAME' : username,
        'PASSWORD' : password
    }
)
print (auth_response)
id_token = auth_response['AuthenticationResult']['IdToken']
response = requests.get(host + route , headers = { 'Authorization': "Bearer " + id_token })
print(response.json())

Notice I ' Я не передаю STATE=whatever в моем клиенте как сообщение arg. Не уверен, что это будет. Я гуглил вокруг того, включено ли это в ответ аутентификации, который я получаю. Возможно, это требуется. Я не уверен, что мне даже нужен CSRF в моем одностраничном приложении с Cognito для управления сессиями. Я в порядке, отключив сервер, нуждающийся в этом или включающий во всех клиентах, которые отправляют данные Я просто хочу, чтобы он работал правильно.

Кто-нибудь знает, как исправить эту ошибку? Спасибо!

Я попытался добавить следующие строки после поиска в Google для похожих проблем, и это не изменило сообщение об ошибке.

from flask_cors import CORS
CORS(app)

1 Ответ

0 голосов
/ 17 февраля 2020

Правильное значение state должно быть сгенерировано на flask на стороне сервера и передано AWS Cognito, а затем обратно.

Вам необходимо настроить и app.config['AWS_COGNITO_DOMAIN'], и app.config['AWS_COGNITO_REDIRECT_URL'], а затем вы можете использовать aws_auth.get_sign_in_url() для генерации URL для AWS Cognito с правильным значением state. Например:

@app.route('/sign_in')
def sign_in():
    return redirect(aws_auth.get_sign_in_url())

См. в этом примере .

...