我的应用程序使用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}
)
有人建议如何进行此操作吗?