如何在没有用户干预的情况下授权应用程序(网络或安装)?

2024-02-04

假设我有一个网络应用程序(“mydriveapp”)需要在后台服务中访问云端硬盘文件。它将拥有其正在访问的文件,或者在所有者与其共享文档的 Google 帐户中运行。

我知道我的应用程序需要刷新令牌,但是我不想编写代码来获得它因为我只会做一次。

注意。这不使用服务帐户。该应用程序将在传统的谷歌帐户下运行。在某些情况下,服务帐户是一种有效的方法。然而,使用 Oauth Playground 模拟应用程序的技术可以节省大量多余的工作,并且适用于不支持共享到服务帐户的任何 API。


请注意,2022 年 6 月。Google 似乎更新了其验证要求,增加了额外的步骤(或否定该方法 - 取决于您的观点)。 查看最近的评论了解更多详情

这可以通过 Oauth2 Playground 来完成,网址为https://developers.google.com/oauthplayground https://developers.google.com/oauthplayground

Steps:-

  1. 创建 Google 帐户(例如[电子邮件受保护] /cdn-cgi/l/email-protection) - 如果您使用现有帐户,请跳过此步骤。
  2. 使用 API 控制台注册 mydriveapp (https://console.developers.google.com/apis/credentials/oauthclient?project=mydriveapp https://console.developers.google.com/apis/credentials/oauthclient?project=mydriveapp要不就https://console.developers.google.com/apis/ https://console.developers.google.com/apis/)
  3. 创建一组新的凭据。Credentials/Create Credentials/OAuth Client Id然后选择Web application
  4. Include https://developers.google.com/oauthplayground https://developers.google.com/oauthplayground作为有效的重定向 URI
  5. 记下客户端 ID(Web 应用程序)和客户端密钥
  6. 登录身份[电子邮件受保护] /cdn-cgi/l/email-protection
  7. 前往 Oauth2 游乐场
  8. 在设置(齿轮图标)中,设置
  • OAuth 流程:服务器端
  • 访问类型:离线
  • 使用您自己的 OAuth 凭据:勾选
  • 客户端 ID 和客户端密钥:来自第 5 步
  1. 单击步骤 1 并选择 Drive API v3https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/drive(话虽如此,该技术也适用于列出的任何 Google API)
  2. 单击授权 API。系统将提示您选择 Google 帐户并确认访问
  3. 单击步骤 2 和“将授权码兑换为令牌”
  4. 复制返回的刷新令牌并将其粘贴到您的应用程序、源代码或某种形式的存储中,您的应用程序可以从中检索它。

您的应用程序现在可以在无人值守的情况下运行,并按所述使用刷新令牌https://developers.google.com/accounts/docs/OAuth2WebServer#offline https://developers.google.com/accounts/docs/OAuth2WebServer#offline获取访问令牌。

注意。请注意,刷新令牌可能会被 Google 过期,这意味着您需要重复第 5 步以获取新的刷新令牌。其症状是当您尝试使用刷新令牌时返回无效授予。

注意2。如果您想要一个可以访问您自己的(并且only您自己的)驱动器帐户,无需编写仅运行一次的授权代码。只需跳过步骤 1,并在步骤 6 中将“my.drive.app”替换为您自己的电子邮件地址。确保您了解刷新令牌被盗时的安全影响。

请参阅下面伍迪的评论,其中他链接到此 Google 视频https://www.youtube.com/watch?v=hfWe1gPCnzc https://www.youtube.com/watch?v=hfWe1gPCnzc

. . .

下面是一个快速 JavaScript 例程,展示了如何使用 OAuth Playground 中的刷新令牌来列出一些云端硬盘文件。您可以简单地将其复制粘贴到 Chrome 开发控制台中,或者使用 Node.js 运行它。当然要提供你自己的凭据(下面的都是假的)。

function get_access_token_using_saved_refresh_token() {
    // from the oauth playground
    const refresh_token = "1/0PvMAoF9GaJFqbNsLZQg-f9NXEljQclmRP4Gwfdo_0";
    // from the API console
    const client_id = "559798723558-amtjh114mvtpiqis80lkl3kdo4gfm5k.apps.googleusercontent.com";
    // from the API console
    const client_secret = "WnGC6KJ91H40mg6H9r1eF9L";
    // from https://developers.google.com/identity/protocols/OAuth2WebServer#offline
    const refresh_url = "https://www.googleapis.com/oauth2/v4/token";

    const post_body = `grant_type=refresh_token&client_id=${encodeURIComponent(client_id)}&client_secret=${encodeURIComponent(client_secret)}&refresh_token=${encodeURIComponent(refresh_token)}`;

    let refresh_request = {
        body: post_body,
        method: "POST",
        headers: new Headers({
            'Content-Type': 'application/x-www-form-urlencoded'
        })
    }

    // post to the refresh endpoint, parse the json response and use the access token to call files.list
    fetch(refresh_url, refresh_request).then( response => {
            return(response.json());
        }).then( response_json =>  {
            console.log(response_json);
            files_list(response_json.access_token);
    });
}

// a quick and dirty function to list some Drive files using the newly acquired access token
function files_list (access_token) {
    const drive_url = "https://www.googleapis.com/drive/v3/files";
    let drive_request = {
        method: "GET",
        headers: new Headers({
            Authorization: "Bearer "+access_token
        })
    }
    fetch(drive_url, drive_request).then( response => {
        return(response.json());
    }).then( list =>  {
        console.log("Found a file called "+list.files[0].name);
    });
}

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

如何在没有用户干预的情况下授权应用程序(网络或安装)? 的相关文章

随机推荐

  • 启用基于客户位置的付款方式

    我不知道是否可能 但是 我们需要为巴塞罗那添加一些不同的付款方式 因此 我们的想法是 如果客户居住在巴塞罗那地区 加泰罗尼亚 他将看到与西班牙其他地区不同的信用卡付款方式和银行转账账户 WooCommerce 可以做到这一点吗 Thanks
  • Codeigniter - 从 where_in 中删除单引号

    我有两个疑问 genres this gt db gt select Group Concat intGenreId strDJGenres gt from tblDJGenres gt where intDJId this gt sess
  • 使用 rustdoc 生成 markdown 文档?

    有没有办法在 doc 中生成单个 markdown 文件 评论 多个 Markdown 文件 doc main md doc foo md等 也很好 我是 Rust 新手 虽然生成的 HTML 文档很好 但我主要生活在命令行上 真的不想为了
  • .setValue() 不能始终适用于 Google Sheets 脚本

    我一直在努力处理我在 Google Sheet 中编写的一段脚本 该脚本的目的是监视给定单元格的输入值 来自键盘 并验证输入是否遵循数据输入标准 例如 所有输入值必须遵循标准XX XX X 举个例子 A5 03 1是可以接受的 而B555
  • Swift:反映 NSManagedObject 子类的属性

    当使用 Mirror 访问 NSManagedObject 子类的内部结构时 所有托管变量都将被忽略 public class Foo NSManagedObject NSManaged var bar String var f Foo c
  • Windows 7 上的端口转发

    如何在 Windows 7 上将端口 xxx 上的传入请求重定向到 localhost yyy 开发服务器 相对于 2008 仅允许从本地主机访问 这还不够好 我需要从不同的计算机测试我的应用程序 感谢大家的建议 尽管我自己找到了答案 我下
  • 将数据存储在 iPhone 本地

    我正在构建一个应用程序 我想在设备本地存储用户信息 而不使用任何服务器数据库 但一切都在设备端 我希望存储特定的用户位置并将其显示在表格视图中 因此即使用户稍后启动应用程序 我也可以提取历史记录并向历史记录表提供过去的位置 基本上是本地数据
  • 使用PHP将制表符转换为空格以进行HTML显示?

    我需要在网页中显示一个纯文本文件 其中包含两个空格制表符的数据列 我所做的是使用 PHP 读取文本文件并将其打印出来 pre 标签使用等宽字体 如下所示 pre pre pre
  • Visual Studio 中 Qt 特定结构的缩进损坏

    VS编辑器中的自动缩进显然不知道Qt 信号和槽的声明会自动格式化 如下所示 class MyClass public QObject Q OBJECT public MyClass signals lt Broken indentation
  • 有没有 PHP 函数可以将数字转换为带有千位分隔符的货币?

    有没有PHP函数可以转换integer十亿和千万 900800 gt 9 00 800 500800 gt 5 00 800 正如您所添加的Yii在你的问题标签中 你可以这样做Yii的方式如下 Yii app gt language en
  • 由于视图模型为空,将剔除应用于填充的表单而不擦除表单的数据?

    我有一个脚本 通过将空视图模型应用到我的表单来初始化淘汰赛 当用户在表单中输入数据时 视图模型会相应更新 这是预期的行为 JavaScript var viewModel myField ko observable init functio
  • 是否可以在 Visual Studio Code 中为 Java 项目选择 JDK 8?

    我正在尝试使用 Visual Studio Code 来编译和运行基于 Maven 的 Java 项目 VSCODE 本身需要 JDK 11 我安装了 JDK 11 并将其添加为 VSCODE Java 配置 Java 运行时 部分中的 j
  • 动态类型与对象类型

    我交替使用了动态类型和对象类型 这两种类型有什么区别吗 使用其中一种对性能有什么影响吗 其中哪一个更灵活 They re hugely不同的 如果你使用dynamic您选择动态类型 从而在很大程度上选择退出编译时检查 是的 它的性能比使用静
  • 在多模块 Maven 构建中重用 ant-snippets

    如何在多个项目中重复使用 Ant 代码片段 假设我的根目录中有以下内容pom xml
  • 检查 Python 列表中是否存在某些内容

    我有一个元组列表Python http en wikipedia org wiki Python 28programming language 29 并且我有一个条件 仅当元组不在列表中时我才想采用分支 如果它在列表中 那么我不想采用 if
  • 使用 Spring Boot 实现 2 路 SSL

    我正在创建一些宁静的 Web 服务 并使用 Spring Boot 创建嵌入式 tomcat 容器 要求之一是实现 2 路 SSL 我一直在查看 HttpSecurity 对象 并且可以使用以下方法让它仅通过 SSL 通道运行 Web 服务
  • 对于 4 KB 小文件来说,最佳的压缩算法是什么?

    我正在尝试将 TCP 数据包压缩为大约 4 KB 大小 数据包可以包含任何字节 从 0 到 255 我发现的所有压缩算法基准都是基于较大的文件 我没有找到任何比较不同算法对小文件的压缩率的内容 这正是我所需要的 我需要它是开源的 这样它就可
  • 当你无法使用ViewState时你会做什么?

    我有一个相当复杂的页面 它在转发器内动态构建用户控件 该转发器必须在 Init page 事件期间绑定ViewState已初始化 否则动态创建的用户控件将不会保留其状态 这创建了一个有趣的 Catch 22 因为我将转发器绑定到的对象需要在
  • 如何从sqlite3数据库中的字符串中删除字符?

    我的 sqlite 数据库中有一个像这样的字符串 a 文本 我想从数据库中删除 a 有人知道这个查询吗 laalto 的答案很接近 但它不适用于边缘情况 特别是如果 a 出现在字符串的其他地方 你想使用SUBSTR仅删除前 3 个字符 sq
  • 如何在没有用户干预的情况下授权应用程序(网络或安装)?

    假设我有一个网络应用程序 mydriveapp 需要在后台服务中访问云端硬盘文件 它将拥有其正在访问的文件 或者在所有者与其共享文档的 Google 帐户中运行 我知道我的应用程序需要刷新令牌 但是我不想编写代码来获得它因为我只会做一次 注