🐶
terrier.dev

posted: 2020/04/29

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)
      },
    }
  },
})

Edit on Github