7

我有一个客户端服务器和一个 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,
        },
    };
}));
4

0 回答 0