🐾
Pusherのクライアントをサーバーサイドで自己認証する
PubsubサービスのPusher。
Pusherのsubscription
クライアントは基本的にpusher-js
を利用して行う。
そしてこのクライアント自体はnode
環境にも対応している。
また、private/presenceチャンネルの場合、pusher-http-node
を利用してauthorizeを通す必要がある。
これは基本的にサーバーを別途立てて/pusher/auth
へPOSTするような作りになっている。
問題点
この場合、例えばEdgeデバイスなどのnode環境上でサブスクリプションするクライアントを作る時いくらか面倒が発生する。サーバー向けにwebhooksもあるのだが、これは一点に集約するためで、Edgeサーバー向きではない
解決策
pusher-js
は実はauthorizer
というオプションを持っており、これで自己認証するクライアントを作成できる(当然だが、PUSHER_SECRETを秘匿して扱えるのが前提になる
const Pusher = require("pusher-js/node")
const PusherServer = require("pusher")
const uuid = require("uuid")
const pusherServer = new PusherServer({
appId: PUSHER_APP_ID,
key: PUSHER_KEY,
secret: PUSHER_SECRET,
cluster: "ap3",
encrypted: true,
})
// Pusher.logToConsole = true
const pusher = new Pusher(PUSHER_KEY, {
cluster: "ap3",
authorizer: (channel) => {
return {
authorize: (socketId, callback) => {
const auth = pusherServer.authenticate(socketId, channel.name, {
user_id: `server-${uuid.v4()}`, // we require userId when presence channel
})
callback(false, auth)
},
}
},
})
Discussion