【问题标题】:Google Drive API accessing both "online" and "offline" at the same timeGoogle Drive API 同时访问“在线”和“离线”
【发布时间】:2014-12-10 05:30:54
【问题描述】:

这是我上一个问题的后续:How do I access Google Drive Application Data from a remote server?

我有一个应用程序需要同时访问客户端(在线,JavaScript)和服务器端(离线,Python)的 Google Drive AppFolder。我的应用程序是独一无二的,因为客户端和服务器可能无法通过原始身份验证进行通信。

因此,我使用以下内容为服务器(启动的客户端)获取身份验证令牌:

gapi.auth.authorize({
        'client_id': CLIENT_ID,
        'scope': SCOPES,
        'access_type': 'offline',
        'response_type': 'code',
        'state': 'my_state',
        }, null, 2),
        'redirect_uri': 'http://server/oauth2callback',
        'immediate': false
    },
    handleOfflineAuthResult);

服务器存储凭据,包括刷新令牌。

然后客户端(在后续用户会话中)直接向 Google Drive 发送请求以获取令牌:

gapi.auth.authorize({
                    'client_id': CLIENT_ID,
                    'scope': SCOPES,
                    'immediate': true
                }, handleAuthResult);

现在当客户端这样做时它会获得一个刷新令牌,但会使服务器的 refresh_token 无效。因此,我的服务器无法再刷新其令牌并获得“AccessTokenRefreshError: invalid_grant”。

假设客户端和服务器无法通过原始身份验证进行通信,是否有任何方法可以解决此问题(即客户端不能只向服务器询问其 auth_token,这是设计使然)?

我想到的唯一“解决方案”是让客户端将其 auth_token 和 refresh_token 存储在 AppFolder 中,服务器不断拉取 AppFolder 以获取新凭据,随后用客户端替换其副本。

【问题讨论】:

  • 两者的客户端 ID 是否相同?每个 Client_id / 用户组合最多可以有 30 个刷新令牌。

标签: google-oauth google-drive-api


【解决方案1】:

你说

当客户端这样做 [调用 gapi.auth.authorize] 时,它会获得一个刷新令牌,但会使 服务器的 refresh_token

至少第一部分是不正确的,我怀疑第二部分也是。 gapi.auth.authorize 返回一个访问令牌,而不是刷新令牌(参见https://developers.google.com/api-client-library/javascript/reference/referencedocs#OAuth20TokenObject)。

我非常怀疑为您的客户端请求访问令牌会使您的服务器的刷新令牌无效。如果您 100% 确定它是,您应该为每个 JS 和 Web 客户端应用程序使用单独的客户端 ID。请注意,JS 客户端永远不会使用刷新令牌,因为这将是一个主要的安全漏洞。 JS 客户端总是根据需要从您的服务器或 Google 请求访问令牌。

【讨论】:

  • 你的答案是正确的。我错过了谷歌仅在用户第一次使用应用程序进行身份验证时发送刷新令牌的部分。因此,尽管该过程似乎有效,但 Google 在交换期间并未发送 refresh_token,因此我的服务器从未真正拥有 refresh_token。我通过在离线访问请求中添加 'approval_prompt':'force' 来解决它,这确保了将发送 refresh_token。我也开始为 JS 和离线使用两个不同的 ID。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-29
  • 2021-04-12
  • 2017-09-19
相关资源
最近更新 更多