Aws cognitor 用户注册 登录身份

利用AWS 提供的cognitor 实现web端移动端的用户 注册 激活 登录 以及后台进行JWT 与JWK 的身份验证匹配

用的Javascrip sdk 参考链接 http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/setting-up-the-javascript-sdk.html

在这个链接提供的SDK下载渠道里面下载需要的几个js文件


Aws cognitor 用户注册 登录身份
image.png
   <script src="/path/to/aws-cognito-sdk.min.js"></script>
    <script src="/path/to/amazon-cognito-identity.min.js"></script>
    <!-- optional: only if you use other AWS services -->
    <script src="/path/to/aws-sdk-2.6.10.js"></script>

然后就可以根据文档一步步进行实现了

用控制台为 JavaScript 应用程序创建用户池

Aws cognitor 用户注册 登录身份
image.png

下面是我创建好的用户池 信息

Aws cognitor 用户注册 登录身份
image.png

Clientid 信息

Aws cognitor 用户注册 登录身份
image.png

用户池创建好了 就创建一个联合身份 关联这个用户池

Aws cognitor 用户注册 登录身份
image.png

移动端跟WEB端所需要的环境 就配置好了

步骤 2:在应用程序中创建一个用户池对象(这意思是帮你刚才创建的用户池信息 获取到)

Aws cognitor 用户注册 登录身份
image.png
  • 具体代码:
AWSCognito.config.region = 'us-east-1';
      
        var poolData = {
            UserPoolId: 'us-east-1_QCvfU0mg1',
            ClientId:'7c6ckhcg4g83u815c9pv0ojc8f'
           // endpoint:'apigateway.us-east-1.amazonaws.com'
        };
        var userPool = new AWSCognito.CognitoIdentityServiceProvider.CognitoUserPool(poolData);
  
        var userData = {
            Username: 'apptest123x',
            Pool: userPool
        };

步骤 3:为应用程序注册用户

Aws cognitor 用户注册 登录身份
image.png
  • 实现代码:
  var userData = {
            Username: 'apptest123x',
            Pool: userPool
        };
 var dataEmail = {
            Name: 'email',
            Value: '[email protected]'
        };
 var attributeList = [];
var attributeuser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUserAttribute(userData);
var attributeEmail = new AWSCognito.CognitoIdentityServiceProvider.CognitoUserAttribute(dataEmail);
attributeList.push(attributeuser);
 attributeList.push(attributeEmail);
var cognitoUser;
userPool.signUp('apptest123x', 'Apptest123!', attributeList, null, function (err, result) {
            if (err) {
                console.log(err);
                alert(err);
                return;
            }
            console.log(result.user);
            cognitoUser = result.user;
            console.log('user name is ' + cognitoUser.getUsername());
        })

步骤 4:为应用程序确认用户 会收到邮箱验证COde 调用确认API

  • 未进行认真的状态
Aws cognitor 用户注册 登录身份
image.png
  • 邮箱收到的验证码
Aws cognitor 用户注册 登录身份
image.png
  • 实现代码
 cognitoUser.confirmRegistration("840985", true, function(err, result) {
                    if (err) {
                        alert(err);
                        return;
                    }
                    console.log('call result: ' + result);
                });

步骤 5:让用户登录应用程序

Aws cognitor 用户注册 登录身份
image.png
  • 代码实现

        var authenticationData = {
            Username : 'apptest123x', // your username here
            Password : 'Apptest123!' // 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) {
                console.log(err)
                //alert(err);
            },
            mfaRequired: function(codeDeliveryDetails) {
                var verificationCode = prompt('Please input verification code' ,'');
                cognitoUser.sendMFACode(verificationCode, this);
            }
        });
  • 获取到的JWTToken


    Aws cognitor 用户注册 登录身份
    image.png

登录调用AWS 的登录就可以获取到AccessToekn 的JWTToken 把这个JwtToekn 传给我们自己的服务端 根据对应的JWK 进行算法签名匹配

  • 后台获取到的JWK


    Aws cognitor 用户注册 登录身份
    image.png
  • 后台进行签名验证后的结果

{
    "sub": "18c7954d-7ee6-4586-a4d6-55f18f8c64d4",
    "event_id": "de2691d4-e560-11e7-a701-9951c60f2a98",
    "token_use": "access",
    "scope": "aws.cognito.signin.user.admin",
    "iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_QCvfU0mg1",
    "exp": 1513762586,
    "iat": 1513758986,
    "jti": "25143e7b-7705-4e99-9737-dcc7158ef0b9",
    "client_id": "7c6ckhcg4g83u815c9pv0ojc8f",
    "username": "apptest123x"
}
  • 主要字段的意思
根据JWT的标准,这些claims可以分为以下三种类型:
a. Reserved claims(保留),它的含义就像是编程语言的保留字一样,属于JWT标准里面规定的一些claim。JWT标准里面定好的claim有:

iss(Issuser):代表这个JWT的签发主体;

sub(Subject):代表这个JWT的主体,即它的所有人;

aud(Audience):代表这个JWT的接收对象;

exp(Expiration time):是一个时间戳,代表这个JWT的过期时间;


iat(Issued at):是一个时间戳,代表这个JWT的签发时间;

jti(JWT ID):是JWT的唯一标识。

;