在Google电子表格API中使用OAuth 2.0授权请求

在Google电子表格API中使用OAuth 2.0授权请求,oauth,google-sheets,google-data-api,google-spreadsheet-api,Oauth,Google Sheets,Google Data Api,Google Spreadsheet Api,我正在尝试创建一个PHP网页,需要从我的域中的google电子表格中读取一些数据(我使用的是google Apps Free Edition) 要阅读的电子表格是非公开的,但我所在领域的某些人可以看到。由于它是非公开的,我知道即使我使用API阅读它,也会有一些身份验证和授权的东西 我找到了这一页,但有一点我不明白: 它说我们应该使用OAuth2.0协议,这是可以的。但它也表示,在授权过程中,“谷歌会向用户显示一个OAuth对话框,要求他们授权您的应用程序请求他们的一些数据。” 我的网页将显示从

我正在尝试创建一个PHP网页,需要从我的域中的google电子表格中读取一些数据(我使用的是google Apps Free Edition)

要阅读的电子表格是非公开的,但我所在领域的某些人可以看到。由于它是非公开的,我知道即使我使用API阅读它,也会有一些身份验证和授权的东西

我找到了这一页,但有一点我不明白:

它说我们应该使用OAuth2.0协议,这是可以的。但它也表示,在授权过程中,“谷歌会向用户显示一个OAuth对话框,要求他们授权您的应用程序请求他们的一些数据。”

我的网页将显示从电子表格中读取的一些数据。所以,每当有人访问我的网页时,它都会向电子表格所有者显示一个对话框,请求许可?这就是它的意思吗


欢迎提供任何建议。

是的,OAuth协议意味着当您试图从另一方(google)请求受保护的资源时,您的站点应该将用户重定向到另一方的站点,并显示google的登录/密码对话框,请求确认用户同意允许您的站点使用其他站点的用户资源(在您的情况下为谷歌)。 这就是OAuth的工作方式


谷歌需要你的用户凭据,因为谷歌不确定用户就是这个用户(例如,如果他没有任何cookies)

你实际上要做的是在你的服务器和谷歌之间进行服务器到服务器的身份验证

这样,当访问者进入您的页面时,您将从自己的电子表格中获取数据,而无需任何第三方参与

我不可能你会在里面找到你想要的东西

而且, 另一个解决方案(更容易实现,但可能有一些缺陷)是将oauth 2.0协议与您的Google开发帐户(从Google Console API检索)一起使用

  • 如果您还没有,请创建一个谷歌开发人员帐户(谷歌控制台API)
  • 使用“脱机”授权为您的应用程序生成访问/刷新令牌-这意味着您可以使用您的开发人员帐户向您的电子表格帐户发出API请求,即使您没有使用电子表格帐户登录
  • 保存生成的刷新令牌,并使用它反复生成访问令牌(访问令牌持续1小时)
  • 刷新令牌不应该过期,但如果过期,您可以再次生成它,并用新令牌替换原有令牌,然后继续生成访问令牌

    主要的阻碍是,如果刷新令牌失效,您必须手动替换它,因为这将要求您重新授予对dev帐户的访问权限,以访问您的电子表格帐户

    我希望这有点帮助

    Meny

    谷歌和OAuth教程: 我找了好几天才找到这个。它比任何其他OAuth风格的教程都要好得多 我用过。用于连接谷歌文档/谷歌硬盘

    此处是Python示例,另请参见java等的其他示例:

    注意,您需要向其添加刷新令牌。但这正是你所期望的

    还要连接到电子表格,请使用:

              SpreadsheetService service =
                      new SpreadsheetService("MySpreadsheetIntegration-v1");
    
              service.setHeader("Authorization", "Bearer " + accessToken);
    

    您可以使用新提供的oauth2流

    //flow use httpTransport, clientSecrets, json factory and datastore factory
    val flow = new GoogleAuthorizationCodeFlow
      .Builder(httpTransport,JSON_FACTORY,clientSecrets,SCOPES)
      .setDataStoreFactory(datastoreFactory)
      .build()
    
    // authorize
    val credential=new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user")
    
    并与您的gdata服务一起使用:

    val service:SpreadsheetService=new SpreadsheetService("SpreadsheetIntegration") 
     service.setOAuth2Credentials(credential)
    

    scala中的完整示例:

    我有点困惑。访问我网页的人只是访客,他们在我的谷歌应用程序域中没有谷歌帐户。我希望我的网页可以公开查看,尽管它需要的数据来自我的谷歌应用程序域中的一个私有谷歌电子表格文档。OAuth是否仅适用于读取其他人域中的数据?我正在从我自己控制的域读取数据,OAuth在我的情况下还有用吗?我不确定,也许你需要一些巨大的OAuth自定义。这样它将透明地(对用户)重定向所有请求,然后显示你的数据。但是,实际上,它应该是一个协议,帮助你在网站上显示来自谷歌(facebook,随便什么)账户和你的用户的数据。对于你的任务,也许你需要选择另一个solution@bobo“可公开查看,尽管它需要的数据来自私人网站”。您自相矛盾,请更准确地确定需求。