带打字稿和身份验证的Firebase函数

时间:2019-09-02 07:45:16

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

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

上下文:

我能够使用此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) => {}

3 个答案:

答案 0 :(得分:1)

您的请求包含一个body,其中包含您的user。因此,您必须这样做:

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

答案 1 :(得分:1)

要添加到@Constantin给出的可接受答案中的内容:

理想情况:

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

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

  

要求:express.Request

  • 我想在代币验证功能的参数中添加正确的类型。我尝试使用Request >,但是编译器抱怨说该类型不是通用的(我从第二个函数推导了该类型)

我最终有了这种方法:

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

答案 2 :(得分:0)

我认为推荐的方法是使用{strong> 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
) => {};