#javascript #reactjs #oauth-2.0 #oauth #okta
Вопрос:
У нас есть приложение react, в котором мы пытаемся реализовать поток кода аутентификации с помощью социальных логинов с помощью Facebook. После аутентификации мы будем отправлять запросы на наш сервер, который будет проверять токен доступа JWT при каждом вызове.
При попытке войти в систему с помощью Facebook мы успешно перенаправляемся обратно на наш redirect_uri с помощью кода аутентификации, но прежде чем мы сможем обменять код аутентификации на токен доступа, мы получим следующую ошибку:
AuthSdkError: Unable to retrieve OAuth redirect params from storage
У нас есть простой компонент, который обрабатывает URI обратного вызова и конфигурацию Okta следующим образом:
const oktaAuth = new OktaAuth({
clientId: CLIENT_ID,
issuer: ISSUER,
redirectUri: REDIRECT_URI,
scopes: ['openid', 'profile', 'email'],
pkce: true,
disableHttpsCheck: OKTA_TESTING_DISABLEHTTPSCHECK,
});
function App() {
const history = useHistory();
const restoreOriginalUri = async (_oktaAuth: any, originalUri: any) => {
history.replace(toRelativeUrl(originalUri || '/', window.location.origin));
};
return (
<Security oktaAuth={oktaAuth} restoreOriginalUri={restoreOriginalUri}>
<UserDataProvider>
<Switch>
<Route path="/" exact component={isAuthenticated ? Home : Login} />
<SecureRoute path="/protected" exact component={Home} />
<Route path="/login/callback" component={LoginCallback} /> // LoginCallback from the Okta SDK (@okta/okta-react)
<Redirect to="/" />
</Switch>
</UserDataProvider>
</Security>
);
}
Похоже, ошибка исходит от LoginCallback
компонента в SDK Okta.
У нас есть такой URL-адрес, который обрабатывает наш логин и должен перенаправлять нас в наше приложение: https://${ourOktaDomain}/oauth2/v1/authorize?idp=${idp}amp;client_id=${clientId}amp;response_type=codeamp;response_mode=queryamp;scope=openid emailamp;redirect_uri=http://localhost:3000/login/callbackamp;state=${randomString}amp;code_challenge=${anotherRandomString}amp;code_challenge_method=S256
- Почему мы получаем эту ошибку?
- Что Okta пытается извлечь из хранилища и о каком хранилище идет речь (локальном / сеансовом и т. Д.).
- Должны ли мы устанавливать какое-то значение в хранилище перед перенаправлением на вышеупомянутый URL-адрес входа в систему Okta?
- Является ли наш объект конфигурации OktaAuth правильным? Правильно ли использовать PKCE?
Комментарии:
1. откуда берется эта
idp
ценность?2. Это значение нашего поставщика удостоверений личности, которое мы получаем от Okta, когда мы создаем поставщика удостоверений личности в Okta в разделе безопасность -> Поставщик удостоверений личности
3.
code_challenge
это не случайная строка, я видел ваш последующий вопрос…
Ответ №1:
Оказывается, мне следовало использовать SDK Okta для создания строки аутентификации, а не создавать ее самостоятельно. SDK обрабатывает закулисные действия, особенно для PKCE, для которого требуется, чтобы преобразователь кода хранился в локальном хранилище, а затем извлекался, когда пользователь перенаправляется в приложение после успешного входа.
Вот как я справился с этим с помощью SDK:
const onSocialLogin = () => {
oktaAuth.signInWithRedirect({
originalUri: '/welcome',
clientId: CLIENT_ID,
redirectUri: encodeURI(REDIRECT_URI),
responseType: 'code',
responseMode: 'query',
state,
nonce,
codeChallenge,
codeChallengeMethod: 'S256',
scopes: ['openid', 'email'],
idp: FACEBOOK_APP_ID
});
};