3

Express/node.js アプリでパスポートを使用しようとしています。何らかの理由で、Google を使用して認証できません。Google は次のエラーを返します。

エラー: invalid_request
OpenID 認証要求の解析中にエラーが発生しました。

Code:

    passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(user, done) {
  done(null, user);
});

var GoogleStrategy = require('passport-google').Strategy;
var UserModel = require('./models/usermodel');

passport.use(new GoogleStrategy({
    returnURL: 'http://localhost:3000/auth/google/return',
    realm: 'http:/localhost:3000'
  },
  function(identifier, profile, done) {
    profile.email = profile.emails[0].value;
    UserModel.findOneAndUpdate({email:profile.email}, {$set:profile, $inc:{logins:1}}, {upsert:true}, done);
  }
));
4

4 に答える 4

7

他に OpenID を使用する理由がない場合は、passport-google-oauth に実装されている OAuth 2.0 に切り替えることを強くお勧めします。

Google は推奨する認証ソリューションとしてそれを推奨しているようで、OpenID の実装はあまり注目されていないようで、偽のエラーが発生します。

于 2013-03-05T01:46:04.390 に答える
0

これがどれだけ遅いかはわかっていますが、あなたのレルムが正しくないことに注意する価値があると思いました。それがおそらくこのエラーが発生した理由です。http:/localプロトコルの後に .ではなく1 つのスラッシュしかありませんhttps://local

于 2013-08-18T03:58:22.550 に答える
0

まず最初に。gem が最新であることを確認してください。これを package.json に追加してから、npm install または npm update を実行します。古いグーグルの宝石が私のものを壊したので、私はこれがそれであると99%確信しています.

{
  "name": "Boilerplate",
  "version": "0.0.2",
  "private": true,
  "scripts": {
    "start": "node app"
  },
  "dependencies": {
    "express": "3.1.0",
    "ejs": "*",
    "stylus": "*",
    "mongoose": "*",
    "connect-mongo": "*",
    "passport": "*",
    "passport-google": "*",
    "passport-twitter": "*",
    "passport-facebook": "*",
    "passport-local": "*"
  }
}

次に実行します。

npm install

これが私のserver.jsのパスポート情報です

passport.serializeUser(function(user, done) {
  done(null, user.id)
})

passport.deserializeUser(function(id, done) {
  UserModel.findOne({ _id: id }, function (err, user) {
    done(err, user)
  })
})

var GoogleStrategy = require('passport-google').Strategy;
var UserModel = require('./models/usermodel'); // A schema that is not optional 

passport.use(new GoogleStrategy({
    returnURL: 'http://localhost:3000/auth/google/return',
    realm: 'http://localhost:3000'
  },
  function(identifier, profile, done) {
    console.log(profile);
      UserModel.findOneAndUpdate({email:profile.email}, {$set:profile, $inc:{logins:1}}, {upsert:true}, done);
  }
));
于 2013-09-03T03:50:09.400 に答える
0

ポート番号が含まれていると、returnURL がうまく動作しないようです。これは、標準ポート (80) に切り替える必要がある場合があることを意味します。これは、非ルート ユーザーがそのポートにアクセスできるように OS を微調整しない限り、一部の Linux フレーバーでは機能しません。ただし、上記で提案したように、飛び込む前に OAuth 2.0 を検討します。

于 2013-11-11T20:10:44.197 に答える