如何使用Firebase Admin SDK(服务器端)验证电子邮件/密码凭据?

时间:2018-05-03 13:55:22

标签: firebase firebase-authentication google-cloud-firestore google-cloud-functions firebase-admin

我编写了一个Google Cloud Function Express应用程序和一个在我的本地Mac上使用Node.js的命令行工具。

拨打~/.myclitoolrc,一次性提示会询问用户的电子邮件和密码。 CLI工具通过SSL使用HTTP POST请求向Express服务器发送请求正文中的电子邮件和密码。

服务器将发送一个私有API密钥(由用户注册时由触发器函数生成),该密钥将写入admin.firestore() .collection('accounts') .where('privateApiKey', '==', privateApiKey) .get() // and so on ,并将用于对我的API端点的所有后续调用。< / p>

来自CLI工具的每个后续调用都将查找Firestore帐户集合中的私有API密钥,并根据每个API调用进行身份验证。

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); }); }); };

passwordHash

Firebase文档说: https://firebase.google.com/docs/reference/admin/node/admin.auth.UserRecord

  

passwordHash(字符串或null)

     

用户的哈希密码(base64编码),仅限Firebase身份验证   使用散列算法(SCRYPT)。如果是不同的哈希算法   已经在上传此用户时使用,这在迁移时很常见   从另一个Auth系统,这将是一个空字符串。如果没有密码   设置,这将为null。这仅在用户使用时可用   从listUsers()获得。

     

passwordSalt(字符串或null)

     

用户的密码salt(base64编码),仅限Firebase身份验证   使用散列算法(SCRYPT)。如果是不同的哈希算法   用于上传此用户,通常是从另一个用户迁移时   Auth系统,这将是一个空字符串。如果没有设置密码,这个   将为null。这仅在获得用户时可用   listUsers()。

检索UserRecord并包含SCRYPTd passwordSaltUserRecord { 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' } 属性。

admin.auth()

似乎没有验证功能作为Firebase管理SDK if (l_check2) { query = mFirestore.collection("Places").whereEqualTo("colour", "red").whereEqualTo("size", "big"); } else if (l_check1) { query = mFirestore.collection("Places").whereEqualTo("colour", "red"); } else if (l_check3) { query = mFirestore.collection("Places").whereEqualTo("size", "big"); } 的一部分。

我是否应该通过查找算法或现成的Node模块来自行实施SCRYPT验证,还是应该将缺少任何验证函数作为这不是最佳方法的标志?

如果是这样,请推荐一个更好的设计,请记住这是一个原型项目,实现完整的Oauth2会非常耗时。

1 个答案:

答案 0 :(得分:0)

根据评论中的要求,以下是一些使用Node.js通过Firebase Javascript SDK访问Cloud Firestore的示例代码(强制执行安全规则)。

v4.13.0中存在一个错误(现已关闭)。我尚未测试4.13.1,但修复程序已合并到master分支中。如果它不起作用,您应该尝试v4.12.0。

const firebase = require('firebase');
require("firebase/firestore");

// Initialize Firebase
// You get these details from the Firebase Console
let config = {
  apiKey: "yourAPIkey",
  authDomain: "yourAuthDomain",
  databaseURL: "https://yourProjectID.firebaseio.com",
  projectId: "yourProjectID",
  messagingSenderId: "yourId"
};
firebase.initializeApp(config);

let email = 'yourUser@example.com';
let password = 'yourVerySecurePassword';

firebase.auth().signInWithEmailAndPassword(email, password)
  .catch(error => {
    console.log(error);
  });

firebase.auth().onAuthStateChanged((user) => {
  if (user) {
    console.log('I am logged in');

    // Initialise Firestore
    const firestore = firebase.firestore();
    const settings = {timestampsInSnapshots: true};
    firestore.settings(settings);

    return firestore
      .collection('accounts')
      .where('privateApiKey', '==', privateApiKey)
      .get()
      .then((querySnapshot) => {
        querySnapshot.forEach((documentSnapshot) => {
          if (documentSnapshot.exists) {
            console.log(documentSnapshot.id);
          }
        });
      });
  } else {
    // User is signed out.
    // ...
  }
});