Node.js"passport-google-oauth2"在Express应用程序中提供"无法获取用户配置文件"错误

ale*_*cor 19 node.js express google-oauth2

同时开发的最后一个例子的入门(一使用谷歌OpenID身份验证策略的应用),更换后passport-google(其中有过时的2015年4月20日)passport-google-oauth2包(由谷歌OAuth认证策略2.0)并按照其文档页面上的说明示例进行了说明 ; 选择我的Google+帐户后,我收到了以下错误,该帐户由oath2.js模块引发,具体this._oauth2.get("https://www.googleapis.com/plus/v1/people/me",...)userProfile(accessToken, done)方法内调用.相关的源代码和模块依赖关系如下.

什么可能是问题的根源?

具体错误是:

InternalOAuthError: failed to fetch user profile
    at <...>\web-app\b4\node_modules\passport-google-oauth2\lib\oauth2.js:92:28
    at passBackControl (<...>\web-app\b4\node_modules\passport-google-oauth2\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:124:9)
    at IncomingMessage.<anonymous> (<...>\web-app\b4\node_modules\passport-google-oauth2\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:143:7)
    at IncomingMessage.emit (events.js:129:20)
    at _stream_readable.js:908:16
    at process._tickCallback (node.js:355:11)
Run Code Online (Sandbox Code Playgroud)

相关应用程序的代码是:

  passport = require('passport'),
  //...
  GoogleStrategy = require('passport-google-oauth2').Strategy; // #passport-google-oauth2
  //...
  /***** #passport-google-oauth2 vv *****/
  passport.use(new GoogleStrategy({
    clientID: "a_specific_value",
    clientSecret: "another_specific_value",
    callbackURL: "http://127.0.0.1:3000/auth/google/callback",
    passReqToCallback:true
  },
  function(request, accessToken, refreshToken, profile, done) {
      profile.identifier=profile.id;
      return done(null, profile);
  }
  ));
  /***** #passport-google-oauth2 ^^ *****/
  //...
  /*****  #passport-google-oauth2 vv    *****/
  app.get('/auth/google',
  passport.authenticate('google', { successRedirect: '/',scope:
    [ 'https://www.googleapis.com/auth/userinfo.email']})
  );
  app.get( '/auth/google/callback',
    passport.authenticate( 'google', {
        successRedirect: '/',
        failureRedirect: '/'
  }));
  /*****  #passport-google-oauth2 ^^    *****/    
Run Code Online (Sandbox Code Playgroud)

该应用程序具有以下依赖项:

b4@0.0.1
??? connect-redis@1.4.7
? ??? debug@2.1.3
? ? ??? ms@0.7.0
? ??? redis@0.10.3
??? cookie-parser@1.3.4
? ??? cookie@0.1.2
? ??? cookie-signature@1.0.6
??? express@3.3.8
? ??? buffer-crc32@0.2.1
? ??? commander@1.2.0
? ? ??? keypress@0.1.0
? ??? connect@2.8.8
? ? ??? bytes@0.2.0
? ? ??? formidable@1.0.14
? ? ??? pause@0.0.1
? ? ??? qs@0.6.5
? ? ??? uid2@0.0.2
? ??? cookie@0.1.0
? ??? cookie-signature@1.0.1
? ??? debug@2.1.3
? ? ??? ms@0.7.0
? ??? fresh@0.2.0
? ??? methods@0.0.1
? ??? mkdirp@0.3.5
? ??? range-parser@0.0.4
? ??? send@0.1.4
?   ??? mime@1.2.11
??? express-session@1.11.1
? ??? cookie@0.1.2
? ??? cookie-signature@1.0.6
? ??? crc@3.2.1
? ??? debug@2.1.3
? ? ??? ms@0.7.0
? ??? depd@1.0.1
? ??? on-headers@1.0.0
? ??? parseurl@1.3.0
? ??? uid-safe@1.1.0
? ? ??? base64-url@1.2.1
? ? ??? native-or-bluebird@1.1.2
? ??? utils-merge@1.0.0
??? morgan@1.5.2
? ??? basic-auth@1.0.0
? ??? debug@2.1.3
? ? ??? ms@0.7.0
? ??? depd@1.0.1
? ??? on-finished@2.2.0
?   ??? ee-first@1.1.0
??? npmlog@0.0.4
? ??? ansi@0.1.2
??? passport@0.2.1
? ??? passport-strategy@1.0.0
? ??? pause@0.0.1
??? passport-google-oauth2@0.1.6
? ??? passport-oauth2@1.1.2
?   ??? oauth@0.9.12
?   ??? passport-strategy@1.0.0
?   ??? uid2@0.0.3
??? q@0.9.7
??? redis@0.8.6
??? request@2.27.0
  ??? aws-sign@0.3.0
  ??? cookie-jar@0.3.0
  ??? forever-agent@0.5.2
  ??? form-data@0.1.4
  ? ??? async@0.9.0
  ? ??? combined-stream@0.0.7
  ?   ??? delayed-stream@0.0.5
  ??? hawk@1.0.0
  ? ??? boom@0.4.2
  ? ??? cryptiles@0.2.2
  ? ??? hoek@0.9.1
  ? ??? sntp@0.2.4
  ??? http-signature@0.10.1
  ? ??? asn1@0.1.11
  ? ??? assert-plus@0.1.5
  ? ??? ctype@0.5.3
  ??? json-stringify-safe@5.0.0
  ??? mime@1.2.11
  ??? node-uuid@1.4.3
  ??? oauth-sign@0.3.0
  ??? qs@0.6.6
  ??? tunnel-agent@0.3.0

ale*_*cor 56

我很幸运在jaredhanson/passport-google-oauth找到了一个类似的问题 ,这让我想到Google的项目控制台,只是启用了Google+ API "关闭"(哦,我!),他的第一个天真的开发者基于Google+的申请).这是问题的根源.我再次尝试并oauth2开始正确接收配置文件.

  • 我还将已弃用的范围`https:// www.googleapis.com/auth/userinfo.profile`和`https:// www.googleapis.com/auth/userinfo.email`更改为`profile`和`email`分别. (2认同)

Rém*_*ras 7

scope您使用现已弃用:

passport.authenticate('google', { successRedirect: '/',scope:
  [ 'https://www.googleapis.com/auth/userinfo.email']})
);
Run Code Online (Sandbox Code Playgroud)

相反,我们必须使用这个:

passport.authenticate('google', { successRedirect: '/',scope:
  ['email']
}));
Run Code Online (Sandbox Code Playgroud)

你也可以得到profile scope:

passport.authenticate('google', { successRedirect: '/',scope:
  [ 'email', 'profile' ]
}));
Run Code Online (Sandbox Code Playgroud)