AWS Cognito 和 Flask 应用无法从 url 获取 jwt
AWS Cognito & Flask app can't grab the jwt from the url
我有这个简单的 Flask 应用程序,当您访问登录页面时,它会将您重定向到您登录的 AWS Cognito 门户,然后您将重定向到 url 中带有 jwt 的网页。我正在尝试从 url 获取 jwt 但没有运气。
一切正常,
- 我访问应用程序(本地)
- 我被重定向到 AWS Cognito 门户
- 我登录并重定向到 flask 应用程序
- 我尝试获取 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)
我有这个简单的 Flask 应用程序,当您访问登录页面时,它会将您重定向到您登录的 AWS Cognito 门户,然后您将重定向到 url 中带有 jwt 的网页。我正在尝试从 url 获取 jwt 但没有运气。
一切正常,
- 我访问应用程序(本地)
- 我被重定向到 AWS Cognito 门户
- 我登录并重定向到 flask 应用程序
- 我尝试获取 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)