Я написал приложение Google Cloud Function Express и инструмент командной строки, который использует Node.js на моем локальном Mac.
Вызов myclitool login
, одноразовый запрос запрашивает у пользователя адрес электронной почты и пароль. Инструмент CLI отправляет электронную почту и пароль внутри тела запроса с помощью HTTP-запроса POST на сервер Express через SSL.
Сервер отправит обратно секретный ключ API (сгенерированный функцией триггера во время регистрации пользователя), который будет записан в ~/.myclitoolrc
и будет использоваться для всех последующих вызовов к моей конечной точке API.
Каждый последующий вызов из инструмента CLI ищет частный ключ API в коллекции учетных записей Firestore и аутентифицируется для каждого вызова API.
admin.firestore()
.collection('accounts')
.where('privateApiKey', '==', privateApiKey)
.get() // and so on
Пока следующий код найдет admin.auth.UserRecord
.
Service.prototype.signin = function signin(email, password) {
return new Promise(function(resolve, reject) {
admin.auth().getUserByEmail(email)
.then(userRecord => {
console.log(userRecord);
resolve('some value later');
})
.catch(err => {
reject(err);
});
});
};
Документация Firebase гласит:
https://firebase.google.com/docs/reference/admin/node/admin.auth.UserRecord
passwordHash (строка или ноль)
Хешированный пароль пользователя (в кодировке base64), только если Firebase Auth
алгоритм хеширования (SCRYPT). Если другой алгоритм хеширования
был использован при загрузке этого пользователя, как это обычно происходит при миграции
из другой системы аутентификации это будет пустая строка. Если нет пароля
установлено, это будет нулевым. Это доступно только когда пользователь
получено из listUsers ().
passwordSalt (строка или ноль)
Соль пароля пользователя (в кодировке base64), только если Firebase Auth
алгоритм хеширования (SCRYPT). Если другой алгоритм хеширования
был использован для загрузки этого пользователя, типично при миграции с другого
Система аутентификации, это будет пустая строка. Если пароль не установлен, это
будет нулевым Это доступно только тогда, когда пользователь получен от
ListUsers ().
UserRecord извлекается и содержит свойства SCRYPTd passwordHash
и passwordSalt
.
UserRecord {
uid: 'kjep.[snip]..i2',
email: 'email@example.com',
emailVerified: false,
displayName: undefined,
photoURL: undefined,
phoneNumber: undefined,
disabled: false,
metadata:
UserMetadata {
creationTime: 'Thu, 12 Apr 2018 09:15:23 GMT',
lastSignInTime: 'Thu, 03 May 2018 03:57:06 GMT' },
providerData:
[ UserInfo {
uid: 'email@example.com',
displayName: undefined,
email: 'email@example.com',
photoURL: undefined,
providerId: 'password',
phoneNumber: undefined } ],
passwordHash: 'U..base64..Q=',
passwordSalt: undefined,
customClaims: undefined,
tokensValidAfterTime: 'Thu, 12 Apr 2018 09:15:23 GMT' }
Похоже, что в составе Firebase Admin SDK нет функций проверки admin.auth()
.
Должен ли я осуществить проверку SCRYPT самостоятельно, найдя алгоритм или готовый модуль Node, или я должен принять отсутствие каких-либо функций проверки как признак того, что это не лучший подход?
Если это так, пожалуйста, порекомендуйте лучшую конструкцию, учитывая, что это проект-прототип, и для реализации полного Oauth2 потребуется довольно много времени.