我也为此苦苦挣扎;我同意文档有点轻。
您提供的链接显示了您的 Cognito UI URL 的样子:
https://<your_domain>/login?response_type=code&client_id=<your_app_client_id>&redirect_uri=<your_callback_url>
想法是您将用户发送到此 URI,他们开展业务,然后使用某种令牌或代码将他们重定向回您。您可以通过点击左侧导航栏中的“域名”来查看您的域名。
应用客户端设置和 OAuth 授权类型
首先,检查您的应用客户端设置。您需要将回调 URL(Cognito 将重定向回的位置)列入白名单,并确保至少允许一个 OAuth 流。
Cognito App client settings
“授权码授予”将返回一个授权码,然后您将其发送到oauth2/token 端点以获取 access_token、id_token 和 refresh_token。如果您有后端应用程序并需要刷新令牌,这是一个不错的选择。
“隐式授权”是我在前端应用程序中使用的。它将直接向我的前端应用返回一个访问令牌和一个 ID 令牌。
要使用隐式授权,请将您的 Cognito UI URL 中的 response_type=code 更改为 response_type=token。
隐式授权示例
因此,如果您的身份验证成功后的重定向如下所示:
https://localhost:3000/#access_token=eyJraWQiOiJG...&id_token=eyJraWQZNg....&token_type=Bearer&expires_in=3600
您只需从 URL 中剥离 id_token 并将其发送到 Cognito,并将您的用户池作为登录映射中的键。在 JavaScript 中:
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: 'us-east-1:bxxxxxx6-cxxx-4xxx-8xxx-xxxxxxxxxx3c',
Logins: {
'cognito-idp.us-east-1.amazonaws.com/us-east-1_ixxxxxxx': idToken
}
});
idToken 是在重定向时返回给您的 id 令牌。
授权码授予类型
如果您改用授权代码授权类型 (response_type=code),您的后端将需要调用 /oauth2/token 端点以将代码交换为令牌。该调用看起来像这样:
curl -X POST \
https://<my-cognito-domain>.auth.us-east-1.amazoncognito.com/oauth2/token \
-H 'content-type: application/x-www-form-urlencoded' \
-d 'grant_type=authorization_code&scope=email%20openid%20profile&redirect_uri=https%3A%2F%2Flocalhost%3A3000%2F&client_id=15xxxxxxxxxxxxxx810&code=54826355-b36e-4c8e-897c-d53d37869ee2'
然后你可以像上面一样把这个 id 令牌给 Cognito。
用户界面说明
当用户单击链接时,我的应用程序会在新选项卡中弹出 Cognito UI。当重定向返回到我的应用程序时,我使用 postMessage() 将令牌发送到父窗口,然后关闭新选项卡。我认为这是一种比较常见的模式。
我还没有尝试过,但我猜想将 UI 渲染到 iframe 中是不允许的,以缓解点击劫持。 Source
我希望这至少有点帮助。祝你好运!