使用JWT,NodeJS和AngularJS登录Twitter

时间:2017-09-11 06:35:16

标签: javascript angularjs node.js twitter

我遇到了一个很大的问题,我不确定这只是一个代码设计问题,还是我试图做一些毫无意义的事情。

我已使用护照进行本地注册进行身份验证,并使用JWT进行路由访问和权限。我将令牌发送到前端并使用AngularJS将其保存到LocalStorage。

那里的一切都有效并且有意义。但是通过Twitter,我无法弄清楚如何实现相同的策略来让用户登录。

我在Twitter方面设置了所有内容,使用护照进行登录和注册。但我不知道如何将令牌发送到前端,因为我只能使用GET请求从Twitter API接收信息。

我重定向到Twitter登录,重定向到回调网址。但那后呢?我有一些相关的代码只返回JWT。我要问的是如何以尽可能最好的方式将其传递给Angular?

路线:

app.get('/login/twitter', passport.authenticate('twitter'));
app.get('/login/twitter/callback', function(req, res) {
    passport.authenticate('twitter' , function(err, user, info) {
        if(err) {
            res.json({
                'message': err
            });
        }
        var token;
        token = user.generateJwt();
        res.status(200);
        res.json({
            "token" : token
        });
    })(req, res);
});

护照:

passport.use(new TwitterStrategy({consumerKey: auth.twitterAuth.consumerKey, consumerSecret: auth.twitterAuth.consumerSecret, callbackURL: auth.twitterAuth.callbackURL}, function(req, key, keySecret, profile, done) {
    User.findOne({'twitter.id' : profile.id}, function(err, user) {
        if(err) {
            return done(err);
        }
        if(user) {
            if(!user.twitter.token) {
                user.twitter.token = key;
                user.twitter.username = profile.username;
                user.twitter.displayName = profile.displayName;

                user.save(function(err) {
                    if(err) {
                        res.json({
                            'message': err
                        });
                    }
                    return done(null, user);
                });
            }
            return done(null, user);
        }
        let newUser = new User();

        newUser.twitter.id = profile.id;
        newUser.twitter.token = key;
        newUser.twitter.username = profile.username;
        newUser.twitter.displayName = profile.displayName;
        newUser.twitter.registerDate = Date.now();

        newUser.save(function(err) {
            if(err) {
                res.json({
                    'message': err
                });
            }
            return done(null, newUser);
        });
    });
}));

1 个答案:

答案 0 :(得分:0)

根据我的经验,执行此操作的最佳方法是将要存储在JWT中的信息传递到url,并将令牌存储在回调页面上的localStorage中。用户标识符存储在浏览器中后,请重定向到所需页面。