Spring Boot 社交登录和 Google 日历 API

2023-12-04

Problem

通过 Spring Security OAuth2 重用最终用户 Google 身份验证来访问 Web 应用程序中的 Google Calendar API

描述

我能够通过 Spring Security 登录创建一个小型 Spring Boot Web 应用程序

应用程序.yaml

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: <id>
            client-secret: <secret>
            scope:
              - email
              - profile
              - https://www.googleapis.com/auth/calendar.readonly

当应用程序启动时我可以访问http://localhost:8080/用户并要求用户登录谷歌。成功登录后,配置文件 json 将作为以下响应显示在浏览器中:

安全控制器

@RestController
class SecurityController {
    @RequestMapping("/user")
    fun user(principal: Principal): Principal {
        return principal
    }
}

安全配置.kt

@Configuration
class SecurityConfiguration : WebSecurityConfigurerAdapter() {
    @Throws(Exception::class)
    override fun configure(http: HttpSecurity) {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .oauth2Login()
    }
}

Question

我想重用此身份验证来检索所有用户的日历事件。以下代码取自谷歌有关访问日历API的教程,但它创建了一个完全独立的授权流程并要求用户登录。

    @Throws(IOException::class)
    private fun getCredentials(httpTransport: NetHttpTransport): Credential {
        val clientSecrets = loadClientSecrets()
        return triggerUserAuthorization(httpTransport, clientSecrets)
    }

    private fun loadClientSecrets(): GoogleClientSecrets {
        val `in` = CalendarQuickstart::class.java.getResourceAsStream(CREDENTIALS_FILE_PATH)
                ?: throw FileNotFoundException("Resource not found: $CREDENTIALS_FILE_PATH")
        return GoogleClientSecrets.load(JSON_FACTORY, InputStreamReader(`in`))
    }

    private fun triggerUserAuthorization(httpTransport: NetHttpTransport, clientSecrets: GoogleClientSecrets): Credential {
        val flow = GoogleAuthorizationCodeFlow.Builder(
                httpTransport, JSON_FACTORY, clientSecrets, SCOPES)
                .setDataStoreFactory(FileDataStoreFactory(File(TOKENS_DIRECTORY_PATH)))
                .setAccessType("offline")
                .build()
        val receiver = LocalServerReceiver.Builder().setPort(8880).build()
        return AuthorizationCodeInstalledApp(flow, receiver).authorize("user")
    }

如何重复使用已完成的身份验证来访问 Google 帐户上的最终用户日历活动?


如果我理解正确的话,您重用身份验证的意思是您想要使用 Spring 为您检索的访问和刷新令牌,以便将它们用于针对 Google API 的请求。

用户身份验证详细信息可以注入到端点方法中,如下所示:

import org.springframework.security.oauth2.client.OAuth2AuthorizedClient
import org.springframework.security.oauth2.client.annotation.RegisteredOAuth2AuthorizedClient
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController

@RestController
class FooController(val historyService: HistoryService) {

    @GetMapping("/foo")
    fun foo(@RegisteredOAuth2AuthorizedClient("google") user: OAuth2AuthorizedClient) {
        user.accessToken
    }

}

详细信息在OAuth2AuthorizedClient您应该能够使用 google API 执行您需要的任何操作。

如果您需要在没有用户向您的服务发出请求的情况下访问 API,您可以注入OAuth2AuthorizedClientService到托管组件中,并像这样使用它:

import org.springframework.security.oauth2.client.OAuth2AuthorizedClient
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientService
import org.springframework.stereotype.Service

@Service
class FooService(val clientService: OAuth2AuthorizedClientService) {

