使用Passport Facebook验证Apollo GraphQL API

时间:2016-12-12 22:33:38

标签: javascript node.js graphql passport-facebook apollo-server

我有一个客户端服务器和一个API,都使用Apollo。当用户使用Facebook登录时,我想将令牌发送到我的客户端服务器,然后将其附加到每个对API发出的请求的标头中。不使用会话。

以下是API的外观,当用户使用Facebook登录时,这会成功生成令牌(我也会在后台检查数据库中的用户)。

// API running on port 3010
app.use(expressJwt({
    secret: authConfig.jwt.secret,
    credentialsRequired: false,
    getToken: req => req.cookies.id_token,
}));
app.use(passport.initialize());
app.get('/login/facebook',
    passport.authenticate('facebook', { scope: ['email'], session: false }),
);

app.get('/login/facebook/return',
    passport.authenticate('facebook', { failureRedirect: 'http://localhost:3000/login', session: false }),
    (req, res) => {
        const expiresIn = 60 * 60 * 24 * 1; // 1 day
        const token = jwt.sign(req.user, authConfig.jwt.secret, { expiresIn });
        res.redirect(`http://localhost:3000?token=${token}`); // Redirect to client and append token to param
    },
);

我的问题是,我现在如何安全地将此令牌交给客户?我已经阅读了thisthis,这导致我将代币传递给参数,但我不确定我所做的事情是否安全。

以下是我如何在客户端获取它:

const token = getURLParameterByName('token');
if (token) {
    localStorage.setItem('token', token);
}

networkInterface.use([{
    applyMiddleware(req, next) {
        if (!req.options.headers) {
            req.options.headers = {};   // Create the header object if needed.
        }

        // Get the authentication token from local storage if it exists
        const localToken = localStorage.getItem('token')
        req.options.headers.authorization = localToken ? `Bearer ${localToken}` : null;
        next();
    },
}]);

在此之后,在API中使用它:

app.use('/graphql', apolloExpress(req => {
    let token;
    if (req.headers.authorization) {
        token = req.headers.authorization;
        console.log(token);
    }

    return {
        schema: executableSchema,
        context: {
            token,
        },
    };
}));

0 个答案:

没有答案