AWS Cognito 和 Flask 应用无法从 url 获取 jwt

AWS Cognito & Flask app can't grab the jwt from the url

我有这个简单的 Flask 应用程序,当您访问登录页面时,它会将您重定向到您登录的 AWS Cognito 门户,然后您将重定向到 url 中带有 jwt 的网页。我正在尝试从 url 获取 jwt 但没有运气。

一切正常,

这是代码和我到目前为止尝试过的内容

from flask import Flask, render_template, redirect, request
app = Flask(__name__)

@app.route('/')
def landing_page():
    print('*' * 20)
    print(request.args)
    print(request.data.decode('UTF-8'))
    print(request.get_json())
    print(request.values)
    print(request.json)
    print(request.headers)
    print(request.headers.get('#id_token'))
    print(request.headers.get('id_token'))
    print(request.get_data().decode('UTF-8'))
    print(request.get_data())
    print(request.stream.read().decode('UTF-8'))
    print(request.args.get('id_token'))
    print(request.stream.read())
    print(request.args.to_dict([]))
    print(request.args.to_dict())
    print(request.args.get('id_token'))
    try:
        print(request.args['id_token'])
    except:
        print('pass')
    print('*' * 20)
    return redirect('https://xxx.auth.eu-central-1.amazoncognito.com/login?response_type=token&client_id=xxxxx&redirect_uri=http://localhost:5000/',
                    code=302)

结果

127.0.0.1 - - [17/Mar/2021 08:35:02] "GET / HTTP/1.1" 302 -
********************
ImmutableMultiDict([])

None
CombinedMultiDict([ImmutableMultiDict([]), ImmutableMultiDict([])])
None
Host: localhost:5000
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/xxxx Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Sec-Ch-Ua: "Google Chrome";v="89", "Chromium";v="89", ";Not A Brand";v="99"
Sec-Ch-Ua-Mobile: ?0
Accept-Encoding: gzip, deflate, br
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
Cookie: _xsrf=2|xxx|xxx|xxxx


None
None

b''

None
b''
{}
{}
pass
None
********************
127.0.0.1 - - [17/Mar/2021 08:35:05] "GET / HTTP/1.1" 302 -

Amazon Cognito 在重定向到您的应用程序时在您的 URL 中设置 code 查询字符串。

例如,如果我将我的 Amazon Cognito App Client 重定向 URL 配置为 http://localhost:5000/cognito_redirect,我将拥有:

http://localhost:5000/cognito_redirect?code=bd5xxxxx-xxx5-xx1f-97xx-xxxxx3exxxx7

您可以从 URL 检索它,例如:

@app.route('/cognito_redirect')
def cognito_redirect():
  print(request.args.get('code'))

记录以下内容:

bd5xxxxx-xxx5-xx1f-97xx-xxxxx3exxxx7
127.0.0.1 - - [19/Mar/2021 23:23:02] "GET /cognito_redirect?code=bd5xxxxx-xxx5-xx1f-97xx-xxxxx3exxxx7 HTTP/1.1" 200 -

有关 request 对象的更多详细信息,请参阅 Flask documentation

更新2021-03-27

大家好,我使用 AWS CloudFormation 为 Amazon Cognito 用户池创建了一个工作示例(明确显示了您可以使用的配置)+ 一个具有单一路由的示例 Flask 应用程序

https://github.com/oieduardorabelo/2021-03-27-flask-with-cognito

您可以查看自述文件中有关如何部署它的说明以及有关 Cognito 中 OAuth 重定向要求的一些详细信息。

这不是 Amazon Cognito 配置的详尽列表,配置它的方法还有很多,但是,它显示了让 OAuth 正常工作所需的最低限度。

我这里有另一个 Node.js 的例子:

https://github.com/oieduardorabelo/node-amazon-cognito-oauth

从发布的 link 中,请注意您似乎感兴趣的 id_token 是 redirect_uri 的参数,而不是主要 url 的参数。因此,您需要获取重定向 url,并解析它以从中获取 id_token。

import urllib.parse as urlparse
from urllib.parse import parse_qs

@app.route('/')
def landing_page():
    try:
        redirect_url = request.args['redirect_uri']
        print(redirect_url)
        parsed = urlparse.urlparse(redirect_url)
        id_token = parse_qs(parsed.query)['id_token']
        print(id_token)
    except:
        print('pass')
    return redirect('https://xxx.auth.eu-central-1.amazoncognito.com/login?response_type=token&client_id=xxxxx&redirect_uri=http://localhost:5000/',
                    code=302)