【以下内容来自于我同事。】
Oauth2.0是允许客户端代表用户访问其他服务上的托管资源的标准。Auth0和AWS提供的Cognito都是知名的身份认证平台,两者均是基于oauth2.0协议构建的基于云的身份管理服务,但它们到底有什么不一样的地方呢,本文将就两个平台中常用的概念进行对比。
Authorization Server
Oauth2.0中的授权服务器(Authorization Server)指的是对资源所有者进行身份验证,并在授权后发放访问令牌的服务器。Cognito userpool与Auth0 tenant都是能为用户提供身份认证的服务。它们为用户提供登录,注册,通过社交账户或SAML登录以及多因子验证(MFA)等功能,拥有友好的UI界面,并且能够管理用户身份数据,定制用户认证流程。同一userpool或tenant下的所有客户端共享domain、UI和email模版,不同userpool或tenant之间用户不能共享。由于Cognito是AWS提供的服务,因此可以方便的和AWS的其他服务交互。
Client
Oauth2.0 中的客户端(client)是用来访问受限资源的系统,在Web应用中,客户端需要使用code,client id和client secret换取恰当的token访问资源。 在Cognito中允许创建多个client,但目前没有secret rotate功能,一旦生成client id和secret即固定, 因此一旦client secret泄漏,这个client将不能使用。Auth0中将client称为application,除了可以自己生成外还可以导入外部client id和secret。此外还可以设定secret rotate,application metadata,基于application自定义授权模式等功能。
Authorize
在授权流程中,用户需要通过登录进行身份验证或通过同意页面同意授权。 在登录方面,Cognito提供的登录方式有用户名和密码登录,利用社交账号登录以及企业登录。Social登录方式包括Google,Apple,Facebook与Amazon。企业登录方式包括SAML,OIDC,GSuite。在此基础上,Auth0提供了52种social登录方式,在企业登录方面还提供了Google workspace, Azure, Ping, ADFS, LDAP等方式,因此在利用社交账号登录和企业登录方面在Auth0配置更加方便。
Hooks
如果想要在登录或注册等流程中添加自定义的流程,比如针对部分用户开启MFA验证,或者给用户添加权限等,就会用到Hooks在特定阶段执行自己的逻辑。 在Cognito中这种功能称为Trigger。Trigger的本质是lambda函数,可以通过event在身份认证的不同节点触发自定义的lambda函数达到自定义用户登录,注册,认证等流程的效果。因为是lambda函数,因此可以使用所有lambda支持的语言编写。
Auth0添加自定义逻辑的方式有三种,Rules, Hooks和Actions,三种方式都基于node.js,因此只能用js编写。Rules和Hooks是初始版本, 现在更推荐使用Actions。它可以在用户登录,注册,修改密码等阶段应用,并且还可以与外部库集成提升可扩展性。另外Auth0支持可视化界面,方便对不同逻辑的执行节点和顺序进行调整。此外,Auth0提供了各种模版方便迅速自定义逻辑。
User management
用户在授权应用程序访问信息的过程中,可能会用不同的登录方式进行登录,例如使用同一个gmail邮箱进行google登录,并用该邮箱使用用户名密码登录,针对这种情况应该如何管理呢?在Auth0中,不同来源的用户通过connection区分,例如通过social登录,通过用户名密码登录和passwordless登录会被划分为三种connection。不同connection可以理解为不同数据库,同一个邮箱因注册方式不同进入不同数据库中,这些不同账户可以进行连接。在用户登录时,如果存在同一邮箱不同connection的账号,就会要求用户关联,用户在成功登录另一账号后,两个账号就能关联起来,方便用户的使用和管理。同样,在Cognito中通过social登录的用户会被划分到不同的group中,但没有提供用户关联功能,需要使用者自己实现。
用户权限管理方面,Cognito userpool使用group创建用户集合,通过不同集合表明用户来源和管理权限。Auth0中使用roles完成上述功能,可以通过Actions为用户添加roles。
User Attributes
Cognito的用户属性包括标准属性和自定义属性,如果某一用户需要添加某种新的自定义属性,则需要在userpool的属性中添加对应字段,这种更改是userpool层面的,意味着每一个用户都会拥有这种属性。Auth0用户属性包括标准属性,user_metadata和app_metadata。用户可以在user_metadata内自定义各种属性而不需要更改userpool属性,例如基于metadata可以完成例如显示偏好颜色,添加用户昵称等各种自定义属性。在app_metadata中可以添加对系统产生影响的属性,例如,如果想对特定用户开启MFA,就可以在这些用户的app_metadata中添加MFA属性,从而达到针对个体定制MFA的效果。
User Migration
在系统集成的过程中,很可能会遇到将之前系统的用户数据导入到新系统的情况。Bulk migration指一次性将用户数据全部导入到新服务的数据库中,这可能会导致用户需重新登录。Lazy migration指的是用户在登录时将数据迁移到新系统中。Cognito和Auth0都提供了外部数据库导入的功能,两者都可以通过bulk migration或lazy migration的方式导入用户数据。此外,在导入数据时Auth0会对密码进行加密。Auth0还支持session migration, 因此用户在切换identity provider时不会感受到账号被登出。
Security
Auth0和Cognito都提供了多种方式保障用户安全,Auth0提供了机器人检测,IP throttling, brute force protection, breached password protection和MFA的方法。Cognito security提供了MFA和IP限制两种方式。 MFA是除了常规登录之外的另一种验证身份并保障账户安全的方式,在涉及到身份验证,特别是在进行支付,添加新设备,或者长时间不登录账户等情况下验证用户的合法性更是十分重要。Cognito MFA可以采取SMS与one-time-password两种方式验证,Auth0 MFA提供了FIDO security keys, FIDO device biometrics, OTP, auth0 guardian, 短信,邮件,recovery code,DUO security等方式。两者可以通过Trigger/Actions的方式自定义何种情况下进行MFA。
Monitoring
监控对于保证一个系统可靠性和可用性以及监测系统性能方面有十分重要的作用。 因为Cognito是AWS提供的服务,因此可以方便的和其他AWS服务连接,比如CloudTrail, CloudWatch等。 Auth0监控方法包括logs和streams。Logs中记录了tenant中所有行为的日志,包括对client的操作和用户进行的操作等,可以通过filter筛选某一类型的logs。Streams可以将所有日志导出并在其他系统里进行进一步操作,例如可以与Amazon EventBridge,Datadog, Splunk,Sumo Logic等各种事件分析服务连接。另外,如果想查询某一用户的操作记录,Auth0中可以在用户的history中直接查询。
UI
在实现用户登录的过程中,往往需要根据需求自行定制登录界面,例如添加公司logo,定义界面颜色样式等。 在这方面,Cognito和Auth0都提供了基于不同client定制UI的功能。Cognito的UI定制功能自定义范围有限,只能替换颜色,logo样式,按钮和输入框样式。Auth0的可定制范围广,在universal login功能中可以定制sign in/sign up,forgot password, MFA界面的颜色,字体,logo,排列方式等。在此基础上如果有其他定制化的需求,auth0还基于lock和auth0.js SDK提供了三种模版:Lock, Lock(passwordless)和Custom login form方便进行自定义。
SDK
Amplify是Cognito的SDK,它提供了两种方式构建应用,一种是使用authentication UI components, 针对React, Vue, Angular和React Native都预置了UI组件。例如在React中可以使用withAuthenticator这个HoC组件。另一种是使用amplify的Auth进行sign up/sign in等身份验证流程。Auth0同样提供了多种SDK,包括针对SPA、Web应用、API、移动端、Management API的ADK。并且针对不同语言和框架都有支持,例如Web应用的SDK包括Express, Java, Next.js, PHP, Python, Ruby等不同版本。
SMS & Email
在用户进行身份验证的流程中会出现发送email提示用户注册成功,或通过短信发送MFA验证码等步骤。Cognito和Auth0都可以自定义短信模版和邮件模版。Cognito可以使用其自带的邮箱功能发送或者使用SES发送,短信需使用SMS发送。Auth0除了可以使用其提供的邮件发送功能外,还可以使用Mandrill, SES, Sendgrid等多种邮件提供商完成发送功能,发送短信方面支持Twilio或者在Actions中配置自己所需要的短信提供商。
Deployment
在对Cognito userpool或Auth0 tenant进行配置的过程中,我们希望infrastructure as code,避免手动配置的情况。像其他AWS服务一样,Cognito使用cloudformation部署。Auth0则使用其提供的deployment cli部署,它支持两种格式,yaml和json。
Reference
Oauth 2.0
Auth0 Docs
Cognito Docs
Cognito SDK
Auth0 SDK Libraries
Jiayao Sun