LoginSignup
10
9

More than 5 years have passed since last update.

wsでハンドシェイクのヘッダにアクセスする

Last updated at Posted at 2014-08-06

たとえば WebSocket ハンドシェイクのヘッダを用いてクライアントを認証したいとして、必要なフックがwsモジュールのどこにあるか。

要求

ws.ServerのコンストラクタのverifyClientオプションでハンドシェイク要求をフックできる。

var wsServer : ws.Server = new ws.Server({
    server : httpServer,
    verifyClient : verifyClient // <- この子
});

verifyClient に与えられる引数 info からリクエストヘッダにアクセスできる。

認証の成否については、戻り値で返す方法とコールバックで通知する2種類の方法があるようだ。

認証の成否を戻り値で返す
function verifyClient(
    info : {
        origin: string;
        secure: boolean;
        req:    http.ServerRequest}
) : boolean {
    return doSomething(info.req.headers);
}
認証の成否をコールバックで通知する
function verifyClient(
    info : {
        origin: string;
        secure: boolean;
        req:    http.ServerRequest
    },
    cb : (res: boolean, code?, name?) => boolean
) : void {
    cb(doSomething(info.req.headers), 401, 'Unauthorized');
}

コールバック方式では応答を明示的に指定できる。戻り値方式は 401 Unauthorized で固定。

応答

ws.Serverheadersイベントでハンドシェイク応答のヘッダにアクセスできるので、必要ならばここでカスタムヘッダを注入する。

wsServer.on("headers", (headers : string[]) => {
    doSomething();
});
10
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9