たとえば 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.Server
のheaders
イベントでハンドシェイク応答のヘッダにアクセスできるので、必要ならばここでカスタムヘッダを注入する。
wsServer.on("headers", (headers : string[]) => {
doSomething();
});