【发布时间】:2014-03-04 02:04:39
【问题描述】:
我正在使用 Web 脚本服务来生成文件并将它们发布到 URI。如果我没有或没有提供,它们将存储在 ftp 服务器上。我想要做的是将这些文件上传到我的 Google Drive,最终也会上传到其他用户的 Drive。 因为我使用的是“私有”主机和“纯”javascript——没有浏览器——我无法添加任何框架或库。我必须手动完成所有操作。
我浏览了所有文档,在这里阅读了很多帖子,发现了一些非常好的信息,并且掉了一些头发。
这是该项目目前所在的位置: 我正在使用 oauth2,Web 服务器流。 我可以请求访问,并获得一个授权码,如下所示:
https://accounts.google.com/o/oauth2/auth?
response_type=code
&scope=https://www.googleapis.com/auth/drive
&redirect_uri=http://myserver.com/
&access_type=offline
&state=testing
&client_id={CLIENT_ID].apps.googleusercontent.com
这给了我一个授权码。到目前为止,一切顺利。
然后,我使用该代码并执行以下操作:
POST /o/oauth/token HTTP/1.1
Host: https://accounts.google.com
client_id=yada_yada
&client_secret=more_yada
&redirect_uri=http://myserver.com/
&code=[the code I just got]
&grant_type=authorization_code
现在,如果我使用 XMLHttpRequest,这一步会失败;我收到了“Access-Control-Allow-Origin”违规。因此,我将 HTML 页面与表单拼凑在一起并发布了那个。我返回了一个包含 access_token 和 refresh_token 的 JSON 对象。是的.
{
'access_token' : [Access Yada-Yada],
'expires_in' : 3600,
'token_type' : 'Bearer',
'refresh_token' : '[Refresh Yada-Yada]
}
现在,我可以让我的脚本运行一小时。伊皮。
现在,毕竟,我如何使用 refresh_token 来获取新的 access_token。我已经尝试了一切。 XMLHttpRequests 给了我同样的跨域冲突,并且做一个 HTML 表单让我得到一个“invalid_request”响应!我尝试使用 curl,以前从未接触过它,但效果不顺利。
请帮忙。
编辑
刷新请求的格式如下:
var xhr = XMLHttpRequest();
xhr.open('POST',"https://accounts.google.com/o/oauth/token?" +
"client_id=[CLIENT_ID]"+
"&client_secret=[CLIENT_SECRET]"+
"&refresh_token=[REFRESH_TOKEN]"+
"&grant_type=refresh_token",
true);
xhr.setRequestHeader('Content-Type','x-www-form-urlencoded');
xhr.send();
我直接从 OAuth Playground 复制了 url 参数,我已经给了我的项目密钥。当我这样做时,我得到了 Access-Control-Allow-Origin 冲突。
如果我把它包装成一个表格,像这样:
<form method="GET" action="https://accounts.google.com/o/oauth2/token">
<div>REFRESH TOKEN:</div>
<input type="text" name="refresh_token" value="[REFRESH_TOKEN]">
<br><div>CLIENT ID:</div>
<input type="text" name="client_id" value="[CLIENT_ID]">
<br><div>CLIENT SECRET:</div>
<input type="text" name="client_secret" value="[CLIENT_SECRET">
<br><div>GRANT TYPE:</div>
<input type="text" name="grant_type" value="refresh_token">
</form>
我可以获得新的访问令牌。但是,我无法使用 XMLHttpRequest 在 JS 中进行同样的工作。我不断收到 XD 错误。
我只需要一种在不使用任何库的情况下从 javascript 向 google 发布刷新请求的方法。
【问题讨论】:
-
查看此链接 (developers.google.com/oauthplayground)。您可以跟踪整个过程并检查每个请求的语法。
-
你的 XMLHttpRequest 是什么样的?您是否检查过 SDK 示例,例如对于 Python DrEdit > client.py > OAuth2Credentials._generate_refresh_request_body etc.
-
OAuth Playground 工作得很好,即使我给它我自己的项目凭据。我自己无法获得带有刷新令牌的新令牌。 python 示例通常使用与我相同的设置,但是当我在我的代码中复制它时,我会得到跨域违规或无效的请求响应。
-
如果您只想上传到自己的驱动器。您可以在 oauth Playground 中生成一个刷新令牌,然后简单地将其存储在您的服务器中的某个位置。当然,请确保您首先设置了自己的客户端 ID 等。当涉及到让多个用户授予访问权限时,您需要按照文档中的说明实现身份验证流程和重定向。
-
是的,@pinoyyid,我可以使用自己的主机为每个用户进行身份验证,并将刷新令牌发送到我正在使用的服务上的脚本。但是如何从我的脚本中调用 /o/oauth/token?refresh_token=... 而不会出现跨域冲突?
标签: javascript oauth-2.0 google-drive-api google-oauth