使用 Cognito 用户池的 AWS Amplify Auth 不返回随机数或 JWT id_token 中的 at_hash 声明
AWS Amplify Auth with Cognito User Pool not returning nonce or at_hash claim in JWT id_token
我正在尝试使用 Amplify Auth 来实现 OpenID Connect 隐式流,以向许多 React 客户端提供 SSO。
我已经能够使用 Cognito Hosted UI 来实现这一点,但这需要其他应用程序用户单击按钮确认登录才能进行身份验证。我更希望它是无缝的 ie 当用户登录一个站点并导航到另一个站点时,如果他们与身份验证提供程序进行会话,他们将自动进行身份验证。
为了尝试实现这一点,我设置了一个单独的 Amplify 应用程序,它使用 React Authenticator 组件。
我可以使用它进行身份验证并重定向回客户端。但是 id_token
不包含 at_hash
或 nonce
声明。据推测,缺少 at_hash
是因为身份验证提供程序应用程序在使用 Cognito 进行身份验证时未发送 token id_token
的 responseType
。 nonce
不见了,因为我还没有找到传递它的方法。
有没有办法让 Amplify Authenticator SignIn 请求带有 at_hash
声明的 id_token
?
是否可以将 nonce
值传递给 id_token
声明?
备注
我正在努力遵守:https://openid.net/specs/openid-connect-core-1_0.html#ImplicitFlowSteps
专门针对这部分:3.2.2.10。 ID令牌
import React from 'react';
import { Authenticator, ConfirmSignIn, SignIn } from 'aws-amplify-react';
import Amplify, { Auth } from 'aws-amplify';
import awsconfig from './aws-exports';
Amplify.configure(awsconfig);
const getSearchParams = () =>
window.location.search.substr(1);
const getValueFromSearchParam = (key) =>
new URLSearchParams(getSearchParams()).get(key);
const getRedirectUri = () => {
const redirect_uri = getValueFromSearchParam('redirect_uri');
return redirect_uri ? decodeURI(redirect_uri) : null;
};
const Login = () => {
const handleAuthStateChange = (state) => {
if(state === 'signedIn') {
const redirect_uri = getRedirectUri();
const state = getValueFromSearchParam('state');
if(redirect_uri === null) {
throw new Error('No redirect_uri provided');
}
Auth.currentSession().then(currentSession => {
const id_token = currentSession.idToken.jwtToken;
const access_token = currentSession.accessToken.jwtToken;
const redirect = `${redirect_uri}#access_token=${access_token}&id_token=${id_token}&state=${state}`;
window.location.replace(redirect);
}).catch(err => console.error(err));
}
};
return (
<Authenticator
hideDefault={true}
onStateChange={handleAuthStateChange}
>
<SignIn />
<ConfirmSignIn/>
</Authenticator>
);
};
这里有几个问题您可能会感兴趣:
- 正如您所注意到的,Cognito 缺少一些基于标准的支持
- 如果您使用 response_type = 令牌 id_token,您将被限制为固定的 60 分钟用户会话
- 就 nonce 参数等而言,Amplify 可能不是最标准的库
- 目前建议对 SPA 使用授权代码流 (PKCE) - 您可能会发现这是一种更简单的方法来实现您正在寻找的 post 登录检查
不幸的是,您在使用 Cognito 时可能需要做出一些权衡 - 并做出 'least bad choice'。如果有帮助,这里有一些我的东西可以比较:
我正在尝试使用 Amplify Auth 来实现 OpenID Connect 隐式流,以向许多 React 客户端提供 SSO。
我已经能够使用 Cognito Hosted UI 来实现这一点,但这需要其他应用程序用户单击按钮确认登录才能进行身份验证。我更希望它是无缝的 ie 当用户登录一个站点并导航到另一个站点时,如果他们与身份验证提供程序进行会话,他们将自动进行身份验证。
为了尝试实现这一点,我设置了一个单独的 Amplify 应用程序,它使用 React Authenticator 组件。
我可以使用它进行身份验证并重定向回客户端。但是 id_token
不包含 at_hash
或 nonce
声明。据推测,缺少 at_hash
是因为身份验证提供程序应用程序在使用 Cognito 进行身份验证时未发送 token id_token
的 responseType
。 nonce
不见了,因为我还没有找到传递它的方法。
有没有办法让 Amplify Authenticator SignIn 请求带有
at_hash
声明的id_token
?是否可以将
nonce
值传递给id_token
声明?
备注 我正在努力遵守:https://openid.net/specs/openid-connect-core-1_0.html#ImplicitFlowSteps 专门针对这部分:3.2.2.10。 ID令牌
import React from 'react';
import { Authenticator, ConfirmSignIn, SignIn } from 'aws-amplify-react';
import Amplify, { Auth } from 'aws-amplify';
import awsconfig from './aws-exports';
Amplify.configure(awsconfig);
const getSearchParams = () =>
window.location.search.substr(1);
const getValueFromSearchParam = (key) =>
new URLSearchParams(getSearchParams()).get(key);
const getRedirectUri = () => {
const redirect_uri = getValueFromSearchParam('redirect_uri');
return redirect_uri ? decodeURI(redirect_uri) : null;
};
const Login = () => {
const handleAuthStateChange = (state) => {
if(state === 'signedIn') {
const redirect_uri = getRedirectUri();
const state = getValueFromSearchParam('state');
if(redirect_uri === null) {
throw new Error('No redirect_uri provided');
}
Auth.currentSession().then(currentSession => {
const id_token = currentSession.idToken.jwtToken;
const access_token = currentSession.accessToken.jwtToken;
const redirect = `${redirect_uri}#access_token=${access_token}&id_token=${id_token}&state=${state}`;
window.location.replace(redirect);
}).catch(err => console.error(err));
}
};
return (
<Authenticator
hideDefault={true}
onStateChange={handleAuthStateChange}
>
<SignIn />
<ConfirmSignIn/>
</Authenticator>
);
};
这里有几个问题您可能会感兴趣:
- 正如您所注意到的,Cognito 缺少一些基于标准的支持
- 如果您使用 response_type = 令牌 id_token,您将被限制为固定的 60 分钟用户会话
- 就 nonce 参数等而言,Amplify 可能不是最标准的库
- 目前建议对 SPA 使用授权代码流 (PKCE) - 您可能会发现这是一种更简单的方法来实现您正在寻找的 post 登录检查
不幸的是,您在使用 Cognito 时可能需要做出一些权衡 - 并做出 'least bad choice'。如果有帮助,这里有一些我的东西可以比较: