Gmail API - 使用javascript中的oAuth2.0发送电子邮件

时间:2015-11-26 03:23:02

标签: javascript oauth oauth-2.0 google-api gmail-api

我正在尝试创建仅使用javascript和Gmail API发送电子邮件的web page。我已经设置了开发人员的控制台来使用API​​,还创建了一个API密钥和一个凭据。

我已经调整了这个example code,到目前为止我认为我已经到了加载GMail API的程度了。 (或者...... 400意味着什么是错的?)控制台日志显示:

POST https://content.googleapis.com/gmail/v1/users/me/messages/send?alt=json 400 (OK)

zu @ cb=gapi.loaded_0:85
n @ cb=gapi.loaded_0:85
Cu @ cb=gapi.loaded_0:85
(anonymous function) @ cb=gapi.loaded_0:86
g @ cb=gapi.loaded_0:55
c @ cb=gapi.loaded_0:46

当我尝试通过网址验证oAuth2.0:

var code;

$.get("https://accounts.google.com/o/oauth2/auth?scope=email&
  redirect_uri=http://hiro.collegewebserver.com/COSW200/hw13/gmailtest.html&
  response_type=token&client_id=386373199858-o1rt7qj3gt99gbfg6pqpr0g6i92urq9t.apps.googleusercontent.com&
  approval_prompt=force",

  function (returnedValue) { code = returnedValue; });

我收到此消息:

XMLHttpRequest cannot load https://accounts.google.com/o/oauth2/auth?scope=email&
redirect_uri=http://h…3gt99gbfg6pqpr0g6i92urq9t.apps.googleusercontent.com&
approval_prompt=force.

No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'http://hiro.collegewebserver.com' is therefore not allowed access.

我读过其他帖子,说这可能是由于交叉来源请求被阻止了?有人写道,有办法解决这个问题,比如使用JSONP吗?

如果有人可以告诉我这里我缺少什么,我真的很感激! :)

1 个答案:

答案 0 :(得分:0)

您无法向Google发出ajax调用以获取您的访问代码。 OAuth2的想法是您首先将用户重定向到accounts.google.com/o/oauth2/your_settings。在你的情况下:

https://accounts.google.com/o/oauth2/auth?scope=email&redirect_uri=http://hiro.collegewebserver.com/COSW200/hw13/gmailtest.html&response_type=token&client_id=386373199858-o1rt7qj3gt99gbfg6pqpr0g6i92urq9t.apps.googleusercontent.com&approval_prompt=force

在此Google环境中,用户可以使用他/她的帐户登录。您提供的其中一个设置是redirect_uri。

由于您已将http://hiro.collegewebserver.com/COSW200/hw13/列入您的Google Developers Console中的授权重定向URI,并且此网址与您的client_id相关,因此除您的网站之外的任何其他应用都不能使用您的client_id接收授权代码。

登录后,用户将被重定向到此redirect_uri,代码作为参数之一。

这看起来像这样:

http://hiro.collegewebserver.com/COSW200/hw13/#access_token=yb27…jK0AVtilhnrJDcuTISgIB5LiNtKLMut1kVvPW69w&token_type=Bearer&expires_in=3600

之后,您必须从网址中提取访问令牌。使用此访问令牌,您可以授权用户并使用您输入的范围。这可以通过ajax调用完成。

$http({
    method: 'GET',
    url: 'https://www.googleapis.com/upload/gmail/v1/users/userId/messages?access_token=' + access_token
}).then(function(response){
//your code
})

您还可以将access_token放在通话的标头中:

Authorization: Bearer access_token

另一种选择是使用API​​客户端库(Beta):https://developers.google.com/api-client-library/javascript

尽管它处于测试版并且基本工作流程相同,但它可能会为您提供更清晰的示例。