使用授权承载请求时在 Firebase 函数中获取令牌
Posted
技术标签:
【中文标题】使用授权承载请求时在 Firebase 函数中获取令牌【英文标题】:Get Token in Firebase Functions When Requesting With An Authorization Bearer 【发布时间】:2018-11-03 05:44:59 【问题描述】:我目前正在使用 Firebase Functions v1.0.3
和 Firebase Admin v5.12.1
。 express
NodeJS 库似乎运行良好。
问题
但是,当我尝试通过发送授权标头来保护请求时:
Authorization: Bearer <token>
它没有显示我的令牌的任何日志。当我在 Firebase Functions index.js
文件中使用 console.log(request)
来获取 token
时,我看不到任何与 Bearer
或 Authorization Bearer
匹配的单词。
当我使用console.log
时,我从req.headers
得到以下信息:
'content-length': '0',
'accept-language': 'en-US,en;q=0.9',
'accept-encoding': 'gzip, deflate, br',
referer: 'http://localhost:5000/admin/',
accept: '*/*',
'access-control-request-headers': 'authorization,content-type',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
origin: 'http://localhost:5000',
'access-control-request-method': 'GET',
connection: 'close',
host: 'localhost:5001'
文档来源
我已阅读有关 Firebase Functions Samples: Authorized HTTPS Endpoint 示例代码的文档,其中一些似乎已过时。
firebase.auth().currentUser.getToken()
例如现在是:
firebase.auth().currentUser.getIdToken()
其他库
我尝试安装了express-authorization-bearer
和express-bearer-token
等库,但仍然无法捕获idToken
。
我想知道这是 NodeJS 问题还是 Firebase Functions 问题。我目前正在使用 NodeJS v6.11.4
问题
如何使用 Express 或任何使用 NodeJS 的方法在 Firebase Functions 中捕获令牌?
【问题讨论】:
【参考方案1】:授权持有者工作。这是我console.log(req.headers)
时的结果:
'accept-language': 'en-US,en;q=0.9',
'accept-encoding': 'gzip, deflate, br',
referer: 'http://localhost:5000/admin/',
accept: '*/*',
'content-type': 'application/json',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
origin: 'http://localhost:5000',
authorization: 'Bearer something',
connection: 'close',
host: 'localhost:5001'
token
在这种情况下是 something
重要提示:
req.headers.authorization
不适用于 Assigning Multiple Origins,因为它会给出错误 Cannot set headers after they are sent
,但它应该可以通过允许任何来源并使用 cors
作为中间件轻松工作:
var cors = require('cors')(origin: true);
app.use(cors);
无论如何,req.headers.authorization
已经在保护它了。
req.headers.authorization
不能赋值给参数,否则会变成undefined
使用来自Authorized HTTPS Endpoints 的相同文档,只有当cors
、cookies
与cookie-parser
插件和req.headers.authorization
完全启用并发送到firebase-functions
端点时,它才能完全工作。
【讨论】:
以上是关于使用授权承载请求时在 Firebase 函数中获取令牌的主要内容,如果未能解决你的问题,请参考以下文章
如何在流动客户端主题时在C#HttpClient中设置OIDC / OAuth承载令牌