用直播彈幕進行身份驗證

最近 B 站彈幕游戲直播很熱鬧,但我總感覺有點單調(diào)。
比如彈幕修仙,參與之后,退出直播間,我仿佛從沒來過,沒有任何記錄留下來過。
像是在公園用玩具槍打氣球,在路邊套圈,沒有人會記得我來玩過。

如果游戲提供者想要記錄一些用戶數(shù)據(jù),他當然可以把彈幕消息中的用戶 uid 記錄下來。
比如想知道有誰筑基,有哪些人結(jié)丹,那么游戲提供者就應該把游戲數(shù)據(jù)和彈幕消息中的 uid 做好映射,然后在 B 站的專欄發(fā)布自己記錄的排名數(shù)據(jù)。
公開數(shù)據(jù)可以這么發(fā)布出來,但是游戲數(shù)據(jù)總有一些玩家私密的內(nèi)容:儲物袋里總有一些秘密不想給別人看到。讓這類數(shù)據(jù)只有玩家本人能夠看到,就需要做一次身份驗證(登陸)。
因為彈幕游戲的玩家是以 B 站帳號為馬夾產(chǎn)生游戲數(shù)據(jù)的,所以登陸行為的目的還是為了驗證 B 站帳號身份。
常規(guī)做法是在 B 站注冊為開發(fā)者,然后制作一個網(wǎng)站(公眾號網(wǎng)頁、小程序……),在傳統(tǒng)的登陸流程中接入 B 站帳號登陸流程。
emmmm……實際上這很麻煩,認證和審核流程先不說了,搭建一個登陸功能完善的 Web 可能復雜度已經(jīng)匹敵彈幕游戲了,有點舍本逐末。

這就需要設計一個相對安全,但是要足夠簡單的身份認證系統(tǒng)。
我把目光又轉(zhuǎn)向了直播彈幕。

直播彈幕實際上彈幕 WS 通訊中的一個數(shù)據(jù)包,普通類型的彈幕包括 1. 發(fā)送者uid 2. 正文內(nèi)容(20字以內(nèi))等,正常情況下,是不存在冒用 uid 發(fā)送彈幕的(吧?),所以我嘗試提出一個簡單的驗證碼流程,用作驗證登陸請求確實是某個對應的 B 站用戶發(fā)出的。
這個流程首先需要一個數(shù)據(jù)結(jié)構(gòu),作為驗證狀態(tài)的記錄:
當一個用戶想要登陸的時候,需要
在本地生成一個 UUID,用作表示當前客戶端和開啟的會話。發(fā)送自己的 uid 和 UUID 到服務器。
服務器收到打開請求,在數(shù)據(jù)庫中新建一個 DanmuAuth 記錄,儲存 buid 和 UUID。生成并存儲一個 VCode,我推薦選擇比較好做正則匹配的前綴,把 VCode 返回給用戶。
用戶在一個指定的直播間將 VCode 作為彈幕發(fā)送。
服務提供者部署一個彈幕流偵聽腳本,如果正則匹配到了 VCode 格式的彈幕,將其中正文和 uid 一并發(fā)給服務端處理。
服務端查詢十分鐘內(nèi)的是否有符合 uid 和 VCode 的記錄,如果有,則將 VerifiedCount 的值加一。
用戶在前端發(fā)起“我已發(fā)送彈幕”的請求,通知服務器。
服務器查詢 buid 、UUID、VCode 同時符合的記錄,且其 VerifiedCount 大于一個閾值(這里是0),服務器生成 JWT 并刪除這條 DanmuAuth 記錄。
將 JWT 返回給用戶,登陸成功。
這是一個比較簡單的流程,我們將其用在了我們自己的直播工具?https://2some.one?上,它目前運行得很不錯。
同時這個登陸流程我們實現(xiàn)了一個開源版本,https://github.com/tymon42/live-stream-commont-auth?
基于它,你也可以嘗試實現(xiàn)一個分布式的認證服務(更改一下? VerifiedCount 的閾值)。
有任何提議和問題,歡迎評論和 issues,請隨意。