Java 应用中获取 Google OAuth 2.0 访问令牌的实用指南

Java 应用中获取 Google OAuth 2.0 访问令牌的实用指南

本教程旨在指导 java 应用程序如何通过 google oauth 2.0 授权代码流获取用户访问令牌。针对直接使用 `googlecredentials.builder` 遇到的权限问题,本文将介绍正确的依赖配置、`client_secrets.json` 文件创建,并提供使用 `googleauthorizationcodeflow` 实现交互式用户认证的完整代码示例,最终安全地获取并管理访问令牌,助力开发者顺利集成 google api。

引言:理解 Google OAuth 2.0 认证挑战

在 Java 应用程序中与 Google API 进行交互时,获取用户授权的访问令牌是关键一步。许多开发者在尝试直接使用 com.google.auth.oauth2.GoogleCredentials.Builder 配合 clientId 和 clientSecret 获取访问令牌时,可能会遇到 Builder() 方法受保护的访问权限问题。这是因为 GoogleCredentials.Builder 主要设计用于服务账户认证或在已拥有刷新令牌等凭据时构建 GoogleCredentials 对象,而非用于启动交互式的用户授权流程。

对于需要用户通过浏览器进行认证并授予应用程序访问权限的场景(例如桌面应用程序或自动化脚本),Google 推荐使用 OAuth 2.0 授权代码流(Authorization Code Flow)。本文将详细介绍如何正确配置项目、实现这一流程,并安全地获取所需的 Google 访问令牌。

项目依赖配置

为了实现 Google OAuth 2.0 授权代码流,我们需要在项目的 pom.xml 文件中添加以下 Maven 依赖。这些库提供了处理 OAuth 流程、HTTP 请求以及 JSON 解析所需的功能。

                com.google.api-client        google-api-client        1.32.1                     com.google.oauth-client        google-oauth-client        1.32.1                    com.google.oauth-client        google-oauth-client-jetty        1.32.1                    com.google.http-client        google-http-client-jackson2        1.39.2                    com.google.oauth-client        google-oauth-client-java6        1.32.1    

请注意,版本号可能需要根据最新的稳定版本进行调整。

立即学习“Java免费学习笔记(深入)”;

Veed AI Voice Generator Veed AI Voice Generator

Veed推出的AI语音生成器

Veed AI Voice Generator 77 查看详情 Veed AI Voice Generator

配置客户端密钥:client_secrets.json

出于安全性和最佳实践考虑,您的 clientId 和 clientSecret 不应硬编码在源代码中。Google 推荐将这些凭据存储在一个名为 client_secrets.json 的文件中。

1. 从 Google Cloud 控制台获取凭据

访问 Google Cloud 控制台 (console.cloud.google.com)。选择或创建一个项目。导航到 “API 和服务” -> “凭据”。点击 “创建凭据”,选择 “OAuth 客户端 ID”。选择 “桌面应用” 作为应用程序类型,然后创建。创建后,您将获得客户端 ID 和客户端密钥。点击 “下载 JSON” 按钮,下载的文件通常就是 client_secret_.json。将其重命名为 client_secrets.json。

2. client_secrets.json 文件结构

下载的 client_secrets.json 文件通常具有以下结构:

