【问题标题】:AWS Amplify Auth with Cognito User Pool not returning nonce or at_hash claim in JWT id_tokenAWS Amplify Auth with Cognito User Pool 未在 JWT id_token 中返回 nonce 或 at_hash 声明
【发布时间】:2020-06-03 16:32:31
【问题描述】:

我正在尝试使用 Amplify Auth 来实现 OpenID Connect 隐式流程,以便为许多 React 客户端提供 SSO。

我已经能够使用 Cognito 托管 UI 进行此操作,但这需要其他应用程序用户单击按钮确认登录才能进行身份验证。当用户登录一个站点并导航到另一个站点时,我希望它是无缝的ie,如果他们与身份验证提供程序有会话,他们会自动进行身份验证。

为了尝试实现这一点,我设置了一个单独的 Amplify 应用程序,该应用程序使用 React Authenticator 组件。

我能够对此进行身份验证并重定向回客户端。但是 id_token 不包含 at_hashnonce 声明。据推测,at_hash 丢失是因为身份验证提供程序应用程序在使用 Cognito 进行身份验证时未发送token id_tokenresponseTypenonce 丢失了,因为我还没有找到将它传入的方法。

  1. 有没有办法让 Amplify Authenticator SignIn 请求带有 at_hash 声明的 id_token

  2. 是否可以将nonce 值传递给id_token 声明?

注意 我正在努力遵守:https://openid.net/specs/openid-connect-core-1_0.html#ImplicitFlowSteps 专门针对这部分:3.2.2.10。身份令牌

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>
    );
};

【问题讨论】:

    标签: amazon-web-services authentication amazon-cognito openid-connect aws-amplify


    【解决方案1】:

    这里有几个可能感兴趣的问题:

    • 如您所见,Cognito 缺乏一些基于标准的支持
    • 如果您使用 response_type = token id_token,您将被限制为固定 60 分钟的用户会话
    • 就 nonce 参数等而言,Amplify 可能不是最标准的库
    • 现在建议 SPA 使用授权代码流 (PKCE) - 您可能会发现这是一种更简单的方法来实施您正在寻找的登录后检查

    不幸的是,在使用 Cognito 时您可能需要做出一些权衡 - 并做出“最不坏的选择”。如果有帮助,这里有一些我的东西可以比较:

    【讨论】:

    • 非常感谢。我一直在慢慢得出类似的结论,很难完全排除任何事情,因为我通常把它归结为我错过了一些东西。所以听到这个真的很有帮助。明天早上我会阅读这些链接。
    • 授权代码流 (PKCE) 看起来也很有希望。
    • cognito 不支持使用自定义 UI 的身份验证代码流
    猜你喜欢
    • 2019-10-30
    • 2020-03-19
    • 2019-06-29
    • 2021-01-01
    • 2021-09-12
    • 2019-05-06
    • 2019-03-04
    • 2021-04-26
    • 2018-02-11
    相关资源
    最近更新 更多