invalid_request with missing: 在 Google Oauth2 上使用 Google Passportjs 的范围

Posted

技术标签:

【中文标题】invalid_request with missing: 在 Google Oauth2 上使用 Google Passportjs 的范围【英文标题】:invalid_request with missing: scope using Google Passportjs on Google Oauth2 【发布时间】:2016-04-28 04:13:48 【问题描述】:

身份验证代码中出现了一个问题,该问题在今年年初之前一直运行良好,然后似乎在我几乎没有改变的情况下就崩溃了,我试图退回到以前的版本并找到原因但没有运气.所以我正在寻求帮助来修复目前存在的代码。

我正在使用 nodejs v0.10.25 Passportjs 通过 Google 和 Facebook 提供身份验证。我的包裹:

"config-multipaas": "^0.1.0",
"restify": "^2.8.3",
"googleapis": "~2.1.5",
"mocha": "~2.3.3",
"restify-redirect": "~1.0.0",
"sequelize": "~3.12.2",
"mysql": "~2.9.0",
"passport": "~0.3.2",
"passport-facebook": "~2.0.0",
"passport-local": "~1.0.0",
"passport-google-oauth": "~0.2.0",
"sendgrid-webhook": "0.0.4",
"sendgrid": "~2.0.0",
"restify-cookies": "~0.2.0"

两周前,在处理应用程序的另一部分时,我注意到用户注册功能不再适用于这两种服务。具体来说,Google Oauth2 代码在初始同意页面后返回以下错误。

    这是一个错误。

错误:invalid_request

缺少必需参数:范围

这是我的策略定义的相关部分:

passport.use(new FacebookStrategy(
    clientID:     siteConfigs.facebook.clientId,
        clientSecret: siteConfigs.facebook.clientSecret,
        callbackURL:  authRoot + 'facebook/callback',
    profileFields: ['id','name','emails', 'picture', 'location', 'birthday', 'gender']
  ,
  function(accessToken, refreshToken, profile, done)...

passport.use(new GooglePlusStrategy(
    clientID:     siteConfigs.google.clientId,
        clientSecret: siteConfigs.google.clientSecret,
        callbackURL:  authRoot + 'google/callback',
    profileFields: ['id','name','emails', 'gender', 'placesLived']
  ,
  function(accessToken, refreshToken, profile, done)...

令牌回调函数的机制不相关,因为进程永远不会走那么远(由节点调试器和控制台日志语句验证)。

这是我的休息端点:

app.get('/auth/facebook', passport.authenticate('facebook',  session: false, scope: ['email']));

app.get('/auth/google', passport.authenticate('google', 
        
        scope: ['profile', 'email'],
        accessType: 'online',
        session: false
        )
);

app.get('/auth/:service/callback', function(req, res, next)
    console.log('Request:', req.path(), req.getQuery());

    passport.authenticate(req.params.service,
    function(err, user, info)
        var returnPath = '/html/authcallback.html';

        if(err)
            return res.redirect(
                pathname: returnPath,
                query: 
                    error: err
                
            , next);
        else
            return res.redirect(
                pathname: returnPath,
                query: 
                    id: user.id,
                    created: info
                
            , next);
    )(req, res, next);
);

经过一些初步故障排除后,我采用了使用 Google 的 Oauth 2.0 Playground 和自定义身份验证和令牌端点(在我的 passportjs 版本中使用的端点)以及我自己的客户端 ID 和密码的方法,以将那里的每次交互与我的代码进行比较正在做。同意提示的初始请求正常工作并与 Playground 匹配,回调返回适当的代码,例如 code=4/EUnaIvWpLIiHnKUR9WctOJKQ-_iWZ3_H9YeUYx7bJSo。但是将代码交换为令牌的请求失败。使用节点调试器,评估 passport-google-oauth 为令牌发回的重定向请求,它构建的 URL 是:

https://accounts.google.com/o/oauth2/auth?response_type=code&redirect_uri=http://localhost:8080/auth/google/callback&client_id=<ID>

将此与来自 Google Oauth 2.0 Playground 的类似请求进行比较,如下所示:

http://www.googleapis.com?code=4/9uaUYjeExmPftgRLsRZ8MCc2e_7YGHow7kvew6Fkypo&redirect_uri=https://developers.google.com/oauthplayground&client_id=<ID>&client_secret=<SECRET>&scope=&grant_type=authorization_code

我的查询字符串中缺少几个参数,其中两个最重要的是我的代码和密码。我原以为谷歌的服务会为这些返回错误。相反,它会为缺少的范围参数返回一个错误,而这个过程中的这一步实际上并不需要这个参数(我不知道操场应用程序为什么包含它)。

最后,我相当肯定,当 Facebook 的策略开始失败时,这也是在我身边的某个地方。同意后,用多个代码返回我的回调,然后最终返回一个 TOO_MANY_REDIRECTS 错误,这很奇怪。

那么,有人有什么想法吗?再一次,同样的代码一直运行到年初,然后开始失败。

【问题讨论】:

这已经一个半星期了。只是想知道是否有人有任何想法。 我已经自己解决了这个问题。社区绝对没有答案。当我试图与 passportjs 开发者/维护者分享问题链接时,他的回应是尝试出售合同服务来修复。考虑关闭问题。 感谢分享(不)。 【参考方案1】:

几周前我问过this same question,我自己偶然发现了一个答案。我很高兴分享它:

似乎我在初始化服务器后缺少以下代码:

api.use(restify.plugins.queryParser( mapParams: false ));

添加该行后,我不再看到 Google 错误,并且该过程传递回我的代码。

【讨论】:

以上是关于invalid_request with missing: 在 Google Oauth2 上使用 Google Passportjs 的范围的主要内容,如果未能解决你的问题,请参考以下文章

rabbitmq heartbeat missing with heartbeat = N seconds原因总结

论文笔记:Learning Disentangled Representations of Video with Missing Data

论文笔记:Learning Disentangled Representations of Video with Missing Data

SVN合并时报错:Merge tracking not allowed with missing subtrees; try restoring these items

pandas使用fillna函数将dataframe中缺失值替换为空字符串(replace missing value with blank string in dataframe)

提示”The following modules are missing or built with a different engine version”