Phoenix/Elixir用戶認(rèn)證系統(tǒng)

1. 選擇Session or JWT勇婴?

關(guān)于Session和JWT的區(qū)別和聯(lián)系伟众,可以看以下兩篇文章:
[1] 什么是 JWT -- JSON WEB TOKEN
[2] 服務(wù)器session和jwt之爭
[3] cookie session,jwt,弱一致性數(shù)據(jù)與重放攻擊
[4] 為什么 APP 要用 token 而不用 session 認(rèn)證?

總結(jié),Web端用session+https沒有什么問題输涕,session注意加密即可。App/API端用JWT慨畸,注意實(shí)現(xiàn)的方式莱坎,jwt存在的目的是防止每次認(rèn)證都hit database。

2. überauth

überauth是一個(gè)基于Plug的Elixir Web應(yīng)用認(rèn)證系統(tǒng)寸士。

如果你熟悉 Ruby 你可以把 Plug 想成 Rack檐什,再加上一點(diǎn) Sinatra。它提供了編寫 Web 應(yīng)用組件的一組規(guī)范弱卡,以及接入 Web 服務(wù)器所需的一些適配器乃正。雖然 Plug 不屬于 Elixir 的核心庫,但它依然是一個(gè) Elixir 官方維護(hù)的項(xiàng)目婶博。

關(guān)于Plug的更多介紹瓮具,可以參考以下兩個(gè)鏈接:
[1] Plug Documentation
[2] Elixir School Plug

Ueberauth是一個(gè)兩步認(rèn)證框架,它提供了清晰的API凡人,允許社區(qū)自定義許多認(rèn)證策略名党。它深受Omniauth項(xiàng)目的啟發(fā),概念類似划栓,但是實(shí)現(xiàn)上不同兑巾。Ueberauth提供的僅是初始的認(rèn)證(初始OAuth流,從登錄表單獲取信息等)忠荞,它并不會(huì)認(rèn)證每個(gè)請求,這交給你應(yīng)用來實(shí)現(xiàn)帅掘。你可以指定一個(gè)token或者把應(yīng)用需要的結(jié)果放到session中委煤。可以通過Guardian等來幫助你應(yīng)用層面的認(rèn)證修档,即請求級別的認(rèn)證碧绞。

兩個(gè)階段是request和callback,這些階段由策略Strategies實(shí)現(xiàn)吱窝。

2.1 Strategies 策略

Strategies是Plug讥邻,用來裝飾攔截請求迫靖。

Strategies實(shí)現(xiàn)了兩個(gè)步驟,然后允許request流過下面的plugs兴使。根據(jù)strategies需求系宜,實(shí)現(xiàn)request和callback兩步是可選的。如果strategy不重定向发魄,請求會(huì)裝飾以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.

請求步驟會(huì)請求用戶信息励幼。這一步會(huì)跳轉(zhuǎn)到OAuth2認(rèn)證url或者一個(gè)包含用戶名密碼的表單汰寓。請求步驟只關(guān)注信息。

2.3 Callback Phase 回調(diào)步驟

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.

一旦請求步驟成功苹粟,請求步驟服務(wù)商(OAuth或者主站)會(huì)請求回調(diào)URL有滑。這個(gè)策略會(huì)攔截callback_phase!的請求。如果成功嵌削,它會(huì)準(zhǔn)備好連接俺孙,Ueberauth.Auth結(jié)構(gòu)體被創(chuàng)建,如果失敗掷贾,則報(bào)錯(cuò)睛榄。

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為你應(yīng)用請求進(jìn)行認(rèn)證想帅,它并不校驗(yàn)密碼或是從OAuth服務(wù)商獲取信息场靴。你可以通過überauth或者構(gòu)建自己的email/password認(rèn)證基于Comeonin。Guardian只處理每個(gè)請求的認(rèn)證港准。
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作者提供的用戶登錄注冊系統(tǒng)
openmaize - 基于JWT的用戶認(rèn)證

5. 擴(kuò)展閱讀

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旨剥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子浅缸,更是在濱河造成了極大的恐慌轨帜,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衩椒,死亡現(xiàn)場離奇詭異蚌父,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)毛萌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門苟弛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人阁将,你說我怎么就攤上這事膏秫。” “怎么了做盅?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵缤削,是天一觀的道長窘哈。 經(jīng)常有香客問我,道長亭敢,這世上最難降的妖魔是什么滚婉? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮吨拗,結(jié)果婚禮上满哪,老公的妹妹穿的比我還像新娘。我一直安慰自己劝篷,他們只是感情好哨鸭,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著娇妓,像睡著了一般像鸡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哈恰,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天只估,我揣著相機(jī)與錄音,去河邊找鬼着绷。 笑死蛔钙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的荠医。 我是一名探鬼主播吁脱,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼彬向!你這毒婦竟也來了兼贡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤娃胆,失蹤者是張志新(化名)和其女友劉穎遍希,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體里烦,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凿蒜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了招驴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片篙程。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖别厘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拥诡,我是刑警寧澤触趴,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布氮发,位于F島的核電站,受9級特大地震影響冗懦,放射性物質(zhì)發(fā)生泄漏爽冕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一披蕉、第九天 我趴在偏房一處隱蔽的房頂上張望颈畸。 院中可真熱鬧,春花似錦没讲、人聲如沸眯娱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽徙缴。三九已至,卻和暖如春嘁信,著一層夾襖步出監(jiān)牢的瞬間于样,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工潘靖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留穿剖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓卦溢,卻偏偏與公主長得像糊余,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子既绕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容