web-dev-qa-db-ja.com

Node.jsの「passport-google-oauth2」がExpressアプリケーションで「ユーザープロファイルを取得できませんでした」というエラーを表示する

node.js の紹介 book (Google OpenIDによる認証戦略を使用した express.js アプリケーション)の最後の例を開発している間、 _passport-google_パッケージ(2015年4月20日に廃止)を_passport-google-oauth2_パッケージ(Googleによる認証戦略OAuth 2.0)および そのドキュメントのページ および ここの例 の指示に従いました。 _oath2.js_モジュールによってスローされたGoogle+アカウントを選択し、具体的には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)
_

関連するアプリケーションのコードは次のとおりです。

_  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 ^^    *****/    
_

アプリケーションには次の依存関係があります。

 [email protected] 
├─┬[email protected] 
│├─┬[email protected] 
│││──ms @ 0.7.0 
│└──[email protected] 
├─┬[email protected] 
│├──[email protected] 
│└──[email protected] 
├─┬[email protected] 
│├──[email protected] 
│├─ ┬[email protected] 
│││──[email protected] 
│├─┬[email protected] 
││├──[email protected] 
│││──[email protected] 
││├──[email protected]
││├──[email protected] 
 ││└──[email protected] 
│├──[email protected] 
│├──[email protected] 
│├─┬デバッグ@ 2.1.3 
│││──[email protected] 
│├──[email protected] 
│├──[email protected] 
│├──[email protected] 
│├──[email protected] 
│└─┬[email protected] 
│└── [email protected] 
├─┬[email protected] 
│├──[email protected] 
│├──[email protected] 
│├──[email protected] 
│├─┬[email protected] 
│││───[email protected] 
│├ ──[email protected] 
│├──[email protected] 
│├ ──[email protected] 
│├─┬[email protected] 
│││──[email protected] 
││└── [email protected] 
│└──[email protected] 
├─┬[email protected] 
│├──basic-auth @ 1.0.0 
│├─┬[email protected] 
││└──[email protected] 
│├──[email protected] 
│└─┬[email protected] 
│└──[email protected] 
├─┬[email protected] 
│└─ ─[email protected] 
├─┬[email protected] 
│├──[email protected] 
│└──[email protected] 
├─┬[email protected] 
│└─┬[email protected] 
│├──[email protected] 
│├──[email protected] 
│└──[email protected] 
├──[email protected] 
├──[email protected] .6 
└─┬[email protected] 
├──[email protected] 
├──[email protected] 
 ├──[email protected] 
├─┬[email protected] 
│├──[email protected] 
│└─┬組み合わせた- [email protected] 
│└──[email protected] 
├─┬[email protected] 
│├──[email protected] 
│├──暗号[email protected] 
│├──[email protected] 
│└──[email protected] 
├─┬[email protected] 
│├──[email protected] 
│├──[email protected] 
│└──[email protected] 
├── [email protected] 
├──[email protected] 
├──[email protected] 
├──[email protected] .0 
├──[email protected] 
└──[email protected] 
 
19
alesscor

幸運にも、 jaredhanson/passport-google-oauth で同様の問題を見つけたため、に移動して GoogleのプロジェクトコンソールGoogle+ API、「オフ」になりました(Google+に基づく彼の最初のアプリケーションの素朴な開発者)。それが問題の原因でした。私はもう一度試してみましたが、oauth2がプロファイルの受信を正しく開始しました。

56
alesscor

使用しているscopeは現在非推奨です:

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

代わりに、これを使用する必要があります。

passport.authenticate('google', { successRedirect: '/',scope:
  ['email']
}));

profile scopeも取得できます。

passport.authenticate('google', { successRedirect: '/',scope:
  [ 'email', 'profile' ]
}));
7
Rémi Becheras

私はGoogle OAuth 2.0 Playgroundを使用していますが、私の場合、このエラーの理由は、トークンの有効期限が切れたためです。Playgroundでトークンを更新すると問題が解決しました。

0
1valdis

私は同じエラーを見つけ、これを実行して解決しました:

Package.jsonで、「passport」の値を「^ 0.4.0」に、「passport-google-oauth」を「^ 2.0.0」に変更します。 「npm install」を再度実行します。