🐾

Pusherのクライアントをサーバーサイドで自己認証する

2020/09/22に公開

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