当前位置: 首页 > 知识库问答 >
问题:

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

江亮
2023-03-14

假设我有一个web应用程序(“MyDriveApp”)需要在后台服务中访问驱动器文件。它要么拥有正在访问的文件,要么在所有者共享文档的谷歌账户中运行。

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

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

共有1个答案

薛修能
2023-03-14

这可以通过https://developers.google.com/oauthplayground的Oauth2 Playground实现

步骤:-

  • 创建谷歌帐户(例如,my.drive.app@gmail.com)-如果使用的是现有帐户,则跳过此步骤。
  • 使用API控制台注册mydriveapp(https://console.developers.google.com/apis/credentials/oauthclient?project=mydriveapp,或仅https://console.developers.google.com/apis/)
  • 创建一组新的凭据。凭据/Create Credentials/OAuth Client ID,然后选择Web Application
  • 将https://developers.google.com/oauthplayground作为有效的重定向URI
  • 注意客户端ID(web应用程序)和客户端机密
  • 登录为my.drive.app@gmail.com
  • 转到Oauth2游乐场
  • 在设置(齿轮图标)中,设置
    • OAuth流:服务器端
    • 访问类型:脱机
    • 使用您自己的OAuth凭据:tick
    • 客户端Id和客户端机密:来自步骤5

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

    注意,刷新令牌可能会被谷歌过期,这意味着你需要重复步骤5来获得一个新的刷新令牌。这种情况的症状是,当您尝试使用刷新令牌时,将返回无效的授权。

    NB2.如果您想要一个web应用程序访问您自己的(并且只访问您自己的)驱动器帐户,而无需编写只能运行一次的授权代码,则此技术非常有效。跳过第一步,在第六步中用你自己的电子邮件地址替换“my.drive.app”。确保您知道刷新令牌被盗时的安全影响。

    请参阅伍迪在下面的评论,他链接到这段谷歌视频https://www.youtube.com/watch?v=hfwe1gpcnzc

    ...

    下面是一个快速的JavaScript例程,演示如何使用来自OAuth游乐场的刷新令牌列出一些驱动器文件。您可以简单地将它复制粘贴到Chrome dev控制台,或者使用Node运行它。当然提供你自己的凭据(下面的都是假的)。

    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();
    

 类似资料:
  • 我想为android清单做一个权限这个权限是 我的问题是,在没有用户干预的情况下,如何做到这一点?

  • 我使用创建了一个应用程序构建文件。这将用和文件填充文件夹。 我在internet上进行了搜索,发现可以使用运行这些文件。不幸的是,这会产生以下错误输出: org.springframework.beans.factory.BeanCreationException:创建名为“org.springframework.boot.autocigure.orm.jpa.hibernatejpaAutoCo

  • 有什么方法可以让访问部署的云运行应用程序变得更有趣吗? PS:我不想把应用程序放在我们的cluser中-所以这里只有完全管理是一个选项

  • 我想在Java Spring boot中获取我的应用程序的当前url。但问题是,我想从类而不是从中获得它。我试图从获取这个,但我无法将其包导入我的类。 请帮我得到我的网站的网址,不应该硬编码。或者如果有一种方法可以使用到我的util类。

  • Milena Nikolic在“Google Play的新功能”演讲中表示,这是Google推出android11的一部分,她说: 当我们继续改进应用程序包时,我们期望它成为2021的某个新应用程序的需求。 我在文档中看到的一切都表明,在Play Store中使用应用程序捆绑包的唯一方法是使用他们的Play应用程序签名服务,例如: 注册到应用程序播放应用程序签名。否则,无法将应用包上传到Play控

  • 问题内容: 我想知道如何在Spring MVC上引导我的应用程序? 我有一个初始化器: 我知道我们为什么需要以及如何使用它来引导应用程序。但是我不明白,如果没有文件(只有),怎么知道应该使用哪个servlet来引导应用程序? 依存关系 我在Spring核心中找到了此类。使用它来引导我的应用程序是否正确? http://docs.oracle.com/javaee/7/api/javax/servl