使用授权承载请求时在 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.1express NodeJS 库似乎运行良好。

问题

但是,当我尝试通过发送授权标头来保护请求时:

Authorization: Bearer <token>

它没有显示我的令牌的任何日志。当我在 Firebase Functions index.js 文件中使用 console.log(request) 来获取 token 时,我看不到任何与 BearerAuthorization 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-bearerexpress-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 的相同文档,只有当corscookiescookie-parser 插件和req.headers.authorization 完全启用并发送到firebase-functions 端点时,它才能完全工作。

【讨论】:

以上是关于使用授权承载请求时在 Firebase 函数中获取令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何在流动客户端主题时在C#HttpClient中设置OIDC / OAuth承载令牌

如何在axios中配置授权承载令牌?

在 Asp.Net Core 中使用 Swagger 在请求中未发送授权承载令牌

如果使用了授权承载令牌,则为 400 错误请求

php Laravel从请求中获得授权承载

PHP Slim 4 - 使用 firebase JWT 令牌授权 api 请求