网站搜索

使用 TypeScript 和身份验证的 Firebase 函数


我正在尝试使用 TypeScript 实现 Firebase 函数。到目前为止,我能够创建一些函数而没有问题,直到我必须处理身份验证。这是我第一次使用 TypeScript,所以我可能会问一些对大多数开发者来说显而易见的问题。

上下文:

我能够使用这个例子实现身份验证检查。正如我们在那个例子(JavaScript)中看到的,代码正在解码令牌并将用户信息传递给请求,这将由下一个函数处理。

问题:

我的问题是我不知道如何在 TypeScript 中做到这一点。首先,我必须在我的令牌验证函数的参数中添加一些类型,因为编译器抱怨没有类型(就像在 JavaScript 示例中一样),所以我采用了类似这样的方式:

const validateFirebaseIdToken = async (req: any, res: any, next: any) 

问题是,在我的下一个函数中,我无法获取用户:

example.get('/', async (req, res) => {
  req.user
}

我收到错误:属性 'user' 在类型 'Request>' 上不存在。

那么,在这种情况下你会怎么做?我不想在第二个函数中再次解码令牌,因为那没有意义(我已经在上一步(令牌验证)中做过了)。

理想情况下:

  • 我想使用与 JavaScript 示例中相同的方法。

  • 我想在令牌验证函数的参数中添加正确的类型。我尝试使用 Request<Dictionary<String>>,但是编译器抱怨说该类型不是泛型的(我是从第二个函数推断出类型的)

这是我的代码:

const validateFirebaseIdToken = async (req: any, res: any, next: any) => {}

const example = express();
example.use(validateFirebaseIdToken);
example.get('/', async (req, res) => {}

答案#1

要补充@Constantin所提供的被接受的答案的一些内容:

理想情况下:

  • 我想使用与 JavaScript 示例中相同的方法。

除了康斯坦丁给出的答案,我还需要在请求中添加一个类型。

req: express.Request

  • 我想在令牌验证函数的参数中添加正确的类型。我尝试使用 Request>,但编译器抱怨说该类型不是泛型的(我是从第二个函数推断出类型的)

我最终采用了这个方法:

const validateFirebaseIdToken = async (req: express.Request, res: express.Response, next: any) => {}

答案#2

你的请求包含一个 body,其中包含你的 user。所以你必须这样做:

example.get('/', async (req, res) => {
     req.body.user
}