在Android上使用Passport会话进行身份验证

时间:2016-12-08 00:44:28

标签: android node.js session authentication express

我有一个当前使用NodeJS和Express运行的Web应用程序,我使用Passport会话对用户进行身份验证,并且它运行正常。以下是我的工作概况:

app.use(session({
    secret : 'hidden of course :)',
    resave: false,
    saveUninitialized: true
}));

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

/****** Passport functions ******/
passport.serializeUser(function (user, done) {
    done(null, user.idUser);
});

passport.deserializeUser(function (id, done) {
    db.user.findOne( { where : { idUser : id } }).then(function (user, err) {
        done(null, user);
    });
});

//Facebook
passport.use(new FacebookStrategy({
    //Information stored on config/auth.js
    clientID: *******,
    clientSecret: ******,
    callbackURL: *******,
    profileFields: ['id', 'emails', 'displayName', 'name', 'gender', 'picture.type(large)'] 

}, function (accessToken, refreshToken, profile, done) {
    //Using next tick to take advantage of async properties
    process.nextTick(function () {
        db.user.findOne( { where : { idUser : profile.id } }).then(function (user, err) {
            if(err) {
                return done(err);
            } 
            if(user) {
                return done(null, user);
            } else {
                // Check whether the email is undefined or valid
                var emailTemp = '';
                if(profile.emails && profile.emails[0] && profile.emails[0].value) {
                    emailTemp = profile.emails[0].value;
                } else {
                    emailTemp = '';
                }

                var picture = '';
                if(profile.photos && profile.photos[0] && profile.photos[0].value) {
                    picture = profile.photos[0].value;
                } else {
                    picture = '/img/profile.png';
                }

                var sexFb = '';
                if(profile.gender) {
                    sexFb = profile.gender;
                } else {
                    sexFb = '';
                }

                // Create the user
                db.user.create({
                    idUser : profile.id,
                    token : accessToken,
                    picture : picture,
                    nameUser : profile.displayName,
                    email : emailTemp,
                    sex : sexFb
                }).then(function () {
                    db.user.findOne( { where : { idUser : profile.id } }).then(function (user, err) {
                        if(user) {
                            return done(null, user);
                        } else {
                            return done(err);
                        }
                    });
                });
            }
        });
    });
}));

app.use(express.static(__dirname + '/public/'));

/* FACEBOOK STRATEGY */
// Redirect the user to Facebook for authentication.  When complete,
// Facebook will redirect the user back to the application at
//     /auth/facebook/callback//
app.get('/auth/facebook', passport.authenticate('facebook', { scope : ['email']}));
/* FACEBOOK STRATEGY */
// Facebook will redirect the user to this URL after approval.  Finish the
// authentication process by attempting to obtain an access token.  If
// access was granted, the user will be logged in.  Otherwise,
// authentication has failed.

app.get('/auth/facebook/callback',
    passport.authenticate('facebook', { failureRedirect: '/' }),
    function (req, res) {
        // Successful authentication, redirect home.
        res.redirect('../../app.html');
});     

现在,我正在构建我们的Android应用程序,我需要对用户进行身份验证,最好使用我已经为Web版本构建的后端。我是checking some questions on SO like this one,我理解了很多我必须做的事情。

目前我的客户通过Express会话处理的cookie保持登录状态,在req.user上保存用户的id,以便我可以像这个例子一样运行查询:

app.put('/profile', function (req, res) {
    //Updates the profile information of the user
    db.user.update({
        nameUser : req.body.nameUser
    }, {
        where : {
            idUser : req.user.idUser
        }
    }).then(function (user) {
        res.json({ yes : "yes" });
    });
});

所以我的问题:

  1. 我可以使用与目前相同的策略对用户进行身份验证吗?如果没有,我需要更改什么才能在Android上验证我的用户?

  2. 一旦对它们进行身份验证,如何从Android设置req.user(通过HTTP请求或其他方式)以在后端正确执行任务(因为我的所有请求都基于req.user)?我认为Android不像浏览器那样保留cookie,那么Passport Sessions如何知道哪个用户正在调用API?

  3. 我目前在Android应用上使用Retrofit2与API进行交互,是否能够执行此任务所需的操作?

  4. 很抱歉这篇长篇文章,添加了大量代码只是为了安全起见,如果您有任何问题或需要任何解释,请告诉我们!

0 个答案:

没有答案