跳到主要內容

發表文章

目前顯示的是 六月, 2016的文章

在 rails 上實作轉移 Parse 手機推播服務到 Amazon SNS

簡要說明 為了避免使用者因服務轉換而被迫強制更新,移轉過程採用漸進方式。

如果不需要如此痛苦的同時使用兩種服務的捧油,可以參考這一篇的實作,直接用 AWS Mobile Hub 的服務做批次資料移轉。

由於在轉換期需要同時支援兩邊服務運作,又要避免使用者重複收到相同的推播,需要實作「對同一裝置擇一服務進行推播」。本篇實作的概念是,使用者只有在用新版本的 APP 登入時,伺服器才會從 APP 取得 device_token 去註冊 Amazon SNS endpoint_arn,同時刪除 Parse 服務上的使用者的所有 Installation 紀錄。

Parse 跟 Amazon SNS 的 API 邏輯有些不同,主要差別在於,Parse 只需要在同一 request 裡就可以達到「推播給符合某條件的 channels 組合,並且可以指定其中的特定 users 組合」,但是 Amazon 的推播就是 topic_arn / target_arn 兩種,要收到 topic_arn 的話要先讓 endpoint_arn 訂閱特定的 topic_arn,而 target_arn 則是一個 request 只能推播給單一 target_arn (endpoint_arn)。

開發步驟打包一隻 AmazonSnsWrapper 把 Amazon SDK 提供的 method 客製成符合需求的介面,專門負責跟 Amazon server 溝通。 新增 AmazonSnsInfo Model 以記錄使用者的 SNS 訂閱狀況。 新增 ParseInstallationWrapper 打包 Parse RESTful API 裡的 method,查詢使用者之前透過 APP 註冊的 Installations,並且刪除已經成功轉換到 Amazon SNS 的 Installation。 新增 update_push_subscription / logout API 來針對 APP 傳送的 device_token 做各種 push subscription / unsubscription 的操作。 新增 PushServicesWrapper 把所有 Push 行為的邏輯打包在一起方便做服務切換。

Rails grape API 上實作 JWT 多重登入

多重登入的需求,在服務本身允許「跨裝置體驗」或者是「接受不同 request agent (APP request / mobile browser)」的時候顯得重要。

理想情況下,可以讓使用者在介面上面清楚知道目前帳號的登入狀態,並在登入數超過服務上限的時候,讓使用者自己選擇要移除登入授權的裝置,使用者流程大概會像(這篇文)那樣,要做到類似參考連結這樣的管理介面,需要我目前還不會的前端的配合建置與基本的 session 管理 API。本篇只先建置允許使用多重登入的資料結構與登入驗證 API。

選擇用 JWT (Jason Web Token) 作為主要的憑證溝通,優點有一些:
透過加密 payload 來比對資料庫內容的方式,可以不用在資料表中「直接存入」與憑證相關的訊息,加密跟解密只要透過協定就能進行調整。payload 裡面塞入的訊息可以自訂,在各服務跟裝置之間交換加密過後的使用者資料。signing key / protocol 可以在有資安疑慮時更換。 使用 Devise 的 Rails 捧油也可參考 devise_token_auth 這個 gem,整合效果在文件上面看起來很完善,但因為目前我手邊的系統絕大多數的 request 都來自 grape API endpoint ,比較過後,跟搞懂並駕馭 devise 設定比起來,我還是選擇自刻 JWT 較節省開發時間。