Phoenix/Elixir用戶認證系統

1. 選擇Session or JWT?

關于Session和JWT的區別和聯系,可以看以下兩篇文章:
[1] 什么是 JWT -- JSON WEB TOKEN
[2] 服務器session和jwt之爭
[3] cookie session,jwt,弱一致性數據與重放攻擊
[4] 為什么 APP 要用 token 而不用 session 認證?

總結,Web端用session+https沒有什么問題,session注意加密即可。App/API端用JWT,注意實現的方式,jwt存在的目的是防止每次認證都hit database。

2. überauth

überauth是一個基于Plug的Elixir Web應用認證系統。

如果你熟悉 Ruby 你可以把 Plug 想成 Rack,再加上一點 Sinatra。它提供了編寫 Web 應用組件的一組規范,以及接入 Web 服務器所需的一些適配器。雖然 Plug 不屬于 Elixir 的核心庫,但它依然是一個 Elixir 官方維護的項目。

關于Plug的更多介紹,可以參考以下兩個鏈接:
[1] Plug Documentation
[2] Elixir School Plug

Ueberauth是一個兩步認證框架,它提供了清晰的API,允許社區自定義許多認證策略。它深受Omniauth項目的啟發,概念類似,但是實現上不同。Ueberauth提供的僅是初始的認證(初始OAuth流,從登錄表單獲取信息等),它并不會認證每個請求,這交給你應用來實現。你可以指定一個token或者把應用需要的結果放到session中。可以通過Guardian等來幫助你應用層面的認證,即請求級別的認證。

兩個階段是request和callback,這些階段由策略Strategies實現。

2.1 Strategies 策略

Strategies是Plug,用來裝飾攔截請求。

Strategies實現了兩個步驟,然后允許request流過下面的plugs。根據strategies需求,實現request和callback兩步是可選的。如果strategy不重定向,請求會裝飾以Ueberauth的信息,并在pipeline中傳遞。

目前Strategies分為Provider Strategies和Developer Strategies:

Provider Strategies

Developer Strategies

  • Identity - A basic username/password strategy.

2.2 Request Phase 請求步驟

The request phase is where you request information about the user. This could be a redirect to an OAuth2 authorization url or a form for collecting username and password. The request phase is concerned with only the collection of information. When a request comes in on the request phase url the relevant strategy will receive the handle_request! call.

請求步驟會請求用戶信息。這一步會跳轉到OAuth2認證url或者一個包含用戶名密碼的表單。請求步驟只關注信息。

2.3 Callback Phase 回調步驟

The callback phase is where the fun happens. Once a successful request phase has been completed, the request phase provider (OAuth provider or host site, etc) should call the callback URL. The strategy will intercept the request via the callback_phase!
. If successful, it should prepare the connection so the Ueberauth.Auth
struct can be created, or set errors to indicate a failure.

一旦請求步驟成功,請求步驟服務商(OAuth或者主站)會請求回調URL。這個策略會攔截callback_phase!的請求。如果成功,它會準備好連接,Ueberauth.Auth結構體被創建,如果失敗,則報錯。

3. Guardian

An authentication framework for use with Elixir applications.
Guardian is based on similar ideas to Warden but is re-imagined for modern systems where Elixir manages the authentication requirements.

Guardian remains a functional system. It integrates with Plug, but can be used outside of it. If you're implementing a TCP/UDP protocol directly, or want to utilize your authentication via channels, Guardian is your friend.

The core currency of authentication in Guardian is JSON Web Tokens (JWT). You can use the JWT to authenticate web endpoints, channels, and TCP sockets and it can contain any authenticated assertions that the issuer wants to include.

正如上面介紹的,Guardian為你應用請求進行認證,它并不校驗密碼或是從OAuth服務商獲取信息。你可以通過überauth或者構建自己的email/password認證基于Comeonin。Guardian只處理每個請求的認證。
Guardian looks after authenticating each request to your application. It doesn't do the initial checking of passwords or fetching information from an OAuth provider. For that you can use something like überauth or roll your own email/password using something like Comeonin. Guardian handles each request authentication. Challenging users and confirming their credentials is up to your application. Guardian assumes that you have a user representation that you've confirmed already.

[1] http://blog.overstuffedgorilla.com/simple-guardian/

4. 其他框架

Openmaize
coherence - ExAdmin作者提供的用戶登錄注冊系統
openmaize - 基于JWT的用戶認證

5. 擴展閱讀

[1] Phoenix Guardian 示例項目
[2] http://blog.overstuffedgorilla.com/
[3] https://www.youtube.com/watch?v=X6Z-sDSJ3sE

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,791評論 6 545
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,795評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,943評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,057評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,773評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,106評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,082評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,282評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,793評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,507評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,741評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,220評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,929評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,325評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,661評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,482評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,702評論 2 380

推薦閱讀更多精彩內容