我正在尝试创建仅使用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吗?
如果有人可以告诉我这里我缺少什么,我真的很感激! :)
答案 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
尽管它处于测试版并且基本工作流程相同,但它可能会为您提供更清晰的示例。