我的Google登录有问题。 我按照Google Sign-In for server-side apps上的步骤操作 完成所有这一步后,我有一个在服务器上运行的html文件:
<!DOCTYPE html>
<html itemscope itemtype="http://schema.org/Article">
<head>
<link rel="stylesheet" href="theme.css">
<!-- BEGIN Pre-requisites -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script src="https://apis.google.com/js/client:platform.js?onload=start" async defer></script>
<!-- END Pre-requisites -->
<script>
function start() {
gapi.load('auth2', function() {
auth2 = gapi.auth2.init({
client_id: 'CLIENT_ID'
});
});
}
</script>
</head>
<body>
<button id="googleBtn">Connect</button>
<script>
$('#googleBtn').click(function() {
auth2.grantOfflineAccess().then(googleCallback);
});
</script>
<script>
function googleCallback(authResult) {
if (authResult['code']) {
console.log(authResult);
} else {
console.log(authResult);
}
}
</script>
</body>
</html>
这第一部分工作完美(我认为),当我点击按钮,一个窗口弹出窗口,我选择一个帐户,然后我得到一个代码。所以现在,我想获取电子邮件和个人资料,因此我在nodejs中发出此请求以使用访问令牌交换代码。
var form = {
code: 'XXXXXXXXXXXX',
client_id: 'CLIENT_ID,
client_secret: 'CLIENT',
grant_type:'authorization_code'
};
var formData = querystring.stringify(form);
var contentLength = formData.length;
request({
headers: {
'Content-Length': contentLength,
'Content-Type': 'application/x-www-form-urlencoded'
},
uri: 'https://www.googleapis.com/oauth2/v4/token',
body: formData,
method: 'POST'
}, function (err, rep, body) {
console.log(err);
console.log(rep.statusCode);
console.log(body);
});
但作为回应,我有这个
{
"error": "redirect_uri_mismatch",
"error_description": "Bad Request"
}
我不明白为什么,因为我不会在html文件中的主要请求中使用任何redirect_uri。我尝试了一些例如在Console API和请求中添加redirect_uri的情况,但我有相同的结果......
你能帮助我吗?
答案 0 :(得分:1)
您需要通过console.developer.google.com
为Google定义回调网址因此,您需要按照以下步骤定义回调网址:
完成了。
答案 1 :(得分:0)
在客户端auth2.grantOfflineAccess
进程中,要在服务器上获取accessToken,必须在请求参数中传递redirect_uri=postmessage
。
根据您的示例:
var form = {
code: 'XXXXXXXXXXXX',
client_id: 'CLIENT_ID,
client_secret: 'CLIENT',
grant_type:'authorization_code',
redirect_uri: 'postmessage' // the line to add
};