使用Passport Facebook验证Apollo GraphQL API

Vla*_*nov 5 javascript node.js passport-facebook graphql apollo-server

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

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

// 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
    },
);
Run Code Online (Sandbox Code Playgroud)

我的问题是,现在如何安全地将此令牌交给客户端?我已经读过这个this,这使我不得不在参数中传递令牌,但是我不确定我在做什么是否安全。

这是我在客户端获得它的方式:

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();
    },
}]);
Run Code Online (Sandbox Code Playgroud)

之后,在API中使用它:

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

    return {
        schema: executableSchema,
        context: {
            token,
        },
    };
}));
Run Code Online (Sandbox Code Playgroud)