Google Drive API同时访问“在线”和“离线”

时间:2014-12-10 05:30:55

标签: google-oauth google-drive-api

这是对我上一个问题的跟进: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云端硬盘以获取令牌:

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

现在当客户端执行时,它会获得刷新令牌,但会使服务器的refresh_token无效。因此,我的服务器无法再刷新其令牌并获取“AccessTokenRefreshError:invalid_grant'。

有没有办法解决这个问题,假设客户端和服务器无法通过原始身份验证进行通信(即客户端不能只询问服务器的auth_token,那是设计的)?< / p>

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

1 个答案:

答案 0 :(得分:0)

你说

  

当客户端执行[调用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请求访问令牌。