связывание анонимного пользователя Firebase с пользовательским токеном - PullRequest
0 голосов
/ 04 июля 2019

Я хочу, чтобы пользователи автоматически входили анонимно при первом посещении сайта, а затем в любой момент они должны иметь возможность войти в систему с помощью внешнего поставщика, такого как Google или LinkedIn, и продолжать использовать данные, которые былихранится под анонимной учетной записью.

let currentUser = auth.currentUser;
if (!currentUser) {
    currentUser = (await auth.signInAnonymously()).user;
}

Я реализовал потоки OAuth 2.0, чтобы пользователи могли входить в мою систему с использованием различных провайдеров, включая LinkedIn.Мой сервер генерирует токен доступа JWT, который предоставляется веб-клиенту.

const accessToken = {
  sub: my-service-account@my-firebase-project.iam.gserviceaccount.com,
  iss: my-service-account@my-firebase-project.iam.gserviceaccount.com,
  aud: "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
  uid: 1234
  // other claims...
}

const newUser = await auth.signInWithCustomToken(accessToken);

Пока все хорошо - но как мне связать эти два?В соответствии с документацией по связыванию учетных записей я должен иметь возможность сделать что-то вроде этого:

if (currentUser && currentUser.isAnonymous) {
    const provider = new firebase.auth.OAuthProvider('myprovider');
    const credential = provider.credential(token, token);
    const linkedUser = await currentUser.linkWithCredential(credential);
}

Однако firebase отправляет запрос на https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyAssertion

{
  idToken: {
    "provider_id": "anonymous",
    "iss": "https://securetoken.google.com/my-firebase-project",
    "aud": "my-firebase-project",
    "user_id": anonymousUserId,
    "sub": anonymousUserId,
    "firebase": {
      "identities": {},
      "sign_in_provider": "anonymous"
    }
  }
  postBody: {
    id_token: token, 
    access_token: token
    providerId: "myprovider"
  }
  requestUri: "http://localhost"
  returnIdpCredential: true
  returnSecureToken: true
}

и я получаю ответ об ошибке 400:

INVALID_CREDENTIAL_OR_PROVIDER_ID : Invalid IdP response/credential: http://localhost?id_token=${token}&access_token=${token}&provider=myprovider

Мой интерфейс https работает на порт 3000 , а мой бэкэнд на /api/oauth/, такжеhttps

  • как настроить другой requestUri?
  • что должна делать конечная точка?
...