Как я могу пройти аутентификацию, чтобы запросить Firebase REST api для получения списка проектов firebase пользователя, вошедшего в систему?

# #javascript #firebase

Вопрос:

Я хочу получить список проектов firebase зарегистрированного пользователя (не меня) на моем веб-сайте. Кажется, я не могу правильно запросить API firebase rest (конечная точка), так как получаю ошибку 401, не ПРОШЕДШУЮ проверку подлинности.

Шаги, которым я следую:

Я использую firebase.auth().signInWithPopup свой браузер для аутентификации пользователей. Вот области, используемые:

 // Google provider
const provider = new GoogleAuthProvider();
// Additionnal scopes
provider.addScope("https://www.googleapis.com/auth/cloud-platform");
provider.addScope("https://www.googleapis.com/auth/firebase");
provider.addScope("https://www.googleapis.com/auth/datastore");
// Signin
signInWithPopup(auth, provider);
 

Затем я использую getIdToken метод для получения токена от пользователя.
const token = await auth.currentUser.getIdToken(true);

Я использую этот токен для запроса https://firebase.googleapis.com/v1beta1/projects :

 const data = await window.fetch("https://firebase.googleapis.com/v1beta1/projects", {
     headers: {
      authorization: `Bearer ${token}`,
    },
  })
  .then(res => res.json());
 

но я всегда получаю ошибку 401:

 {
  "error": {
      "code": 401,
      "message": "Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
      "status": "UNAUTHENTICATED"
  }
}
 

Что я делаю не так?

Ответ №1:

Чтобы получить список проектов Firebase для пользователя, вам нужен токен OAuth2 для пользователя, который сотрудничает с проектами. Вы пытаетесь использовать идентификационный токен/JWT для пользователя аутентификации Firebase, что не одно и то же.

Следуйте документации по созданию маркера доступа, чтобы получить значение, которое можно использовать для получения списка проектов.

Комментарии:

1. Как я мог бы получить проекты firebase от зарегистрированного пользователя? (не МОИ проекты firebase) Приложение «Firefoo» (графический клиент firestore) делает именно это, вы входите в систему с помощью областей, и они получают ваши проекты firebase.

2. Все то же самое: вам нужно получить токен OAuth2 для этого пользователя с областями требований, чтобы запросить список их проектов. Пользователь аутентификации Firebase не обязательно является участником проектов. Например, вот как это делает интерфейс командной строки Firebase: github.com/firebase/firebase-tools/blob/…

3. Спасибо! Это помогает, но я еще не совсем там. Ссылка на документацию не помогает, так как в ней объясняется, как получить маркер api, чтобы иметь возможность получать мой собственный список проектов (в нем нет элемента user). То, что у меня сейчас есть, — это идентификатор пользователя, который принял области/разрешения для меня, чтобы видеть его проекты. Отсюда я все еще не уверен, как создать окончательный доступ к OAuth2. Должен ли я использовать информацию о пользователе, идентификатор и области для создания токена JWT самостоятельно?

4. Это всегда возвращает токен OAuth2 для текущего пользователя. Поэтому, когда вы запускаете код, которым являетесь вы; и когда один из ваших пользователей запускает код, он получит для них токен.

5. Этот метод admin.credential.applicationDefault().getAccessToken() взят firebase-admin и доступен только на стороне сервера. Как он может узнать о текущем пользователе, который вошел в систему на стороне клиента?

Ответ №2:

Я только что нашел ответ, firebase SDK действительно предоставляет вам доступ к idToken. Затем вы можете использовать этот токен вместо idToken для любых ваших потребностей в REST api.

 const result = await signInWithPopup(auth, provider);
// This gives you a Google Access Token. You can use it to access the Google API.
const credential = GoogleAuthProvider.credentialFromResult(result);