【问题标题】:Firebase functions with typescript and auth带有 typescript 和 auth 的 Firebase 函数
【发布时间】:2020-01-05 06:24:43
【问题描述】:

我正在尝试使用 typescript 实现 firebase 功能。到目前为止,我能够毫无问题地创建一些功能,直到我不得不处理身份验证。 这是我第一次使用 typescript,所以我可能会问一些对大多数开发人员来说显而易见的问题。

上下文:

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

问题:

我的问题是我不知道如何在打字稿中做到这一点。 首先,我必须在我的令牌验证器函数的参数中添加一些类型,因为编译器抱怨没有类型(就像在 javascript 示例中一样),所以我选择了这样的东西:

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

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

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

我收到错误:“请求>”类型上不存在属性“用户”。

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

理想情况下:

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

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

这是我的代码:

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

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

【问题讨论】:

  • 发送到函数的请求是什么样的?
  • @ConstantinBeer 你的意思是客户的请求吗?如果是这样,那么它就像一个带有令牌进行身份验证的普通 http 请求。到目前为止,身份验证工作没有问题。我只需要做一些与发出这些请求的用户相关的操作。这就是为什么我需要在我的第二个函数中获取用户信息。
  • 尝试使用req.body.user
  • 嗨@chrismclarke。谢谢你的提示。我只是想尝试继续使用 typescript 的特性,比如静态类型,这就是我决定从 javascript 转向这种语言的原因。
  • @ConstantinBeer 你的建议对我有用。您要添加正确的答案以便我接受吗?

标签: typescript firebase firebase-authentication google-cloud-functions


【解决方案1】:

您的请求包括一个包含您的userbody。所以你必须这样做:

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

【讨论】:

    【解决方案2】:

    在@Constantin 给出的已接受答案中添加一些内容:

    理想情况下:

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

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

    req: express.Request

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

    我最终得到了这个方法:

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

    【讨论】:

      【解决方案3】:

      我认为实现此目的的推荐方法是使用 声明合并,如 here 所述。

      1. src文件夹中创建一个type.d.ts文件,代码如下:
      import { auth } from "firebase-admin";
      
      declare global {
        namespace Express {
          export interface Request {
            user: auth.DecodedIdToken;
          }
        }
      }
      

      通过使用声明合并并指定用户道具的类型,您将获得自动完成支持。

      1. 或者,如果您想对类型非常严格,而不是使用express.Request,请执行以下操作:
      import * as expressTypes from "express-serve-static-core";
      
      const validateFirebaseIdToken = async (
        req: expressTypes.Request<expressTypes.Dictionary<string>>,
        res: expressTypes.Response,
        next: expressTypes.NextFunction
      ) => {};
      

      【讨论】:

        猜你喜欢
        • 2019-06-10
        • 2018-08-10
        • 2021-03-11
        • 1970-01-01
        • 2017-10-28
        • 2018-06-23
        • 2013-05-22
        • 2017-12-29
        • 2020-03-17
        相关资源
        最近更新 更多