    fun foo() {
        val user = clientService.loadAuthorizedClient<OAuth2AuthorizedClient>("google", "principal-name")
        user.accessToken
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot 社交登录和 Google 日历 API 的相关文章

随机推荐

  • Unity : this == null 返回 true。怎么会发生这种事呢? [复制]

    这个问题在这里已经有答案了 我一直在统一开发一个项目 我试图用 Invoke string float 调用一个函数 虽然我收到一条错误消息说要检查我的gameobject为空 所以我尝试做 debug log gameObject nul
  • 用于绘制地图的底图/项目的 Pandas 错误

    我运行了下面的 Python 代码 这是一本书上的 绘制地图 可视化海地地震危机数据 的示例 Python 数据分析 第242 246页 该代码应该创建海地的绘图 但我收到如下错误 Traceback most recent call la
  • 如何从 Win32 DLL 或 OCX 中提取 GUID

    我们有一个 NET 应用程序需要检查可能包含 COM 库 DLL 和 OCX 的文件夹 当我们遇到 COM 库时 我们需要完成的一件事是从 COM DLL 或 OCX 中提取 GUID 有没有一种直接的方法可以在 NET 中执行此操作而不使
  • 无法访问存储在我的 App_Data 文件夹中的图像

    我的 ASP NET MVC Web 应用程序中有以下链接 a href App Data uploads 38 png Model Name a 但是当我点击此链接时 出现以下错误 HTTP 错误 404 8 未找到 请求过滤模块被配置为
  • 将数组从 C# COM 对象传递到 JavaScript?

    与此类似如何将 ActiveX 对象中的字符串数组返回到 JScript但在 C 中 我有一个 COM 控件 它将字符串数组传回 javascript 似乎 javascript 无法理解我传回的是什 么 并且 javascript 中的数
  • 拒绝未转义 HTML 字符的正则表达式

    我想限制在特定输入字段中使用未转义的 符号 我无法让正则表达式杀死 的使用 除非后面跟着 amp 或者可能只是限制 的使用 注意空格 我尝试调整答案在这个线程中 但无济于事 谢谢 FWIW 这是我制作的一个正则表达式 以确保文件名字段不包含
  • 是否可以使用 JMX 在一台中央 MBean 服务器中注册或显示来自不同 VM 的 MBean?

    我正在寻找一种解决方案 用于从中央 MBean 服务器中的不同 Java VM 注册 MBean 或整个 MBean 服务器本身 该服务器也应该在单独的 VM 中运行 目标是只有一个中央 MBean 服务器 其中包含整个系统的所有 MBea
  • Angular UI 引导模式

    我正在使用 Angular UI Bootstrap 模式 ui bootstrap dialog 并且我有background true backgroundClick true 但是 当用户单击远离模式时 我不仅想执行关闭功能 还想执行
  • 如何使用.htaccess将图像请求重写为PHP脚本?

    我有一个 PHP 脚本位于http sb1 dev codeanywhere net a70097sb hc onlinestatus image php这需要两个GET变量 ign and style My htaccess文件与以下目录
  • MySQL 和 C:对 `_mysql_init@4'| 的未定义引用

    我正在尝试为 C 编写一个简单的脚本来从 MySQL 数据库获取值 但它抛出此错误 未定义引用 mysql init 4 不知道我是否没有链接到我应该链接的内容 我的C知识有限 我在 Windows 上使用代码块 这是我的代码 includ
  • 使用计划作业 SQL Agent Management Studio 导出到 CSV

    我正在尝试创建一个 SQL 代理作业 该作业每天自动运行以下查询并生成一个 CSV 文件 该文件存储在 C test csv 上 并通过电子邮件发送给人们 我在网上尝试了各种选项 但找不到适合我的查询的选项 它是来自多个数据集的数据 放入单
  • 如何使用父页面 css 为 iframe 页面内容赋予样式?

    如何使用父页面 css 设置 iframe 页面内容的样式 我没有 iframe 页面的访问权限 我做了这个例如 http jsbin com uxobe 如何为我在 iframe 中使用的页面设置不同的 HTML 样式 有没有办法通过 c
  • :before :after 透明背景下网站标题的 HR 值

    遇到了一些难题 下图是站点标题区域并具有背景图像 到 HTML 文档的正文 然后 我将透明背景放入整个容器 基本上是跨浏览器的半透明背景 深棕色 最重要的是 我使用 PNG 24 切片来处理较暗的边缘 我所坚持的部分是利用 before 和
  • 将 Google Fit 数据提取到 Android 应用程序中

    我们如何获取特定用户存储在 google fit cloud 中的数据 我尝试使用 History API 但没有显示任何数据 然后我尝试通过历史 API 输入一些数据 现在我只能通过历史 API 看到这些数据 而不是实际驻留在 fit 中
  • 将 Promise 与下载模块结合使用

    我用蓝鸟来承诺 我试图承诺下载模块 这是我的实现 Promise require bluebird download require download var methodNameToPromisify download function
  • 为什么 isdigit 参数是整数?

    功能std isdigit is int isdigit int ch 返回值 如果字符是数字字符 则返回非零值 否则为零 听起来像是该函数是从 C 继承的 但即使这样也不能解释为什么参数类型是int not char同时 如果 ch 的值
  • 将 Python virtualenv 移植到另一个系统

    我在计算机上的日常工作中使用了许多 python 软件包 例如 numpy bottleneck h5py 由于我是这台机器上的root用户 所以安装这些软件包是没有问题的 但是 我想在只有普通用户帐户的服务器计算机上使用不同软件包的 环境
  • 将 SQL 转换为 Linq 查询

    我对 Linq 查询很陌生 我只想将我的数据库查询转换为 Linq 这是我的简单 SQL 查询 var query SELECT EnrollmentDate COUNT AS StudentCount FROM Person WHERE
  • 使用程序(JAVA 代码)运行 Jmeter 测试后如何保存结果集?

    我已经使用 Java 代码在 eclipse 中使用 Jmeter 依赖项运行 Jmeter 脚本 幸运的是 我的脚本运行良好 但现在我无法存储相同的结果 谁能告诉我如何实现这一目标 请参阅我尝试过的以下代码 package com sol
  • Spring Boot 社交登录和 Google 日历 API

    Problem 通过 Spring Security OAuth2 重用最终用户 Google 身份验证来访问 Web 应用程序中的 Google Calendar API 描述 我能够通过 Spring Security 登录创建一个小型