IAM用户管理
Ref: AWS系列-创建 IAM 用户
Ref: AWS系列:深入了解IAM和访问控制
是什么?
IAM enables you to control who can do what in your AWS account.
在AWS里,一个IAM user和unix下的一个用户几乎等价。
干什么?
把握好IAM的精髓,需要深入了解policy,以及如何撰写policy。
前面我们看到,policy是用JSON来描述的,主要包含Statement,也就是这个policy拥有的权限的陈述,一言以蔽之,即:谁在什么条件下能对哪些资源的哪些操作进行处理。也就是所谓的撰写policy的PARCE原则:
-
- Principal:谁
- Action:哪些操作
- Resource:哪些资源
- Condition:什么条件
- Effect:怎么处理(Allow/Deny)
Cognito用户管理
注册、登录和访问控制
Ref: Aws cognitor 用户注册 登录身份 [用户池,联合身份]
Goto: 先读官方文档 [Amazon Cognito 文档]
Goto: 开发人员指南 [需仔细阅读]
Code: 邮箱登录,有实例
什么是 Amazon Cognito?
两个主要组件:
用户池,提供注册和登录选项的用户目录
身份池,提供 AWS 凭证以向用户授予对其他 AWS 服务的访问权限
一般是混合使用:
-
在第一步中,您的应用程序用户通过用户池登录,并在成功进行身份验证后收到持有者令牌。
-
接下来,您的应用程序通过身份池用用户池令牌交换 AWS 凭证。
-
最后,您的应用程序用户可以使用这些 AWS凭证来访问其他 AWS 服务 (如 Amazon S3 或 DynamoDB)。
-
常见 Amazon Cognito 场景
-
使用用户池进行身份验证
您可以允许您的用户使用用户池进行身份验证。
- 通过用户池直接登录,
- 通过第三方身份提供商 (IdP) 间接登录。
成功进行身份验证后,您的 Web 或移动应用程序将收到来自 Amazon Cognito 的持有者令牌。
-
- 您可以使用这些令牌检索允许您的应用程序访问其他 AWS 服务的 AWS 凭证,
- 也可以选择使用它们来控制对您自己的资源或 Amazon API Gateway 的访问。
-
使用用户池访问您自己的资源
您可以允许您的用户使用来自成功的身份验证的用户池令牌访问您自己的资源。
有关更多信息,请参阅 用户池身份验证流程 和 将令牌与用户池结合使用。
Amazon Cognito 用户池
初步理解
先决条件:注册 AWS 账户
用户池创建用户目录
步骤 2.添加应用程序以启用托管 Web UI (可选)
* 应用程序客户端
[获取应用程序客户端 ID]
* 应用程序客户端设置
(1) 登录 URL 和注销 URL
一个回调 URL,供 Amazon Cognito 授权服务器在用户通过身份验证之后进行调用。
对于 Web 应用程序,该 URL 应以 https:// 开头,如 https://www.example.com。
(2) OAuth2.0
选项一:选择授权代码授予以返回随后与用户池令牌交换的授权代码。
由于令牌绝不会直接向最终用户公开,因此它们不太可能被泄露。
但是,后端需要自定义应用程序以将授权代码换成用户池令牌。
出于安全原因,强烈建议您将授权代码授予流程与代码交换的证明密钥 (PKCE) 一起用于移动应用程序。
选项二:在允许的 OAuth 流程下,选择隐式授予以便从 Amazon Cognito 将用户池 JSON Web Token (JWT) 返回给您。
当没有可用于将授权代码换成令牌的后端时,您可以使用此流程。它对于调试令牌也很有帮助。
选项一加二:您可以同时启用授权代码授予和隐式代码授予,然后按需使用每个授予。
除非您希望明确地排除一个允许的 OAuth 范围,否则请选中所有“允许的 OAuth 范围”的复选框。
选项三:只有在您的应用程序需要代表自己而不是代表用户请求访问令牌时才选择 Client credentials。
* 添加域名
在域名页面上,键入可用的域前缀。并记下完整的域地址。
|
https:// |
.auth.ap-southeast-2.amazoncognito.com |
步骤 3.向用户池添加社交登录 (可选)
步骤 4.将使用 SAML 身份提供商的登录添加到用户池 (可选)
比如,公司(idp)的用户要访问SAAS 应用(sp)
步骤 5.安装 Amazon Cognito 用户池 开发工具包
Amazon Cognito 身份开发工具包是核心用户池库。
安装它以便与 Amazon Cognito 用户池 API 中的用户管理和身份验证功能交互。
Amazon Cognito 验证开发工具包利用了内置的托管 UI 网页。
安装它以出于以下目的将网页添加到您的应用程序:注册、登录、确认、多重验证 (MFA) 和注销。
具体实践
- 服务器配置
步骤1, 获得 用户池 ID 和 客户端 ID
步骤2, 在应用程序中创建一个用户池对象
AWSCognito.config.region = 'us-east-1'; var poolData = { UserPoolId : '...', // your user pool id here ClientId : '...' // your app client id here };
var userPool = new AWSCognito.CognitoIdentityServiceProvider.CognitoUserPool(poolData); var userData = { Username : '...', // your username here Pool : userPool };
- 用户注册
注册用户
var attributeList = [];
// 01 var dataEmail = { Name : 'email', Value : '...' // your email here };
var dataPhoneNumber = { Name : 'phone_number', Value : '...' // your phone number here with +country code and no delimiters in front };
// 02 var attributeEmail = new AWSCognito.CognitoIdentityServiceProvider.CognitoUserAttribute(dataEmail); var attributePhoneNumber = new AWSCognito.CognitoIdentityServiceProvider.CognitoUserAttribute(dataPhoneNumber);
// 03 attributeList.push(attributeEmail); attributeList.push(attributePhoneNumber); var cognitoUser; userPool.signUp('username', 'password', attributeList, null, function(err, result){ if (err) { alert(err); return; } cognitoUser = result.user; console.log('user name is ' + cognitoUser.getUsername()); });
步骤 4:为应用程序确认用户
cognitoUser.confirmRegistration('123456', true, function(err, result) { // 根据用户收到的代码来confirm if (err) { alert(err); return; } console.log('call result: ' + result); });
- 用户登录
登录应用程序
已确认的用户登录以获取会话。该会话包含以下内容:
一个包含用户声明的 ID 令牌;
一个访问令牌,在内部用于执行经过身份验证的调用;
一个刷新令牌,在内部使用,用于在会话过期后按每小时一次的频率刷新会话。
var authenticationData = { Username : '...', // your username here Password : '...', // your password here }; var authenticationDetails = new AWSCognito.CognitoIdentityServiceProvider.AuthenticationDetails(authenticationData); var cognitoUser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUser(userData); cognitoUser.authenticateUser(authenticationDetails, { onSuccess: function (result) { console.log('access token + ' + result.getAccessToken().getJwtToken()); }, onFailure: function(err) { alert(err); },
/* 必须传递收到的验证代码,然后用户才能登录(暂时没必要) */ mfaRequired: function(codeDeliveryDetails) { //如果登录需要 MFA,则调用此函数 var verificationCode = prompt('Please input verification code' ,''); cognitoUser.sendMFACode(verificationCode, this); // 且必须在cognitoUser对象上调用sendMFACode} });
关于MFA from 链接
Multi-Factor Authentication (MFA) 是一种简单有效的最佳安全实践方法,它能够在用户名和密码之外再额外增加一层安全保护。
启用 MFA 后,用户登录阿里云网站时,系统将要求输入用户名和密码(第一安全要素),然后要求输入来自其 MFA 设备的动态验证码(第二安全要素),双因素的安全认证将为您的账户提供更高的安全保护
MFA 设备可以基于硬件也可以基于软件,目前阿里云官网支持基于软件的虚拟 MFA。
- 找回密码
步骤 6:获取用户详细信息
有很多,其中“找回密码”最为重要,实现如下。
cognitoUser.forgotPassword({ onSuccess: function (result) { console.log('call result: ' + result); }, onFailure: function(err) { alert(err); }, inputVerificationCode() { var verificationCode = prompt('Please input verification code ' ,''); var newPassword = prompt('Enter new password ' ,''); cognitoUser.confirmPassword(verificationCode, newPassword, this); } });
访问 AWS 资源的凭证
AWS.config.credentials = new AWS.CognitoIdentityCredentials({ IdentityPoolId: 'us-east-1:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', Logins: { 'cognito-idp.us-east-1.amazonaws.com/us-east-1_XXXXXXXXX': result.getIdToken().getJwtToken() } }); AWS.config.credentials.get(function(err){ if (err) { alert(err); } });
Register/Login implement
预热的几个链接
(1) Ref:https://github.com/dbroadhurst/aws-cognito-react
The AWS guide can be found here
You can find a working example here
(2) Ref: https://github.com/AravindNico/AwsCognitoUserLogin/blob/master/AWS%20COGNITO.pdf
Without react, pure html solution.
(3) Ref:
NOTE: AWS have now released AWS Amplify, which might be more suitable for your needs than react-cognito.
(4) Ref:
为什么要使用cognito?
Goto: React & Redux 实现注册登录认证系统
可见,自己实现登录以及用户管理是有多么复杂。
正式开学
Ref:
A declarative JavaScript library for application development using cloud services.
Features / APIs
- Authentication: APIs and building blocks for developers who want to create user authentication experiences.
- Analytics: Easily collect analytics data for you app. Analytics data includes user sessions and other custom events that you want to track in your app.
- API: Provides a simple solution when making HTTP requests. It provides an automatic, lightweight signing process which complies with AWS Signature Version 4.
- GraphQL Client: Interact with your GraphQL server or AWS AppSync API with an easy to use & configure GraphQL client.
- Storage: Provides a simple mechanism for managing user content for your app in public, protected or private storage buckets.
- Push Notifications: Allows you to integrate push notifications in your app with Amazon Pinpoint targeting and campaign management support.
- PubSub: Provides connectivity with cloud-based message-oriented middleware.
- Internationalization: A lightweight internationalization solution.
- Cache: Provides a generic LRU cache for JavaScript developers to store data with priority and expiration settings.
See our Analytics Developer Guide for detailed information.
Add Authentication to your App
Add user sign up and sign in using two of the many methods available to the Auth class:
import { Auth } from 'aws-amplify';
Auth.signUp({
username: 'AmandaB',
password: 'MyCoolPassword1!',
attributes: {
email: 'someemail@example.com'
}
});
Auth.signIn(username, password)
.then(success => console.log('successful sign in!'))
.catch(err => console.log(err));
See our Authentication Developer Guide for detailed information.
React
Adding authentication to your React or React Native app is as easy as wrapping your app's main component with our withAuthenticator higher order component. AWS Amplify will provide you customizable UI for common use cases such as user registration and login.
import { withAuthenticator } from 'aws-amplify-react-native';
export default withAuthenticator(App);
以上只是个超级库的开源代码,我们需要的是如何使用这个库。
也就是,如何使用这个库的例子。
A React/Redux web application that implements a custom UI for Cognito Userpool Auth using AWS Amplify.
效果完美,值得研究。
[AWS Amplify]
Ref: https://github.com/dbroadhurst/aws-cognito-react
此文值得一读:聊一聊 redux 异步流之 redux-saga
[AWS Cognito Redux Saga]
Ref: https://github.com/ganezasan/react-cognito-auth
Ref: https://github.com/GregoryBabonaux/react-cognito-auth
登录界面不错,但功能缺失,只供参考。
Access Token
eyJraWQiOiJvQ1J4RWFRVG5CQzR0WHY3b0NEekQrWHFyOXVCeVJwK25vczFWbjVGdzlRPSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiI1ZWIzOWY0MC0xNDY4LTQyYjgtODAxMS03MGE1MTg2NWIzZDUiLCJldmVudF9pZCI6ImE5Y2MyNWEzLTVjYmUtMTFlOC1hNzRjLTVmN2I0MjA3OTNkNiIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4iLCJhdXRoX3RpbWUiOjE1MjY4ODM0NTksImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC51cy1lYXN0LTEuYW1hem9uYXdzLmNvbVwvdXMtZWFzdC0xX0VFdFhjTzJQViIsImV4cCI6MTUyNjg4NzA1OSwiaWF0IjoxNTI2ODgzNDYwLCJqdGkiOiJhODFkMTJiZi05NTBkLTQyNjMtYWU4Yy1lNGMyMTUxNjE0N2YiLCJjbGllbnRfaWQiOiI3OWMyaWVvOHVic2liY3FuN21zazE5ZWE4OSIsInVzZXJuYW1lIjoiamVzc2UuaGFvMTIzQGdtYWlsLmNvbSJ9.IsC-Ht33NdMp_1Hp2PyBXhZ6iyG5hoHBu0J1rBVPf8_vK0h7UtkL9U4J9emOpC0C2zHUkPVDoanbIcxGOx1IywdtDf6EYjbMNhMibxvH9ND-YVrM02fmmrIGI4kca6ZDmgE-akN3mqrATvtx7dXiJH_H5BD7V993ToyjiHJdJtuqGK_WrFqudEp_JkG2EXyRS5NF5rt9VH8Fe5caPI-j0y2OF_ZO2BMtlDm6tssAN1yBJbT50-e37up-eNUIcL0RQgILA4ksEwtrA-PtgLdR0D5wSRSBBWgAtFssDSCB8dtJRFhd2WI1GwYirBwVmbshgHOHfyZOHbBtRmus-Lnyiw
ID Token
eyJraWQiOiIzcXJ6R2hhMHVQTDNHQ0FIcDJSNXVqSStJM0FiVThQTnA4ZmJlM0VJWEdBPSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiI1ZWIzOWY0MC0xNDY4LTQyYjgtODAxMS03MGE1MTg2NWIzZDUiLCJhdWQiOiI3OWMyaWVvOHVic2liY3FuN21zazE5ZWE4OSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJldmVudF9pZCI6ImE5Y2MyNWEzLTVjYmUtMTFlOC1hNzRjLTVmN2I0MjA3OTNkNiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNTI2ODgzNDU5LCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAudXMtZWFzdC0xLmFtYXpvbmF3cy5jb21cL3VzLWVhc3QtMV9FRXRYY08yUFYiLCJjb2duaXRvOnVzZXJuYW1lIjoiamVzc2UuaGFvMTIzQGdtYWlsLmNvbSIsImV4cCI6MTUyNjg4NzA1OSwiaWF0IjoxNTI2ODgzNDYwLCJlbWFpbCI6Implc3NlLmhhbzEyM0BnbWFpbC5jb20ifQ.PnMKwH5dikcWM_bWObXYcJwnIZBl7K5Pa2KZAWbqwdgkPC5eY95aVOBUL1VcOSBGw3WY9Rb5D4IH4Cj1IhUndAllrOPHPffJzfYOFkux3m2AKpIv2_qf35Pw9n_1yP377YkkQdx0sLl1C18WBvAHtOQqS25s4scCTLs8XiLNl_IscmB2NCJC6_6-lkYqu-R0ZFhw-xcPoK4103RtnZgtMvZyZqWi7fz_yyqKiKKdL6gc8j_IzqCxvYzsYDg1nM_OiUGTSwj8P-Xe68XR5u_GDT46yubMHhy43Fa7qOdpPVs5nEiX558FiB7sgabCKmtephlI1-UoHSWK9c_ydiooqg
Refresh Token
eyJjdHkiOiJKV1QiLCJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiUlNBLU9BRVAifQ.R2ciWizVvS1cjKa-O8yib3YfDOVGJ_KPRCv2Q2V-fLGfs_Aua9rYrEUUNK3r1K2O7S5LME3gckLJJRwmhV0jwW53nhMpXy0QaxUqRtVk7fgzFIVJzU0XEBYAXef7Qtn-ZWwymtsLelO_BTjzz8u9XCgjgJferroelsa77lWw6xnPefLnv-HE7x2GLMnbv3QPl38LDRVVIJ66NVkTgnRE_AkgAf4x2E7WtF99ZghV5_tQEzacpZwYltjQN1koljd8rKb95f64VczYS3nIUj4XMgZLaYeQpkP9MlfVtxgE6hupDr6pk2qWQlA7UOHohKfX-lpX5Ny0P3w388nPAkmJOg.6CKOk0I9Ty10rxwf.MzPiwbRuij1y83qrjXSVW5_LgVxtIdtGX3WibgvY7ACp3mS1IZKaqZmGYcAIPR-BArnT4hYYnAym-D1gXInmafEuj9bSZXlWODe72Oae_6LVu0hoCdDOEJOkNsgAERP5tSOkkL8Vv18PADV8jV3HXFk-jvBaSNxY8nEjHyIMkWo-CmRhUzTmOQ79xU7ZK683C81ZdO5dt6wMw3cdd5iuE8DA9huGqUkLMnTYUUVwQSwkelXuDhi0IReirCdfabdBZu9EfPsR38PI3Pl0MY469aO2Fb6tmcQzEdOF_OurATQUMMFL1vcOWkgFW8aLJjJSNuby943iwZZZNOMvPLE4i6DIYh6Xxh3bkjLj2NPCBmODFGLfzbfDYtJ-dtOZ-3dBPst1bBLOru0TNFAR_kNnc1yg-JMXmigo3beS-wP40UiFWEN3BPORcv_KaNWaIi0x5yqvhWtkA4W9Ub_OykLxOWKgiHikjXq4Os_huyDzrVuNvmCp3g0GalT4wMa6YETK21rxVCddDUCFjtJl-_XRP9E1MxSfOQAV9-kpRYTEHD3AWxPNWHwqVtDSEkNHwC2gbq87uIZ7XW0hnpI2n5w7vtIcaxrdwDkCOI8qxSNccaJWnqtZYD61K7Kqc7-aWItOCo5lIZo0gVocrAzG9WGZLA3g2olYCHjsStE-f4fDv5uOCTcifE5ib5LJgwGmyjc0VNusELG2920DkSDVeF4jIr8NlaG4MvXIg-Cfwg_VcZgm6yMIqMFt5lDk3jigQIggJFJFzRVgFBb5oarFMKejTLNpZcLqBltchcY4VYQxqdLtj8oNdD85FmOK6VIKrdaWTqie861XsEctUB9-BPvhdabx039dqZuCChy62V9wNtugDS9x_XvR2Pm0xRZdBG3D4xHaDKPZ4CchZSnmufKpeH1VQHulKzA53d7LbDjOgUOVgkDEkICmYar8QWkcV7i1Q9y-HBwkJmEPWD6IjFkjkNDr0EDAqkoyVs_nD6cnVFi6lA6jVqbLb7TYxB0RMydaWBK7D3W4hspIQARLx_9D1o7GJklbw5ADxSJRMIsbezwvRhMIFrCTCTZCQYlha4DmIhZVLDSzUydK8AH1QFoCJjemSU7mB5y_h26eIjCbE8TvnTa4L80FJw-pKCcTT5eYFyJPJOnSKk3u6LHv3mU2IDnZAnrHDVg2HIKe1MLzYWFXcPjt3KgMwQQWDuLUyAFDU6bTlFbVT2vPPkjKEyqs6niAsFuDBDl2ci7tSl8R2Jb0ny6qF56YoKxIbmv6UDT_sfGOt3lyMRvXDDxhMRwY94oViOimuOZp9lNj4Q.v85uUCWjQZMiT7CZrDB_mg