如何使用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
相关产品推荐
相关产品推荐

