Как стратегия паспорта работает за кулисами - PullRequest
0 голосов
/ 08 декабря 2018

Я пытался понять, как работает паспортная стратегия.

Рассмотрим эти API-маршруты, которые я использую для аутентификации.

  router.get("/google",  passport.authenticate('google', { scope: ['profile', 'email'] }));
  router.get("/google/callback", passport.authenticate('google'), (req, res) => {
      res.redirect("http://localhost:3000/")
  })

И это стратегия паспорта

const passport = require('passport')
const GoogleStratergy = require('passport-google-oauth20')
const keys = require("./key.js")
const User = require("../models/user-model.js")

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

passport.deserializeUser((id, done) => {
    User.findById(id).then((user) => {
        done(null, user) //pass it in req of our routes
    })
})

passport.use(
    new GoogleStratergy({
    //Options for the stratergy 
        callbackURL: "/auth/google/callback", 
        clientID: keys.google.clientID,
        clientSecret: keys.google.clientSecret
    }, (accessToken, refreshToken, profile, done) => {


        User.findOne({userId: profile.id }).then((currentUser) => {
            if (currentUser) {
                done(null, currentUser)
            } else {
                    //Changing Image String
                    let  oldURL=  profile.photos[0]["value"]
                    let newURL =  oldURL.substr(0,  oldURL.length-2);
                    newURL = newURL + "250"
                //Creating Mongoose Database
                    new User({
                        username: profile.displayName,
                        userId: profile.id,
                        image: newURL,
                        email: profile.emails[0]["value"]
                    }).save().then((newUser) => {
                        console.log("new user created", newUser)
                        done(null, newUser)
                   })
            }

        })

    })
)

Теперь, я думаю, я понимаю, что происходитздесь, но одну вещь, которую я не могу понять здесь, это ..

Как здесь вызывается

passport.use(
    new GoogleStratergy({
    //Options for the stratergy 

?Я имею в виду, что я не вижу никаких экспортных операторов, так как это связано с Node App?или как паспорт узнает за сценой о местонахождении нашей стратегии Google **

Кроме того, просто для подтверждения, после того, как мы завершили передачу из нашего passport.use?идет сериализация?

1 Ответ

0 голосов
/ 08 декабря 2018

Когда вы require паспорт, вы получаете одноэлементный экземпляр, т. Е. Он создается в первый раз, когда вы require паспорт, и используется повторно каждый раз, когда он require d впоследствии.

Таким образом, вам не нужно делить экземпляр между модулями, т.е. нет необходимости в экспорте.Любая конфигурация, которую вы выполняете для экземпляра, видна везде, где вам это требуется.

В NodeJS есть другие объекты, которые работают аналогичным образом, одним ярким примером является express экземпляр приложения.

Здесьэто исходный код для паспорта, где вы можете это проверить.

...