Как можно создать несколько входов в систему в веб-приложении в приложении node.js express для ex.админ и клиент - PullRequest
0 голосов
/ 06 марта 2019

Можно ли создать несколько учетных записей в веб-приложении node.js express, например, в качестве администратора и клиента, используя passport-google-oauth20 и, возможно, другие стратегии?

В настоящее время я пытаюсь создать сайт электронной коммерции, который имеет cms, у меня есть простая функция промежуточного программного обеспечения, которую я передаю по маршрутам, которые я хочу защитить, и вот эта функция:

function ensureUserIsAuthenticated(req, res, next){ 
if(req.user){ next()}
else{return res.redirect('/login')

Моя цель состоит в том, чтобы запретить клиентам входить в панель администратора с помощью Google Auth.

На данный момент у меня есть одна стратегия аутентификации Google, которую я использую. Мой вопрос: нужно ли мне создавать другие стратегии? как мне отделить логику защиты?

  /COOKIE SETUP
app.use(cookieSession({
    maxAge: 30 * 24 * 60 * 60,
    keys: [COOKIE.COOKIE_KEYS]
}))

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


passport.deserializeUser((id, done) => {
    User.findById(id).then(user => {
        done(null, user)
    }).catch(err => {
        if (err) throw err
    })
})

app.use(passport.initialize())
app.use(passport.session())

// GOOGLE AUTHENTICATION
passport.use(new GoogleStrategy({
    clientID: GOOGLE.GOOGLE_CLIENT_ID,
    clientSecret: GOOGLE.GOOGLE_CLIENT_SECRET,
    callbackURL: ' /auth/google/callback'
}, (accessToken, refreshToken, profile, done) => {

    User.findOne({
        googleId: profile.id
    }).then(user => {
        if (user) {
            //Already a member.
            console.log('This User Exists')
            done(null, user)
        } else {
            //Register new member
            const user = new User({
                googleId: profile.id
            })
            user.save().then(user => {
                console.log('New Member Registered')
                done(null, user)
            }).catch(err => {
                if (err) throw err;
            })
        }
    }).catch(err => {
        if (err) throw err;
    })

}))


app.get('/login', (req, res, next) => {
    res.status(200).render('login')
})

app.get('/auth/google', passport.authenticate('google', {
    scope: ['profile', 'email']
}))

app.get('/auth/google/callback', passport.authenticate('google'),
    (req, res, next) => {
        res.redirect('/products');
    });


app.get('/api/current_user', isUserAuthenticated, (req, res, next) => {
    res.send(req.user);
})

app.use(ordersRoute);
app.use(productsRoute);

app.get('/logout', (req, res, next) => {
    req.logOut();
    console.log('Youve been logged out')
    res.redirect('/login')
})

OrdersRoutes представляют => Маршруты клиентов ProductRoutes представляют => маршруты администратора

1 Ответ

0 голосов
/ 06 марта 2019

Вы можете передать роль во входной полезной нагрузке, например, 0 = admin и 1 = user,

Итак, сначала вы аутентифицируете пользователя, если аутентификация успешна, а затем на основе роли вы можете перенаправить ее на страницу администратора и пользователя * 1003.*

...