无法对用户进行授权使用谷歌的行动隐/授权流
我想链接到的帐户:无法对用户进行授权使用谷歌的行动隐/授权流
这里是我的谷歌的云功能
var AuthHandler = function() {
this.googleSignIn = googleSignIn;
this.googleSignInCallback = googleSignInCallback;
}
function googleSignIn(req, res, next) {
passport = req._passport.instance;
passport.authenticate('google',{scope: 'https://www.googleapis.com/auth/userinfo.email',
state:"google",response_type:"token"},
function(err, user, info) {
console.log(user);
})(req,res,next);
};
function googleSignInCallback(req, res, next) {
passport = req._passport.instance;
passport.authenticate('google',function(err, user, info) {
if(err) {
return next(err);
}
if(!user) {
return res.redirect('http://localhost:8000');
}
console.log(user._json.token);
// /res.redirect('/');
res.redirect('https://oauth-redirect.googleusercontent.com/r/xxxxxx#access_token=' + user._json.token + '&token_type=bearer&state=google')
})(req,res,next);
};
module.exports = AuthHandler;
在谷歌操作控制台:
我创建了隐式流程并授予了我的授权url,如下所示:
https://[region]-[projectid].cloudfunctions.net/[functionname]/auth/google
错误:
这是浏览器的URL
https://assistant.google.com/services/auth/handoffs/auth/complete?state=xxxx&code=xxxxxx
在其上显示
以下错误参数 “状态” 必须在查询字符串设置。
更新1
开始执行此之前,我按照this解决方案创建的认证。
问题这种方法:
1.As在它不重定向到google.com的文档说明,我无法使用JavaScript中的APIAI
SDK访问token
。但我仍然可以在模拟器中看到Access token
。为了更好的理解添加图像
这里是我的模拟器O/P
{
"response": {
"debug": {
"agentToAssistantDebug": {
"assistantToAgentDebug": {
"assistantToAgentJson": "{"accessToken\":\"xxxxxx\""
}
},
"errors": []
}
更新2:
所以我已经开始与隐流动形成,这里是我的完整repo
与之对抗后,我已经实现了它,因为没有关于创建实现Google Action的自己的Oauth服务器的适当文章,这对未来用户可能会有所帮助。
授权端点
app.get('/authorise', function(req, res) {
req.headers.Authorization = 'Bearer xxxxxxxxxxx';
// with your own mechanism after successful
//login you need to create a access token for the generation of
//authorization code and append it to this header;
var request = new Request(req);
var response = new Response(res);
oauth.authorize(request, response).then(function(success) {
// https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID?
//code=AUTHORIZATION_CODE&state=STATE_STRING
var toredirect = success.redirectUri +"?code="+success.code
+"&state="+request.query.state ;
return res.redirect(toredirect);
}).catch(function(err){
res.status(err.code || 500).json(err)
}) });
令牌端点:
app.all('/oauth/token', function(req,res,next){
var request = new Request(req);
var response = new Response(res);
oauth
.token(request,response)
.then(function(token) {
// Todo: remove unnecessary values in response
return res.json(token)
}).catch(function(err){
return res.status(500).json(err)
})
});
创建这个端点后发布到谷歌云功能。我使用MYSQL
作为数据库使用SEQUELIZE
和Oauth-Server
,如果任何人需要这些模型,将通过回购分享。
有了这个,你可以使用自己的自己的服务器,它实现 验证令牌和访问令牌
您提到了AUTHORIZATION_CODE - 但这是从哪里来的? –
@JasonSilver这是自动生成的资源服务 – Webruster
我认为问题在于在这条线没有发出参数查询参数的URL,他们把他们作为锚的一部分:?
res.redirect('https://oauth-redirect.googleusercontent.com/r/xxxxxx#access_token=' + user._json.token + '&token_type=bearer&state=google')
您应该以替换#,如下图所示:
res.redirect('https://oauth-redirect.googleusercontent.com/r/xxxxxx?access_token=' + user._json.token + '&token_type=bearer&state=google')
我不清楚这些功能是什么,或者是要求他们链接的帐户。他们应该是OAuth2服务器吗?他们应该被称为动作webhook吗? – Prisoner
@Prisoner,是的,我试图创建Oauth服务器,我跟着你以前的答案[this](https://stackoverflow.com/questions/44288981/how-to-authenticate-user-with-just-谷歌帐户上的行动),让我更新这些细节有问题,以便您可以轻松地通过他们 – Webruster