You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

实现基于Node.js的Google Cloud Function Express应用与CLI登录流程

我来分享下这套登录流程的具体实现思路和关键代码片段,完全贴合你描述的需求:

一、CLI工具的登录逻辑 (myclitool login)

首先,CLI需要一次性收集用户的邮箱和密码,用交互式输入工具能避免明文在命令行暴露,这里用inquirer做示例:

// CLI工具核心登录代码片段
const inquirer = require('inquirer');
const axios = require('axios');
const fs = require('fs');
const path = require('path');
const https = require('https');

async function login() {
  // 一次性收集邮箱和密码
  const { email, password } = await inquirer.prompt([
    {
      type: 'input',
      name: 'email',
      message: '请输入你的邮箱:'
    },
    {
      type: 'password',
      name: 'password',
      message: '请输入你的密码:'
    }
  ]);

  try {
    // 通过SSL向Express服务器发送POST请求
    const response = await axios.post('https://your-cloud-function-url/login', {
      email,
      password
    }, {
      httpsAgent: new https.Agent({ rejectUnauthorized: true }) // 强制SSL验证
    });

    const apiKey = response.data.apiKey;
    // 写入~/.myclitoolrc配置文件
    const rcPath = path.join(process.env.HOME, '.myclitoolrc');
    fs.writeFileSync(rcPath, JSON.stringify({ apiKey }, null, 2), { mode: 0o600 }); // 限制文件权限
    console.log('登录成功!API密钥已保存');
  } catch (error) {
    console.error('登录失败:', error.response?.data?.message || error.message);
  }
}

// 绑定到myclitool login命令
module.exports = { login };

二、Google Cloud Function上的Express服务器处理

在Cloud Function里搭建Express服务,处理登录请求并返回预先生成的私有API密钥:

// Cloud Function Express服务器代码
const express = require('express');
const functions = require('@google-cloud/functions-framework');
const bcrypt = require('bcrypt');
const app = express();

app.use(express.json());

// 模拟用户数据库(实际建议用Firebase/Cloud SQL等托管服务)
const userDatabase = {
  'user@example.com': {
    passwordHash: '$2b$10$exampleHashString', // 存储哈希后的密码,禁止明文
    apiKey: 'user-private-api-key-123xyz'
  }
};

app.post('/login', async (req, res) => {
  const { email, password } = req.body;
  const user = userDatabase[email];

  if (!user) {
    return res.status(401).json({ message: '用户不存在' });
  }

  // 验证密码(用哈希比对,不直接存储明文)
  const isPasswordValid = await bcrypt.compare(password, user.passwordHash);
  
  if (!isPasswordValid) {
    return res.status(401).json({ message: '密码错误' });
  }

  // 返回预先生成的私有API密钥
  res.status(200).json({ apiKey: user.apiKey });
});

// 导出Cloud Function供Google Cloud调用
functions.http('myExpressApp', app);

三、关键注意事项

  • 密码安全: 绝对不要在数据库里存储明文密码,一定要用bcrypt这类工具哈希后再存储,验证时用哈希比对。
  • SSL安全: Cloud Function默认启用HTTPS,CLI请求时务必强制使用HTTPS,避免数据传输被窃听。
  • 配置文件权限: 写入~/.myclitoolrc时设置0600权限,防止其他用户读取敏感的API密钥。
  • 错误处理: 给CLI用户返回清晰的错误提示,比如“用户不存在”“密码错误”,而非模糊的报错信息。

内容的提问来源于stack exchange,提问作者Andy Fusniak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:43:59