如何選擇一款身份認證服務?
作者 | 孫嘉瑤
OAuth 2.0是允許用戶授權客戶端代表其訪問受保護資源的協議,例如在使用某些微信小程序時會彈出對話框尋求你的授權,基于OAuth2.0協議授權后該小程序就能訪問你允許其訪問的資源,比如頭像、用戶名等。有很多公司基于此構建了身份認證管理系統讓使用者能夠快速構建認證服務,常見的有Amazon Cognito, Auth0, Firebase Authentication, Ping Identity,Azure Active Directory等。
我曾經在項目中同時接觸到了兩個市場份額占比大的基于云的身份管理服務,Auth0和Cognito,兩者都能提供快速搭建身份認證和授權的服務,包括創建客戶端,維護用戶池,提供多種登錄和多重身份認證方式等。
但它們的區別在哪里,如果想要構建一個認證服務,應該如何選擇供應商呢?本文將從用戶使用的角度以及開發者的角度進行對比。
用戶使用角度
自定義界面
當用戶使用一個認證系統時,界面是否簡潔容易操作,提供的登錄方式是否符合需求是用戶首先注意到的內容。并且客戶端往往要求自行定制界面,例如添加公司logo,定義界面顏色樣式等。在這方面,Cognito和Auth0都提供了基于不同客戶端定制UI的功能。
圖片
Cognito Hosted UI
Cognito的UI定制功能自定義范圍有限,只能替換顏色,logo樣式,按鈕和輸入框樣式。
圖片
Auth0 Hosted UI
Auth0的可定制范圍廣,在universal login功能中可以定制登錄、注冊、忘記密碼、MFA界面的顏色、字體、logo、排列方式,并且提供了liquid模版,可以根據客戶端加載不同的界面樣式。在此基礎上如果有其他定制化的需求,Auth0還基于lock和auth0.js SDK提供了三種模版:Lock, Lock(passwordless)和Custom Login Form方便進行自定義。
登錄方式
在提供的登錄方式方面,Cognito提供的有用戶名和密碼登錄,社交賬號登錄以及企業登錄,涵蓋Google,Apple,Facebook,Amazon,SAML和OIDC等。
圖片
Cognito支持的外部登錄種類
在此基礎上,Auth0提供了52種社交賬號登錄方式,在企業登錄方面還提供了Google workspace, Okta,Azure, Ping, ADFS, LDAP等方式,只需提供client ID和secret就能完成配置,因此在利用社交賬號登錄和企業登錄方面Auth0配置更方便,提供的選擇更多。此外,Auth0還提供了passwordless登錄和biometrics登錄,這些無密碼身份認證方式提升了用戶賬戶的安全性,也為用戶省去了管理密碼的麻煩。
圖片
Auth0支持的企業登錄種類
圖片
Auth0支持的社交賬號登錄種類
用戶安全保障
除此之外,用戶還會關心自己的賬戶是否安全。Auth0和Cognito都提供了多種方式保障用戶安全,Auth0提供了Bot Detection,IP throttling, Brute-force Protection, Breached Password Detection和多重身份驗證(MFA),Cognito security提供了MFA和IP限制兩種方式。
MFA是除了登錄認證之外的另一種驗證身份并保障賬戶安全的措施,在涉及到身份驗證,特別是在進行支付,添加新設備,或者長時間不登錄賬戶等情況下驗證用戶的合法性更是十分重要。
Cognito MFA可以提供了SMS與one-time-password(OTP)兩種方式,可以選擇通過短信或是郵件驗證。Auth0 MFA提供了FIDO security keys, FIDO device biometrics, OTP, auth0 guardian, 短信,郵件,recovery code,DUO security等方式。相比之下,Auth0提供了更多高安全性和高可用性的驗證方式。
圖片
Auth0支持的MFA種類
用戶偏好
最后,在用戶偏好方面,Auth0提供了更方便的屬性定義方式。Auth0用戶屬性包括標準屬性,user_metadata和app_metadata。用戶可以在user_metadata內自定義各種屬性而不需要更改userpool屬性,例如基于metadata可以完成例如顯示偏好顏色,添加用戶昵稱等各種自定義屬性。在app_metadata中可以添加對系統產生影響的屬性,例如,如果想對特定用戶開啟MFA,就可以在這些用戶的app_metadata中添加MFA屬性,從而達到個體化定制的效果。
Cognito的用戶屬性包括標準屬性和自定義屬性,如果某一用戶需要添加某種新的自定義屬性,則需要創建新的userpool并在屬性中添加對應字段。并且由于cognito userpool不支持數據導出,因此只能通過trigger將已經存在于舊userpool的用戶在登錄時導入到新的之中,為用戶管理增添了麻煩。
開發者角度
從服務開發和維護者的角度,可以從以下幾個方面來比較兩個身份認證管理系統。
用戶管理
在用戶管理方面,用戶在授權應用程序訪問信息的過程中,可能會用不同的登錄方式進行登錄,例如使用同一個gmail郵箱進行google登錄,并用該郵箱進行用戶名密碼登錄,針對這種情況應該如何管理呢?
Auth0中,不同來源的用戶通過connection區分,例如通過social登錄,用戶名密碼登錄和passwordless登錄會被劃分為三種connection。不同connection可以理解為不同數據庫,同一個郵箱因注冊方式不同進入不同數據庫中,這些賬戶可以進行關聯。
在用戶登錄時,如果該郵箱在其他connection中存在另外的用戶,就會詢問用戶是否進行關聯,用戶在成功登錄另外賬號后,兩個賬號就能關聯起來,系統將視兩個賬號為同一用戶,這樣能方便用戶的使用和管理。Auth0提供了Auth0 Account Link官方插件完成賬戶關聯功能。同樣,在Cognito中通過外部登錄的用戶會被劃分到不同的group中,但沒有提供用戶關聯功能,需要使用者自己實現。
流程自定義
在實現登錄或注冊等流程中可能會遇到添加自定義功能的情況,比如針對部分用戶開啟MFA驗證,或者給用戶添加權限等,此時就會需要在特定階段執行自己的邏輯。在Cognito中這種功能稱為Trigger。Trigger的本質是lambda函數,可以通過event在身份認證的不同節點觸發自定義的lambda函數達到自定義用戶登錄,注冊,認證等流程的效果。因為是lambda函數,因此可以使用所有lambda支持的語言編寫。
Auth0添加自定義邏輯的方式有三種,Rules, Hooks和Actions,三者的實現方式都基于node.js,因此只能用js編寫。Rules和Hooks是初始版本, 現在更推薦使用Actions。它可以在用戶登錄,注冊,修改密碼等階段應用,并且還可以與外部庫集成提升可擴展性。在編寫邏輯時Auth0提供了模版方便自定義。另外它支持可視化的對不同邏輯的執行節點和順序進行調整。此外,Actions的每一次部署都會創建一個新的version, 如果新的version出現問題,可以迅速切換回舊version。
圖片
Auth0 Actions可視化編輯界面
系統監測
在系統維護中,監控對于保證一個系統可靠性和可用性以及監測系統性能方面有十分重要的作用。因為Cognito是AWS提供的服務,因此可以方便的和其他AWS服務連接,比如CloudTrail, CloudWatch等。Auth0監控方法包括logs和streams。Logs中記錄了tenant中所有行為的日志,包括對client的操作和用戶進行的操作等,可以通過filter篩選某一類型的logs。Streams可以將所有日志導出并在其他系統里進行進一步操作,例如可以與Amazon EventBridge,Datadog, Splunk,Sumo Logic等各種事件分析服務連接。另外,如果想查詢某一用戶的操作記錄,Auth0中可以在用戶的history中直接查詢。
數據遷移
另外,隨著不同供應商提供的產品發生變化,開發者可能會在不同產品間切換來滿足需求。這就要求身份認證管理系統能夠很好的支持客戶端信息遷移,數據導入導出等。Auth0支持Client Id和Client Secret導入,這樣即便是更換了平臺,也能保證客戶端不受影響正常使用。
用戶數據遷移方面,Cognito不支持用戶數據導出但Auth0支持,并且可以對密碼進行加密。在數據導入中,Cognito和Auth0都提供了外部數據庫導入的功能,Bulk migration指一次性將用戶數據全部導入到新服務的數據庫中,這可能會導致用戶需重新登錄。Lazy migration/ Automatic migration指的是用戶在登錄時將數據遷移到新系統中。兩者都可以通過bulk migration或lazy migration的方式導入用戶數據。
Auth0提供了插件幫助使用者進行數據導入導出,進行在導入數據時Auth0會對密碼進行加密。Auth0還支持session migration, 因此用戶在切換identity provider時不會感受到賬號被登出。此外,Auth0還提供了外部數據庫連接功能,即不使用Auth0提供的userpool,而是使用自己維護的數據庫作為userpool。這為數據導入導出和切換認證服務供應商帶來了很大的便捷。
圖片
Auth0 lazy migration流程圖
SDK支持
最后,在開發過程中,Cognito提供了Amplify SDK,它提供了兩種方式構建應用,一種是使用authentication UI components, 針對React, Vue, Angular和React Native都預置了UI組件。另一種是使用amplify的Auth進行sign up/sign in等身份驗證流程。
Auth0同樣提供了多種SDK,包括針對SPA、Web應用、API、移動端、Management API的ADK。并且針對不同語言和框架都有支持,例如Web應用的SDK包括Express, Java, Next.js, PHP, Python, Ruby等不同版本。此外Auth0有良好的社區支持,它提供了Auth0 Community供開發者交流,也有support team進行問題解答。
小結
綜上,在用戶體驗方面,Auth0擁有高度定制化的UI并提供了豐富的認證方式,各種無密碼登錄提高了用戶體驗和賬號安全性。
在開發者使用過程中,Auth0和Cognito都能完成基本功能的快速配置,但Auth0提供的功能和模版更多,在實現自定義邏輯方面更加快捷,同時在marketplace里提供了大量插件方便使用。而相比之下在Cognito中必須要自己實現,增加了開發時間。
此外,Auth0擁更為清晰的文檔,支持團隊反饋更加及時,新功能從提出到上線周期也更短。因此,如果僅需要基本的認證,Auth0和Cognito都能滿足需求,Cognito因較便宜的價格更勝一籌。但如果需要較好的用戶體驗或需要實現豐富的功能,則Auth0是更好的選擇。