Firebase 授权不记名令牌未注册

Posted

技术标签:

【中文标题】Firebase 授权不记名令牌未注册【英文标题】:Firebase authorization bearer token not registering 【发布时间】:2021-06-27 21:33:21 【问题描述】:

错误消息:没有 Firebase ID 令牌作为授权标头中的不记名令牌传递。确保通过提供以下 HTTP 标头来授权您的请求:Authorizaiton: Bearer 或传递“__session”cookie

实际上有一个有效的令牌。相同的设置适用于其他功能,但不适用于此处。主要区别在于这是删除而不是帖子。

    firebase
      .auth()
      .currentUser.getIdToken(true)
      .then((token) => 
        console.log(token)
        return axios.delete(
          `$FunctionsDir/deleteMessage`,
          
            messageID: messageID,
          ,
          
            headers: 
              Authorization: `Bearer $token`,
              'content-type': 'application/octet-stream',
            ,
          
        )
      )

还有 cors 设置...

var corsOptions = 
  origin: function (origin, callback) 
    if (whitelist.indexOf(origin) !== -1 || !origin) 
      callback(null, true)
     else 
      callback(new Error('Not allowed by CORS'))
    
  ,
  allowedHeaders: 'Content-Type,Authorization',
  methods: 'GET,POST,DELETE',
  preflightContinue: false,
  optionsSuccessStatus: 200,


app.options('*', cors())
app.use(cors(corsOptions))

更新:已修复,原来是 cors 加上 axios.delete() sig 错误。

【问题讨论】:

您能否在问题中包含您的服务器端代码。这可能是您的 CORS 配置存在问题。 添加了 CORS 配置。 您也应该在注入 cors 中间件的位置发布 - 了解它的使用方式很重要。例如通常app.options("*", cors())app.options("/deleteMessage", cors()) 必须存在。 【参考方案1】:

这可能是一个CORS 问题,需要在服务器上解决。

这是因为 DELETE 请求需要向服务器发出飞行前请求,询问可以发送的内容。因为您收到了来自服务器的响应,所以很可能您已经将 DELETE 添加到了 Access-Control-Allow-Methods 标头中。但是,Authorization 默认情况下不被视为“安全标头”。因此,您还必须明确允许它,否则浏览器会在发送请求时将其从请求中删除。您可以通过将Authorization 添加到您的Access-Control-Allow-Headers 标头来做到这一点。

如果您在服务器上使用 Express,您可以允许 cors 包为您执行此操作:

import express from "express";
import cors from "cors";

const app = express();
app.options("/deleteMessage", cors()); // enable preflight request for DELETE
app.use(cors( origin: ["https://yourapp.com"] )); // enable CORS for all routes

// ...

如果你不喜欢使用第三方依赖,你可以手动添加标题,如this answer所示。

对于非快速请求,例如 HTTP 请求云函数,您可以使用以下代码:

import express from "express";
import cors from "cors";

const corsMiddleware = cors( origin: ["https://yourapp.com"] ); // or your manual (req, res, next) function

export const someFunction = functions.https.onRequest((req, res) => 
  corsMiddleware(req, res, (err) => 
    if (err) 
      res.status(500).send('CORS check failed');
      return;
    

    // your code here
  
)

【讨论】:

以上是关于Firebase 授权不记名令牌未注册的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 注册令牌未显示在 Android Studio logcat 中

提供的注册令牌未注册

未知状态码:17028 已通过安全网令牌,但未注册匹配的 SHA-256

Web API 安全和身份验证 - 不记名令牌

401 未经授权使用带有 Laravel Passport 的不记名令牌

不记名令牌未添加到 HTTP 请求 - MSAL2 Angular