如何使用idToken / refreshToken / AccessToken更改<Authenticator />-authState

时间:2019-06-20 08:47:28

标签: reactjs aws-amplify authenticator

我的应用程序使用Authenticator-component通过Coginto UserPools处理登录和权限。当用户通过我们的CustomSignIn-Component登录时,此方法很好用。

但是,有时登录需要通过第三方网站,并且需要绕过CustomSignIn组件。我能够获取登录详细信息(正确的访问令牌,刷新令牌,ID令牌),但是我不知道如何使用这些更改身份状态。 authState保持为“登录/注销”。

我尝试使用联合登录(正文包含正确的access_token,也尝试使用id_token尝试)

const temp = await Auth.federatedSignIn(
  'OurLoginProvider',
  {
  token: body.accessToken,
  expires_at: body.expiresIn,
  },
  'our.user@url.whatever'
)

这基本上是我们的应用在Authenticator组件级别上的外观。

<Authenticator
    hide={[Greetings, SignIn, ConfirmSignIn, RequireNewPassword, VerifyContact, ForgotPassword, TOTPSetup, Loading]}
    amplifyConfig={config}
>
    <CustomAwsSignIn    />
    <CustomAwsForgotPassword    />
    <App />
</Authenticator>;

然后在App-componentDidMount()中,我将获取正确的令牌:

// parsed === singleuse password for fetching tokens from aws userpool, taken from url
const parsed = queryString.parse(this.props.location.search);
if (parsed.code) {
    fetch('https://our.web.url/oauth2/token', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
        },
        body: queryString.stringify({
            grant_type: 'authorization_code',
            code: parsed.code,
            client_id: 'xxxyyxyxyxyxyxyxyxyyxy',
            redirect_uri: 'https://our.redirect-url',
        }),
    })
        .then(function (res) {
            return res.json();
        })
        .then(async function (body) {
            console.log('body', body);
            // this gives me following object
            // {
            //  access_token: "... correct access_token..."
            //  expires_in: 3600
            //  id_token: "... correct id_token..."
            //  refresh_token: "... correct refresh_token..."
            //  token_type: "Bearer"
            // }
        });

我希望能够使用这些标记来更改-components authState,但是我还没有找到任何方法来实现。

Auth.federatedSign()方法给出以下错误:

  

NotAuthorizedException:此身份池不支持未经身份验证的访问。

实际上,我认为这是指身份池,而不是我们正在使用的Cognito userPool。

我应该有一些if语句/三元运算符来检查这些令牌是否已被获取,并在没有Authenticator的情况下启动App组件。例如:

{!fetchedTokens ?
 (
 <Authenticator
    hide={[Greetings, SignIn, ConfirmSignIn, RequireNewPassword, 
 VerifyContact, ForgotPassword, TOTPSetup, Loading]}
    amplifyConfig={config}
 >
    <CustomAwsSignIn    />
    <CustomAwsForgotPassword    />
    <App />
 </Authenticator>;
 )
: (
 <App fetchedTokens={fetchedTokens}
)

有人建议如何进行此操作吗?

0 个答案:

没有答案