我有一个客户端服务器和一个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
},
);
我的问题是,我现在如何安全地将此令牌交给客户?我已经阅读了this和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();
},
}]);
在此之后,在API中使用它:
app.use('/graphql', apolloExpress(req => {
let token;
if (req.headers.authorization) {
token = req.headers.authorization;
console.log(token);
}
return {
schema: executableSchema,
context: {
token,
},
};
}));