{  "web": { // 如果您选择的是“Web 应用”类型,这里是 "web"    "client_id": "YOUR_CLIENT_ID.apps.googleusercontent.com",    "project_id": "your-project-id",    "auth_uri": "https://accounts.google.com/o/oauth2/auth",    "token_uri": "https://oauth2.googleapis.com/token",    "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",    "client_secret": "YOUR_CLIENT_SECRET",    "redirect_uris": [      "http://localhost" // 或其他配置的重定向 URI    ]  },  "installed": { // 如果您选择的是“桌面应用”类型,这里是 "installed"    "client_id": "YOUR_CLIENT_ID.apps.googleusercontent.com",    "project_id": "your-project-id",    "auth_uri": "https://accounts.google.com/o/oauth2/auth",    "token_uri": "https://oauth2.googleapis.com/token",    "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",    "client_secret": "YOUR_CLIENT_SECRET",    "redirect_uris": [      "http://localhost"    ]  }}

请确保您的 client_secrets.json 文件位于项目的类路径下(例如 src/main/resources 目录),以便程序可以加载它。

实现 Google OAuth 2.0 授权代码流

以下是使用 Java 实现 Google OAuth 2.0 授权代码流的完整代码示例。此示例将引导用户在浏览器中完成认证,然后应用程序将接收授权代码并交换为访问令牌。

package com.example.googleauth;import com.google.api.client.auth.oauth2.Credential;import com.google.api.client.extensions.java6.auth.oauth2.FileDataStoreFactory;import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;import com.google.api.client.http.HttpTransport;import com.google.api.client.json.JsonFactory;import com.google.api.client.json.jackson2.JacksonFactory;import com.google.api.client.util.store.DataStoreFactory;import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;import java.io.File;import java.io.IOException;import java.io.InputStreamReader;import java.security.GeneralSecurityException;import java.util.Collections;import java.util.List;public class GoogleTokenFetcher {    /** 应用程序名称,用于标识用户代理 */    private static final String APPLICATION_NAME = "Google Token Fetcher";    /** JSON 工厂,用于解析 JSON 响应 */    private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();    /** HTTP 传输器 */    private static HttpTransport HTTP_TRANSPORT;    /** 数据存储工厂,用于持久化凭据(如刷新令牌) */    private static FileDataStoreFactory DATA_STORE_FACTORY;    /**     * 定义应用程序所需的授权范围(Scopes)。     * 这里以访问 Google 日历为例,您可以根据需要更改。     * 更多 Scope 请参考 Google API 文档。     */    private static final List SCOPES = Collections.singletonList("https://www.googleapis.com/auth/calendar.readonly");    // 如果需要访问用户个人资料,可以使用 "https://www.googleapis.com/auth/userinfo.profile"    // 或 "https://www.googleapis.com/auth/userinfo.email"    // 甚至更通用的 "https://www.googleapis.com/auth/drive.readonly" 等    static {        try {            HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();            // 凭据将存储在用户主目录下的 .store/google_token_fetcher 目录中            DATA_STORE_FACTORY = new FileDataStoreFactory(new File(System.getProperty("user.home"), ".store/google_token_fetcher"));        } catch (GeneralSecurityException | IOException e) {            e.printStackTrace();            System.exit(1);        }    }    public static void main(String[] args) throws IOException {        try {            Credential credential = authorize();            if (credential != null && credential.getAccessToken() != null) {                String accessToken = credential.getAccessToken();                System.out.println("成功获取访问令牌 (Access Token): " + accessToken);                // 您可以使用这个访问令牌调用 Google API                // 例如:                // Calendar service = new Calendar.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)                //         .setApplicationName(APPLICATION_NAME)                //         .build();                // Event event = service.events().get("primary", "eventId").execute();                // System.out.println("获取到的事件:" + event.getSummary());            } else {                System.out.println("未能获取访问令牌。");            }        } catch (Exception e) {            System.err.println("授权过程中发生错误: " + e.getMessage());            e.printStackTrace();        }    }    /**     * 授权安装的应用程序访问用户的受保护数据。     * @return Credential 对象,包含访问令牌和刷新令牌     * @throws Exception 如果授权过程中发生错误     */    private static Credential authorize() throws Exception {        // 1. 加载客户端密钥 (client_secrets.json)        // 确保 client_secrets.json 文件在类路径中 (例如 src/main/resources)        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(                JSON_FACTORY,                new InputStreamReader(GoogleTokenFetcher.class.getResourceAsStream("/client_secrets.json"))        );        // 2. 设置授权代码流        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(                HTTP_TRANSPORT,                JSON_FACTORY,                clientSecrets,                SCOPES // 应用程序所需的权限范围            )            .setDataStoreFactory(DATA_STORE_FACTORY) // 用于持久化凭据,例如刷新令牌            .setAccessType("offline") // 请求刷新令牌,以便在访问令牌过期后重新获取            .build();        // 3. 授权用户        // LocalServerReceiver 会在本地启动一个服务器,监听 Google 授权回调        LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); // 可以指定端口        return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");    }}

代码解析:

静态初始化块 (static {}): 初始化 HttpTransport 和 DataStoreFactory。GoogleNetHttpTransport.newTrustedTransport() 用于创建安全的 HTTP 传输层。FileDataStoreFactory 用于将用户的凭据(包括刷新令牌)持久化存储在本地文件系统中,避免每次运行时都要求用户重新授权。SCOPES: 定义了应用程序需要访问用户数据的权限范围。请务必根据您的应用程序实际需求选择合适的 Scope。authorize() 方法:加载 client_secrets.json: 使用 GoogleClientSecrets.load() 从类路径加载 client_secrets.json 文件。构建 GoogleAuthorizationCodeFlow: 这是 OAuth 2.0 授权代码流的核心

以上就是Java 应用中获取 Google OAuth 2.0 访问令牌的实用指南的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/862231.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
搜狗浏览器如何更换浏览器皮肤主题 搜狗浏览器个性化外观设置指南
上一篇 2025年11月28日 00:11:15
ChatGPT怎么改成中文界面 多语言切换的步骤教学
下一篇 2025年11月28日 00:11:15

相关推荐

  • safari浏览器如何开启画中画模式播放视频_safari浏览器画中画模式开启方法

    如果您在观看网页视频时希望同时进行其他操作,可以启用 Safari 浏览器的画中画模式,让视频以浮动小窗形式继续播放。此功能支持大多数主流视频网站,如 YouTube、优酷等。 本文运行环境:MacBook Air,macOS Sonoma 一、通过视频右键菜单开启画中画 此方法适用于正在播放的视频…

    2026年9月23日
    000
  • go 语言版本控制器

    管理不同版本的go语言环境是一项繁琐的任务,尤其是当需要为每个go特性单独安装go环境时。为了简化这一过程,我们需要一个版本管理工具来统一管理go环境。以下是关于go版本控制器g的详细介绍。 一、Go版本控制器g简介 g是一个适用于Linux、macOS和Windows的命令行工具,旨在提供一个方便…

    2026年9月23日
    000
  • 抖音app如何关注其他用户

    在抖音这个充满创意与乐趣的平台上,关注他人是发掘优质内容、拓展社交圈的重要途径。那么,该如何在抖音app中关注其他用户呢? 首先,打开抖音App。进入首页后,你会看到源源不断的短视频自动播放。在屏幕顶部,搜索栏旁有一个“放大镜”图标,点击即可进入搜索页面。在这里,你可以通过输入用户名、关键词等方式查…

    2026年9月23日
    200
  • FlexClip如何用于在线AI视频制作?快速创建云端AI视频的技巧

    FlexClip如何用于在线AI视频制作?快速创建云端AI视频的技巧FlexClip如何用于在线AI视频制作?快速创建云端AI视频的技巧FlexClip如何用于在线AI视频制作?快速创建云端AI视频的技巧FlexClip如何用于在线AI视频制作?快速创建云端AI视频的技巧

    FlexClip通过AI脚本生成、文本转视频、AI配音与图片生成等智能工具,实现从文案到成片的高效制作。其亮点在于一站式云端操作、强大内容生成力、素材库丰富、易用性与专业性兼备。用户可通过个性化修改、原创素材融入、精细剪辑及多轮迭代提升视频独特性,同时应对AI理解偏差、素材同质化、情感表达局限等挑战…

    2026年9月23日 用户投稿
    000
  • mysql怎么添加降序索引 mysql创建排序索引的语法详解

    mysql怎么添加降序索引 mysql创建排序索引的语法详解mysql怎么添加降序索引 mysql创建排序索引的语法详解mysql怎么添加降序索引 mysql创建排序索引的语法详解mysql怎么添加降序索引 mysql创建排序索引的语法详解

    mysql从8.0版本开始支持降序索引,通过在列名后添加desc关键字创建,例如create index idx_order_date_desc on orders (order_date desc);。1. 降序索引优化了order by column desc查询的性能,避免文件排序;2. 升序…

    2026年9月23日 用户投稿
    100
  • Java中使用栈验证JSON字符串结构:深入理解与实践

    本文探讨了在Java中利用栈验证JSON字符串结构的核心原理与常见陷阱。我们将分析一种初始实现中处理引号、转义字符及字符串内部结构字符的不足,并提供一个更健壮的栈基方法,以准确判断JSON的括号、方括号和引号是否平衡,同时纠正关于不完整JSON片段有效性的常见误解。 1. JSON结构与验证的重要性…

    2026年9月23日
    100
  • CentOS服务器安装宝塔(图文详解)

    CentOS服务器安装宝塔(图文详解)CentOS服务器安装宝塔(图文详解)CentOS服务器安装宝塔(图文详解)CentOS服务器安装宝塔(图文详解)

    一、概述 宝塔是一款安全且高效的服务器管理面板。 快速创建和管理web项目 提供方便的网站管理功能,例如域名绑定,一键部署SSL证书,调整网站配置等。 >>查看 快速查看服务器资源使用情况 监测CPU、内存、磁盘IO、网络IO数据,并可设置记录保存天数,随时查看特定日期的数据。 >…

    2026年9月23日 用户投稿
    100
  • mysql索引类型有哪些 mysql创建不同索引的方法对比

    mysql索引类型有哪些 mysql创建不同索引的方法对比mysql索引类型有哪些 mysql创建不同索引的方法对比mysql索引类型有哪些 mysql创建不同索引的方法对比mysql索引类型有哪些 mysql创建不同索引的方法对比

    mysql支持多种索引类型,选择合适的索引类型可提升数据库性能。1.b-tree索引适用于等值、范围查询和排序,是innodb和myisam的默认索引;2.hash索引仅适合等值查询,不支持范围和排序,memory引擎支持显式创建;3.fulltext索引用于文本搜索,适合关键词查找;4.空间索引(…

    2026年9月23日 用户投稿
    000
  • 京东自营外卖门店“七鲜小厨”入驻美团

    10 月 13 日消息,据电商派今日报道,京东自营外卖门店“七鲜小厨”已正式登陆美团 app。与此同时,京东全新推出的独立咖啡品牌“七鲜咖啡”也同步上线美团平台。 京东首家“七鲜小厨”自营外卖门店于今年7月20日在北京市东城区开业,采用“外卖 + 自提”的运营模式,不设堂食服务,用户可通过线上渠道下…

    2026年9月23日
    000
  • QQ音乐会员退订后还能听吗_QQ音乐会员退订后听歌的说明

    退订QQ音乐会员后将无法享受高音质、无广告等权益,系统自动切换至免费模式。此时仅可播放标有“免费”或无版权标识的歌曲,VIP歌曲需开通会员才能畅听。已下载的加密格式会员歌曲(如.QMC、.TMF)在会员过期后无法继续播放,需重新开通会员解密。免费用户可通过观看广告解锁每日最多5首歌曲完整播放,每次看…

    2026年9月23日
    300
  • Tableau的AI混合工具如何操作?生成智能数据可视化的实用指南

    Tableau的AI混合工具通过自然语言查询、自动解释和预测模型,降低数据分析门槛,帮助非技术用户快速获取洞察。首先,Ask Data支持用日常语言提问,自动生成可视化图表,显著提升数据探索效率;其次,Explain Data利用机器学习分析异常点,揭示潜在影响因素,将“是什么”转化为“为什么”;再…

    2026年9月23日
    000
  • mysql安装完成如何事件 mysql定时任务设置教程

    mysql安装完成如何事件 mysql定时任务设置教程mysql安装完成如何事件 mysql定时任务设置教程mysql安装完成如何事件 mysql定时任务设置教程mysql安装完成如何事件 mysql定时任务设置教程

    要使用mysql的事件调度器设置定时任务,首先需开启事件调度器,其次创建定时事件,再查看管理事件,最后注意权限与时间格式等问题。具体步骤如下:1. 开启事件调度器:通过命令或配置文件启用;2. 创建事件:使用create event定义执行频率与sql操作;3. 管理事件:可查看、修改或删除已有事件…

    2026年9月23日 用户投稿
    100
  • OpenAI 与微软达成重磅交易:股权结构再变,投资者面临稀释风险

    据《金融时报》披露,OpenAI 近期完成了一系列关键性交易,使其股权架构日趋复杂,同时也加剧了投资者对未来收益前景的担忧。在这些新协议推动下,OpenAI 的估值已飙升至5000亿美元,跃居全球最具价值的未上市企业之列。这一惊人估值的背后,是公司与英伟达和AMD两家芯片巨头达成的数十亿美元合作协议…

    2026年9月23日
    000
  • windows怎么更改系统默认字体 windows系统默认字体更改教程

    可通过修改注册表、使用第三方工具或更换主题间接更改Windows默认字体。首先备份系统,避免操作失误导致界面异常。 如果您发现Windows系统的默认字体显示效果不理想,或者希望个性化界面外观,可以通过修改系统设置或注册表来更改默认字体。以下是实现这一目标的具体步骤。 本文运行环境:Dell XPS…

    2026年9月23日
    000
  • 抖音短视频被系统判定违规怎么办 抖音内容管理与违规申诉方法

    先明确违规原因,再通过APP申诉并提交原创或授权证据,必要时邮件、电话多渠道沟通,确保材料真实完整。 抖音视频被系统判定违规,先别急着申诉,关键是要搞清楚为什么会被判。平台的审核机制有时会出现误判,但也可能是内容确实踩了红线。处理的核心是精准定位问题、准备充分证据、通过正确渠道沟通。下面分几步说明怎…

    2026年9月23日
    300
  • NS2版《无主之地4》突遭延期!预购将取消

    《无主之地4》现可提前购入,使用金币叠加限时优惠券后,标准版仅需244.5元(共节省 ¥53.5);超级豪华版为457.4元(总计优惠 ¥100.6)。 原计划于10月3日发布的《无主之地4》Nintendo Switch 2版本已确认延期。Gearbox Entertainment最新发布公告称,…

    2026年9月23日
    200
  • 如何在mysql中优化多表JOIN查询

    答案:优化MySQL多表JOIN需创建关联字段索引、提前过滤数据、选择合适JOIN类型与表序、利用EXPLAIN分析执行计划,并定期更新统计信息以提升查询效率。 在MySQL中优化多表JOIN查询,关键在于减少数据扫描量、提升连接效率,并合理利用索引和执行计划。以下是一些实用的优化策略。 1. 确保…

    2026年9月23日
    300
  • WooCommerce 购物车联动:实现赠品自动添加与移除的专业指南

    本文提供了一份关于在 woocommerce 中实现自动赠品系统的全面指南。它解决了在程序化添加产品时常见的 `woocommerce_add_to_cart` 递归问题,并提供了一个使用自定义购物车项元数据来管理关联赠品的健壮解决方案,确保赠品能与特定主产品同步添加和移除。 引言 在电子商务中,为…

    2026年9月23日
    500
  • 苹果手机USB调试模式开启方法

    准备工作 在操作前,请确保你的iPhone已连接网络,并升级至最新的iOS系统版本。同时,准备一台安装了最新版iTunes(Windows)或Finder(macOS)的电脑,以确保设备能够被正确识别和管理。 步骤一:开启相关调试功能 打开iPhone上的“设置”应用。 进入“Safari”浏览器设…

    2026年9月23日
    100
  • Java Web项目在无Maven/Eclipse环境下生成WAR包的实践指南

    本文详细介绍了如何在没有Maven或Eclipse等集成开发环境或构建工具的情况下,为Java Web项目手动或通过Apache Ant工具生成WAR文件。教程涵盖了WAR文件的基本结构、使用Ant进行编译和打包的具体步骤,并提供了Ant构建脚本示例,旨在帮助开发者理解并实践WAR包的独立构建过程。…

    2026年9月23日
    100

发表回复

登录后才能评论
关注微信