Как передать сеанс Amplify Cognito от реакции нативного на веб-просмотр? - PullRequest
2 голосов
/ 24 октября 2019

У меня есть собственное приложение реагирования, которое отображает WebView веб-приложения.

Реагирующее собственное приложение использует Cognito и Amplify для аутентификации. Веб-приложение также использует те же Cognito и Amplify для аутентификации.

У меня есть поток входа, построенный с использованием нативного реагирования, который имеет адрес электронной почты / пароль и федеративные входы Oauth в социальных сетях. Оба эти потока входа в систему успешно работают в собственном пространстве реакции и возвращают

CognitoUserSession {
  idToken: CognitoIdToken, 
  refreshToken: CognitoRefreshToken, 
  accessToken: CognitoAccessToken, 
  clockDrift: 0
}

Когда собственное приложение реагирования отображает WebView, веб-приложение не проходит проверку подлинности. Я могу успешно передать данные CognitoUserSession в WebView. К сожалению, я не вижу способа повторной аутентификации Amplify в этом сеансе.

1 Ответ

0 голосов
/ 30 октября 2019

это написанная мной функция mobileLogin, которая работает

import Amplify, { Auth } from 'aws-amplify';
import {
  CognitoUser,
  CognitoUserSession,
  CognitoIdToken,
  CognitoRefreshToken,
  CognitoAccessToken,
} from 'amazon-cognito-identity-js';

window.mobileLogin = async function(mobileSession) {
  amplify = Amplify.configure({
    ...config().amplify,
    userPoolWebClientId: '', //switch to mobile client
  });

const localSession = new CognitoUserSession({
  IdToken: new CognitoIdToken({ IdToken: mobileSession.idToken.jwtToken }),
  RefreshToken: new CognitoRefreshToken({ RefreshToken: mobileSession.refreshToken }),
  AccessToken: new CognitoAccessToken({ AccessToken: mobileSession.accessToken.jwtToken }),
});

const localUser = new CognitoUser({
  Username: mobileSession.accessToken.payload.username,
  Pool: Auth.userPool,
  Storage: Auth.userPool.storage,
});
localUser.setSignInUserSession(localSession);

// this seems like a hack
Auth.currentCredentials = async () => localSession;

try {
  await Auth.currentSession();
  console.warn(`mobile login current session!!`);
  store.dispatch(silentReloginAction())
} catch (ex) {
  console.warn(`mobile login ${ex}`);
}
 };
}
...