护照和JWT& Google策略 - 禁用会话&谷歌回调后的res.send()

时间:2016-11-27 12:29:26

标签: node.js express passport.js json-web-token passport-google-oauth

使用:passport-google-oauth2

我想将JWT与Google登录一起使用 - 因为我需要disable session并以某种方式将用户模型传递回客户端。 所有示例都使用magically redirect to '/'的谷歌回调。

我如何:
1.使用passport-google-oauth2时禁用会话 2.在google身份验证后res.send()用户到客户端。

如果我没有朝着正确的方向前进,请随意提出替代方案。

1 个答案:

答案 0 :(得分:11)

通过一些见解来管理以克服这个问题:
1.在express中禁用会话 - 只需删除会话的中间件

// app.use(session({secret: config.secret}))

2。使用Google身份验证时实际发生的情况是,有一个重定向到谷歌登录页面,如果登录成功,它会将您重定向到您提供的网址。

这实际上意味着一旦google调用你的回调你不能做res.send(令牌,用户) - 它根本不起作用(任何人都可以详述为什么?)。因此,您可以通过res.redirect("/")强制重定向到客户端。 但是整个目的是传递令牌,这样你也可以res.redirect("/?token=" + token)

app.get( '/auth/google/callback',
        passport.authenticate('google', {
            //successRedirect: '/',
            failureRedirect: '/'
            , session: false
        }),
        function(req, res) {
            var token = AuthService.encode(req.user);
            res.redirect("/home?token=" + token);
        });

但是客户端如何获得用户实体? 所以你也可以以同样的方式传递用户,但它并不适合我(在参数列表中传递整个用户实体......)。 所以我所做的就是让客户端使用令牌并检索用户。

    function handleNewToken(token) {
        if (!token)
            return;

        localStorageService.set('token', token);

        // Fetch activeUser
        $http.get("/api/authenticate/" + token)
            .then(function (result) {
                setActiveUser(result.data);
        });
    }

这意味着另一个http请求 - 这让我想到也许我没有正确的令牌概念。 随意赐教。