我们正在使用Google App Engine托管服务器端代码和网络应用程序。 该服务器用于处理Google Auth和对日历的访问。 它通过从客户端生成授权令牌并将其发送到服务器以交换令牌来使用服务器端身份验证流程。
当从本地主机运行客户端时,这很好用,但是当我们使用实时客户端运行相同的流时,会收到unauthorized_client错误。
我们已经在证书部分下使用自定义域和最初生成的Google App Engine路径声明了服务器端和客户端域。
服务器端代码使用express。 显然,我们已经清空了客户密钥。
var express = require('express');
var router = express.Router();
const {google} = require('googleapis');
router.post('/', function(req, res, next) {
const oauth2Client = new google.auth.OAuth2(
"CLIENT_ID",
"CLIENT_SECRET",
"postmessage"
);
var code = req.body.code
var userId = req.body.userId
oauth2Client.getToken(code).then(resp => {
if (resp.tokens) {
let tokens = resp.tokens
res.json({status: "success"})
} else {
res.json({status: "failed"})
}
}).catch(error => {
console.log(error)
res.json({status: "failed", error: error.message})
})
})
module.exports = router;
客户端代码:Angular 5+ ng-gapi加载Google api。
public getGoogleAuth(): Promise<any> {
return new Promise(resolve => {
this.googleAuth.getAuth().subscribe(auth => {
resolve(auth)
})
});
}
async googleSignIn() {
try {
let auth = await this.getGoogleAuth()
let { code } = await auth.grantOfflineAccess({
'redirect_uri' : 'postmessage',
scope: "https://www.googleapis.com/auth/calendar.readonly https://www.googleapis.com/auth/calendar"
})
} catch(error) {
console.log(error)
return Promise.reject(error);
}
}