У меня есть собственное приложение, которое использует Expo (управляемое, а не отдельное) и использует аутентификацию Firebase для обеспечения входа в систему Facebook и электронной почты / пароля.
Теперь мне нужно реализовать «Войти через Apple» в соответствии с новыми правилами Apple.
Expo предоставляет способ для этого, и он работает, возвращая информацию пользователя. Но поскольку все пользователи управляются с помощью аутентификации Firebase, мне нужно взять то, что Apple отправляет мне, и передать его аутентификации Firebase.
The Firebase docs объясняет, как это сделать, используя signInWithCustomToken
. Но для этого нужно, чтобы я создал токен. В Node это было бы просто, но это приложение без сервера, и я не нашел инструмента, который может генерировать токен RS256 на клиенте. Из документации Firebase кажется, что RS256 является требованием. Я попытался использовать expo-jwt с HS256, и Firebase возвращает ошибку о том, что токен неправильно сформирован. Но кроме использования HS256 вместо RS256 я не вижу других возможных проблем. Токен успешно закодирован и декодирован следующим образом.
const appleJwt = JWT.encode(
{
familyName: 'M',
givenName: 'Greg',
email: 'apple_user@example.com',
alg: 'HS256',
iss:
'https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit',
sub: serviceAccountEmail,
aud: serviceAccountEmail,
iat: Math.floor(Date.now() / 1000),
exp: Math.floor(Date.now() / 1000) + 3600,
uid: appleUid
},
key,
{
algorithm: 'HS256'
}
);
console.log('TCL: loginWithApple -> appleJwt', appleJwt);
const appleJwtDecoded = JWT.decode(appleJwt, key);
console.log('TCL: loginWithApple -> appleJwtDecoded', appleJwtDecoded);
Только когда я пытаюсь использовать его с аутентификацией Firebase, он возвращает ошибку, что токен неправильно отформатирован.
return Firebase.auth().signInWithCustomToken(appleJwt).then(...
Обратите внимание, что key
и serviceAccountEmail
были получены с консоли Firebase.
Мне интересно, возможно, есть какое-то более простое решение, которое я пропускаю. Сообщество ожидает известие от Firebase о том, будут ли они предоставлять Apple вход в систему из коробки, как они это делают для других провайдеров, поэтому, возможно, мне просто нужно набраться терпения. Но я бы предпочел найти решение.
Большое спасибо заранее за любые советы.
Обновление 2019-10-15
Я создал простой сервер узлов с API, который мое приложение могло бы использовать для генерации токена с RS256, но Firebase по-прежнему отвечает, чтотокен плохо отформатирован, когда я передаю его signInWithCustomToken
. Не могу понять, что с ним не так.
Итак, поскольку у меня был собран сервер узлов, я просто настроил Firebase Admin SDK и использовал предоставленный *1036* createCustomToken
для генерации токена. Firebase принимает его сейчас, когда я передаю его signInWithCustomToken
, что было моей проблемой, поэтому эта проблема для меня решена. После первого успешного входа в Firebase я записываю все пользовательские данные в Firestore. Для последующих входов в систему просто обновляется дата последнего входа в Firestore. Надеемся, что Firebase все еще скоро предоставит свое собственное решение, так как наличие отдельного сервера узлов просто для этого не идеально.