Firebase: Как сгенерировать токен доступа из имени пользователя и пароля на сервере? - PullRequest
1 голос
/ 10 ноября 2019

У меня есть приложение Firebase, и я интегрирую Zapier. Они требуют, чтобы пользователи проходили аутентификацию с моим приложением через свою форму.

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

Я не могу понять, как сгенерировать токен доступа из имени пользователя и пароля на сервере (узел js), поскольку все методы аутентификации находятся в клиентском SDK.

ИтакДо сих пор я надеялся аутентифицировать пользователя с помощью предоставленной электронной почты / пароля, сгенерировать собственный токен из их uid и отправить его обратно в Zapier. Но я не могу этого сделать, поскольку в серверном SDK нет signInWithEmailAndPassword или аналогичных методов.

Я знаю, что могу получить пользователя по электронной почте, но как я могу проверить пароль, чем соответствующие методы? снова доступны только в клиентском SDK?

Пока у меня есть следующий код:

const rp = require('request-promise');

app.post('/api/integrations/zapier/auth', (req, res) => {
        let data = req.body
        admin.auth().signInWithEmailAndPassword(data.email, data.password) // <- this method doesn't exist in the server sdk
            .then(response => admin.auth().createCustomToken(response.user.id))
            .then(customToken => rp({
                url: `https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyCustomToken?key=${config.apiKey}`,
                method: 'POST',
                body: {
                    token: customToken,
                    returnSecureToken: true
                },
                json: true,
            }))
            .then(idToken => {
                res.send({
                    accessToken: idToken,
                    filed: data.email
                });
            }).catch(error => res.status(500).send(error));
    })

1 Ответ

1 голос
/ 10 ноября 2019

Использование Firebase Admin SDK для создания пользовательских токенов на основе учетных данных входа вводит в заблуждение, поскольку в документации говорится:

Создание пользовательского токена

Firebase дает вам полный контроль над аутентификацией, позволяя аутентифицировать пользователей или устройства с использованием безопасных веб-токенов JSON (JWT). Вы генерируете эти токены на своем сервере, передаете их обратно на клиентское устройство, а затем используете их для аутентификации с помощью метода signInWithCustomToken().

Для этого необходимо создать сервер. конечная точка, которая принимает учетные данные для входа, такие как имя пользователя и пароль , и, если учетные данные действительны, возвращает пользовательский JWT. Пользовательский JWT, возвращаемый с вашего сервера, может затем использоваться клиентским устройством для аутентификации с помощью Firebase ( iOS , Android , web ).

Существует пример создания пользовательского токена на основе пользовательской Firebase uid:

admin.auth().createCustomToken(uid)

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

Так как Firebase Admin SDK не предоставляет методы для проверки учетных данных, обходным решением является использование комбинации Firebase Admin SDK, а также Firebase Auth RESTAPI.

  1. Используйте API-интерфейс REST Firebase для Вход с электронной почтой / паролем
  2. После успешной аутентификации используйте администратор FirebaseМетод SDK getUserByEmail
  3. SDK Firebase Admin UserRecord будет содержать uid, который затем может быть передан в admin.auth().createCustomToken(uid)
...