【问题标题】:Simple, library-free, Javascript method for inserting a file into Google Drive用于将文件插入 Google Drive 的简单、无库、Javascript 方法
【发布时间】: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


【解决方案1】:

对于只有客户端逻辑的应用程序来说,网络服务器流程是不够的。我建议您使用 G+ 登录小部件(可以针对任何范围进行自定义,包括云端硬盘,并且实际上适用于所有 Google 用户,无论他们是否碰巧拥有 Google+ 帐户,包括所有 Google Apps 用户)。 https://developers.google.com/+/

如果您宁愿自己做这一切,您可以阅读客户端流程的工作原理:本质上您要求“response_type=token”并从片段中解析 access_token。 access_token 交换步骤没有 refresh_token。您只需重复初始授权请求,即可使用不可见的 iframe 在后台定期刷新令牌。确保将 display=none 添加到您在不可见 iframe 中发出的请求。请参阅https://developers.google.com/accounts/docs/OAuth2UserAgent 了解更多信息。

【讨论】:

  • 没有 html,没有浏览器,没有 ui(至少不是基于网络的)。只是服务器端的 JS。我可以做 XMLHttpRequests,就是这样。我可以从授权中获取回调,并存储令牌以使用一个小时,但这需要不断地重新授权应用程序。我就是无法让 refresh_token 刷新!
  • 我相信您可以使用 XMLHttpRequest 在使用 display=none&response_type=token 的一小时后请求另一个令牌。这不需要重新授权。
  • 我可以使用 xhr 从 Drive API 获取数据,但是当我去获取新令牌时,我遇到了域冲突。
  • 我什至不能使用 XMLHttpRequest。由于“安全风险”,主机从 JS 中“删除了它”。案件结案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-13
相关资源
最近更新 更多