如何配置Google App Engine服务,仅允许Firebase认证用户访问?
嘿,作为新手能把GAE和Firebase Auth的应用搭起来已经很棒啦!要实现你的Google App Engine服务只允许通过Polymer应用认证的用户访问,核心思路是验证请求中的Firebase ID令牌,同时限制请求来源防止非法访问,我给你一步步拆解实现方案:
1. 在GAE Node.js服务中集成Firebase Admin SDK
首先需要用Firebase Admin SDK来验证客户端传来的ID令牌,这是官方推荐的服务器端验证方式:
- 先安装依赖包:
npm install firebase-admin - 从Firebase控制台的「项目设置」→「服务账号」页面下载JSON格式的服务账号密钥,把它放到你的GAE项目目录里(别把这个密钥提交到Git等版本控制工具里!)
- 在你的Node.js服务代码中初始化Admin SDK:
const admin = require('firebase-admin'); const serviceAccount = require('./your-service-account-key.json'); admin.initializeApp({ credential: admin.credential.cert(serviceAccount), databaseURL: 'https://<你的Firebase项目ID>.firebaseio.com' });
2. 编写令牌验证中间件
接下来写一个Express中间件(假设你的GAE服务用Express框架,这是Node.js服务的常用选择),用来检查每个请求里的ID令牌是否有效:
async function verifyFirebaseToken(req, res, next) { // 从Authorization头中提取ID令牌(格式是"Bearer <token>") const idToken = req.headers.authorization?.split('Bearer ')[1]; if (!idToken) { return res.status(401).send('未授权:未提供认证令牌'); } try { // 验证令牌的有效性 const decodedToken = await admin.auth().verifyIdToken(idToken); // 把解码后的用户信息挂载到请求对象上,后续路由可以直接使用 req.user = decodedToken; next(); // 验证通过,继续执行后续路由逻辑 } catch (error) { return res.status(401).send('未授权:无效的认证令牌'); } }
然后把这个中间件应用到需要保护的路由上,比如你的"hello world"路由:
app.get('/', verifyFirebaseToken, (req, res) => { res.send(`Hello World!欢迎你,${req.user.email}😉`); });
3. 在Polymer应用中传递ID令牌
你的Polymer应用已经实现了Firebase Auth的登录功能,现在需要在向GAE服务发送请求时,把用户的ID令牌放到请求头里:
// 假设用户已经完成登录,获取当前登录用户 const user = firebase.auth().currentUser; if (user) { // 获取当前用户的ID令牌 const idToken = await user.getIdToken(); // 发送请求到你的GAE服务 fetch('https://resumetemplatesconverter.appspot.com/', { method: 'GET', headers: { 'Authorization': `Bearer ${idToken}` } }) .then(response => response.text()) .then(data => { console.log('请求成功:', data); // 处理返回的内容 }) .catch(error => console.error('请求失败:', error)); }
另外,Firebase的ID令牌默认1小时过期,你可以监听onIdTokenChanged事件自动刷新令牌,避免请求失败:
firebase.auth().onIdTokenChanged(user => { if (user) { // 令牌刷新后,这里可以更新本地存储的令牌,或者直接用新令牌发起请求 user.getIdToken().then(newToken => { console.log('令牌已刷新:', newToken); }); } });
4. 配置CORS限制请求来源
为了防止其他网站非法请求你的GAE服务,需要配置跨域资源共享(CORS),只允许你的Polymer应用域名访问:
- 安装
cors包:npm install cors - 在你的Node.js服务中配置CORS规则:
const cors = require('cors'); // 替换成你的Polymer应用的实际域名 const corsOptions = { origin: 'https://your-polymer-app-domain.com', optionsSuccessStatus: 200 }; // 把CORS中间件应用到所有路由 app.use(cors(corsOptions));
5. 可选的额外安全措施
- 验证令牌受众:在解码令牌后,检查
aud字段是否等于你的Firebase项目ID,防止其他Firebase项目的令牌被滥用:if (decodedToken.aud !== '<你的Firebase项目ID>') { return res.status(401).send('未授权:无效的令牌受众'); } - 限制令牌颁发者:可以检查
iss字段是否为https://securetoken.google.com/<你的Firebase项目ID>,进一步确保令牌的合法性。
这样配置完成后,你的GAE服务就只会接受来自你Polymer应用、且经过Firebase Auth认证的用户请求啦!如果遇到问题,可以检查令牌是否正确传递、Admin SDK初始化是否有问题,或者查看Firebase和GAE的日志排查错误。
内容的提问来源于stack exchange,提问作者Halloween Man
相关产品推荐
相关产品推荐

