Amazon Cognito 是一个提供提供身份验证、授权和用户管理的服务,可以用于Web 和移动应用程序的用户管理。
Amazon Cognito 的两个主要组件是用户池和身份池。
用户池提供了注册和登录功能。利用用户池,用户可以通过 Amazon Cognito 登录您的 Web 或移动应用程序,也可以通过第三方身份提供商(IdP)进行登录。
使用身份池,可以授予用户访问其他 AWS 服务的权限。
我们来看看以下常见 Amazon Cognito 场景图。在此场景中,目标是验证用户身份,然后授予用户对其他AWS服务的访问权限。
在第一步中,应用程序用户通过用户池登录,并在成功进行身份验证后收到用户池令牌。
接下来,应用程序通过身份池将用户池令牌换成AWS凭证。
最后,应用程序用户可以使用这些AWS凭证访问其他AWS服务(如 Amazon S3 或 DynamoDB)。
注册和登录服务。
用于登录用户的内置的、可自定义的 Web UI。
使用 Facebook、Google、Login with Amazon 和 Sign in with Apple 的社交登录,以及通过您的用户池中的 SAML 和 OIDC 身份提供商的登录。
用户目录管理和用户配置文件。
多重身份验证(MFA)、遭盗用凭证检查、账户盗用保护以及电话和电子邮件验证等安全功能。
通过 AWS Lambda 触发器进行的自定义工作流程和用户迁移。
借助身份池,您的用户可以获取临时AWS凭证来访问AWS服务,如 Amazon S3 和 DynamoDB。身份池支持匿名访客用户以及可用来验证身份池用户的身份的以下身份提供商:
Amazon Cognito user pools
使用 Facebook、Google、Login with Amazon 和 Sign in with Apple 的社交登录
OpenID Connect (OIDC) 提供商
SAML 身份提供商
已经过开发人员验证的身份
适用于多个独立的网站拥有相同的父域名。比如:
https://blog.jessica.com.cn
https://mall.jessica.com.cn
用户首次访问网站时会重定向到Cognito登录页面
输入用户名密码后,由Cognito验证完成后,重定向到service登录页面,并将code作为request parameter返回
service利用code获取accessToken,将accessToken设置到cookie中,cookie domain设置为父域名
用户再次访问网站时会携带accessToken cookie,service对accessToken cookie进行解析验证,验证通过则放行
用户访问其他子域名也会携带父域名的cookie,因此也会带上accessToken cookie, 无需再次登录
清除cookie
登出Cognito
适用于多个独立的网站拥有完全不同的域名。比如:
https://blog.jessica.com.cn
https://mall.wind.com.cn
跨域带来的问题就是cookie不同共享,如果套用同域的登录流程,service1登录之后,cookie只设置到了service1的domain,访问service2的页面时,由于无法带上service1 domain的cookie,所以service2还需登录
解决方案就是利用一个额外的SSO Service作为跳转
用户首次访问网站时会重定向到SSO Site的登录页面,由SSO Site登录页面重定向到Cognito登录页面
输入用户名密码后,由Cognito验证完成后,重定向到SSO Site Authorize页面,SSO Site 利用code获取accessToken, 然后用自己的domain将accessToken设置到cookie中,最后重定向到Service Authorize页面, 重定向时将accessToken作为request parameter传递给Service
service接收到accessToken之后,用自己的domain将accessToken设置到cookie中,并重定向到home页面
用户再次访问网站时会携带accessToken cookie,service对accessToken cookie进行解析验证,验证通过则放行
用户访问其他域名的网站时,首先会重定向到SSO Site的登录页面,由于SSO Site已经包含了accessToken cookie, 因此无需重定向到Cognito登录页面,只需要重定向到Service Authorize页面, 重定向时将cookie 中的accessToken作为request parameter传递给Service 即可
service1登出之后,只清除了service1和sso service的cookie,service2的cookie仍在,因此service2还能继续访问。Cogntio只支持refreshToken的revoke,所以如果service2的accessToken是仍然有效。
Cognito登录成功后跳转用到的callback url只能设置为固定值,因此无法实现每次登录跳转到用户访问的页面,只能固定跳转到某个具体页面。
https://github.com/JessicaWin/aws-in-action/tree/master/cognito-sso