如何从羽毛客户端添加REST请求的XSRF标头

时间:2018-12-18 20:32:01

标签: feathersjs

我已经按照Can feathers co exist with routs managed out side of feathers配置了服务器/节点。我的配置如下所示。

const app = express(feathers());

app.use(cookieParser());
app.use(csrf({cookie: true}));
app.use(express.urlencoded({extended: true}));
app.use(express.json({strict: false, limit: '1mb'}));

app.configure(express.rest());
app.configure(primus({transformer: 'uws'}, primus => {
    // primus.library();
    // primus.save(__dirname + '/feathers-primus-client.js');

    primus.authorize(function (req, done) {
    const userToken = socketUtility.getTokenFromHandshake(req);

    if (csrf.verifyCSRFToken(req)) { // csrfToken === req.query.csrf;
        done();
    } else {
        done({statusCode: 403, message: 'handshake unauthorized'});
    }
});

// Set up our services (see `services/index.js`)
app.configure(services);
app.hooks(appHooks);

这是我的客户代码的一部分:

this.restFeathersClient = feathers();
this.socketFeathersClient = feathers();
this.serverAddress = `${window.location.origin}:${window.location.port}`;

const rest = feathers.rest(this.serverAddress);
this.restFeathersClient.configure(rest.fetch(window.fetch));

const socket = new Primus(this.serverAddress);
this.socketFeathersClient.configure(feathers.primus(socket));

现有应用程序使用的是csrf软件包。因此,无需过多介绍。从客户端,我需要:

  1. 在REST调用上设置“ X-XSRF-COOKIE”请求标头。
  2. 在每个上添加request.query.csrf。

对于Primus,我们当前的实现监听“ outgoing :: url”。

我非常感谢您的帮助,因为我不确定如何使用Feathers Client执行此操作。

1 个答案:

答案 0 :(得分:0)

因此,我能够找到REST调用的解决方案。我打算使用提取,因此我的解决方案仅适用于提取。我使用了“ fetch-intercept”包,并注册了一个拦截器来添加标题。如果您使用angularjs,则可能可以使用$ http并添加标头。对于其他REST选项,您可能必须找到类似的解决方案。

这是代码段:

import * as fetchIntercept from 'fetch-intercept';

fetchIntercept.register({
    request(url, config) {
        if (config.method !== 'GET') {
            const XSRF_TOKEN = 'XSRF-TOKEN';
            const csrfToken = document.cookie.match(new RegExp('(^| )' + XSRF_TOKEN + '=([^;]+)'));
            if (csrfToken) {
                config.headers[`X-${XSRF_TOKEN}`] = csrfToken[2];
            }
        }
        return [url, config];
    }
});

这是Primus的解决方案:

const csrfToken = 'get your token';
const socket = new Primus(`${this.serverAddress}?csrf=${csrfToken}`);

feathersClient.configure(feathers.primus(socket));