这是对我上一个问题的跟进: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获取新凭据,随后将其副本替换为客户端。
答案 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请求访问令牌。