Стратегия Passport Github не работает и выдает ошибки

#node.js #passport.js #passport-github2

#node.js #passport.js #passport-github2

Вопрос:

Приведенный ниже код злится на меня. Я не вижу в этом ничего плохого.

 function User(profile){
   console.log(profile)
}

passport.use(
    new GitHubStrategy({
            clientID: "my_id",
            clientSecret: "secret",
            callbackURL: "http://localhost:3000/auth/github/callback",
        },
        function(accessToken, refreshToken, profile, done) {
             User(profile),function (err, user) {
                 return done(err, user);
             };
        }
    )
);
app.get(
    "/auth/github",
    passport.authenticate("github", { scope: ["user:email"] })
);

app.get(
    "/auth/github/callback",
    passport.authenticate("github", { failureRedirect: "/login" }),
    function(req, res) {
        // Successful authentication, redirect home.
        res.redirect("/");
    }
);
 

Он выдает большую ошибку каждый раз, когда я пытаюсь пройти аутентификацию. Пожалуйста, помогите.

Отредактировал вопрос и сделал так, как сказал @jasonandmonte, и теперь я понимаю это:Теперь я получаю после выполнения инструкций из ответа.

Комментарии:

1. Я не работал ни с одной из этих библиотек, но обычно с OAuth вам нужно обменять код аутентификации, который перенастроился при обратном вызове, на токен доступа и токен обновления. Вы делали это где-нибудь?

2. ну, я знаю, что эта часть выдает ошибку function(accessToken, refreshToken, profile, done) { User(profile),function (err, user) { return done(err, user); };

3. просто не знаю, почему

4. В документации я заметил одну вещь, которую он использует User.findOrCreate() вместо User()

5. когда я использовал User.findOrCreate , он говорил, что User не определен, я не знаю, почему он так говорит

Ответ №1:

Проблема, которую я вижу, заключается в том, что вы определяете User функцию, которая регистрирует только профиль. User Функция в документации является примером модели базы данных, которая запрашивает базу данных и передает данные в обратный вызов.

Чтобы решить проблему и воспроизвести ее в примере how passport-github , вам нужно будет использовать инструмент моделирования объектов, такой как Mongoose или Sequelize. Затем у вас будет доступ к чему-то похожему User.findOrCreate() или просто User.find() , если вы хотите ограничить создание учетной записи ролью администратора.

Однако, чтобы заставить passport работать до тех пор, пока вы не настроите подключение к базе данных, вы должны иметь возможность обновить обратный вызов стратегии для вызова done .

 passport.use(
    new GitHubStrategy({
            clientID: "my_id",
            clientSecret: "secret",
            callbackURL: "http://localhost:3000/auth/github/callback",
        },
        function(accessToken, refreshToken, profile, done) {
             done(null, profile.id);
        }
    )
);
 

Комментарии:

1. спасибо @jasonandmonte. сделал, как вы сказали, и теперь я получаю новую ошибку.

2. Как выглядит ваш файл express app? Вам необходимо использовать passport.initialize() промежуточное программное обеспечение в вашем приложении express. Если это звучит непривычно, я бы рекомендовал просмотреть учебное пособие passport oauth 2.0 или пример кода , чтобы посмотреть на более полную настройку для passport.