使用 google oauth 和 nestjs 进行身份验证

我想根据谷歌的访问令牌为我的路由控制器使用保护,但我不知道如何实现。

我从我的 google oauth 中检索到这个

{
  "message": "User information from google",
  "user": {
    "email": "test@gmail.com",
    "firstName": "John",
    "lastName": "Kennedy",
    "picture": 
    "https://lh3.googleusercontent.com/a-/mypicture",
    "accessToken": "myaccesstoken"
  }
}

现在我不知道如何将此访问令牌用于我的其他路由,例如在控制器中:

  @UseGuards() // I don't know what to put here
  @Get('/get_customer/:id')
  async findCustomerById(@Param() params): Promise<Customer> {
    try {
      return await this.stripeService.findCustomerById(params.id);
    } catch (e) {
      throw new Error(e.message);
    }
  }
stack overflow Authentication with google oauth and nestjs
原文答案

答案:

作者头像

简短回答:

在 google 的重定向端点中,您可以向用户发出 JWT 令牌,它将他们的数据作为有效负载保存,并使用 JWT 验证保护来保护您的端点。见 this

长答案:

谷歌基本上所做的只是为您的应用程序提供使用该服务登录的用户的身份......具体来说,谷歌为您提供用户的数据(具有您定义的范围)和访问令牌。

此时,您有多种方法来保护您的路线:

  1. 发布一个 JWT 令牌,其中包含您从谷歌获得的用户数据并将其返回给用户(客户端),用户使用该令牌发送的每个请求您都可以识别用户并授予他们访问路由的权限(无状态方式:令牌将在其中保存所有加密的内容)参见 this
    2.存储该用户的会话,其中包含您从谷歌获得的数据,并为他们提供 SessionId,这将使您(服务器)稍后识别用户并授予他们访问路由的权限(有状态方式:您需要存储会话数据某处)。

您可能想知道在所有这些中访问令牌的用途是什么...通常,此令牌只能由您的应用程序(您从谷歌获得的 ClientId+ClientSecret)使用来访问用户的谷歌数据(由您选择的范围定义)代表他们。所以基本上这个令牌是用户的同意,所以你的应用可以访问他们的谷歌数据。

例如,如果您不能将用户的数据存储在我们的数据库中(出于法律原因),这可能很有用,因此您可以直接从谷歌查询他们的数据,而无需每次都咨询他们。