Мое приложение использует Authenticator-компонент для обработки входа в систему и разрешений через Coginto UserPools. Это прекрасно работает, когда пользователи входят через наш CustomSignIn-компонент.
Однако иногда для входа в систему необходимо пройти через сторонний сайт и обойти компонент CustomSignIn. Я могу получить данные для входа (правильный токен доступа, токен обновления, идентификатор токена), но я не знаю, как изменить authState, используя их. 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"
// }
});
Я бы ожидал, что смогу изменить -компоненты authState с этими токенами, но я не нашел способа сделать это.
Auth.federatedSign () - метод выдает следующую ошибку:
NotAuthorizedException: доступ без аутентификации для этого пула удостоверений не поддерживается.
И на самом деле я думаю, что это относится к пулам удостоверений, а не к пользовательским пулам Cognito, которые мы используем.
Должен ли я иметь какой-либо оператор if / троичный оператор, который проверяет, были ли получены эти токены, и запускает компонент App без Authenticator. Например:
{!fetchedTokens ?
(
<Authenticator
hide={[Greetings, SignIn, ConfirmSignIn, RequireNewPassword,
VerifyContact, ForgotPassword, TOTPSetup, Loading]}
amplifyConfig={config}
>
<CustomAwsSignIn />
<CustomAwsForgotPassword />
<App />
</Authenticator>;
)
: (
<App fetchedTokens={fetchedTokens}
)
Любой совет, как поступить в этом?