利用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文件
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 应用程序创建用户池
image.png下面是我创建好的用户池 信息
image.pngClientid 信息
image.png用户池创建好了 就创建一个联合身份 关联这个用户池
image.png移动端跟WEB端所需要的环境 就配置好了
步骤 2:在应用程序中创建一个用户池对象(这意思是帮你刚才创建的用户池信息 获取到)
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:为应用程序注册用户
image.png- 实现代码:
var userData = {
Username: 'apptest123x',
Pool: userPool
};
var dataEmail = {
Name: 'email',
Value: '158291434@qq.com'
};
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
- 未进行认真的状态
- 邮箱收到的验证码
- 实现代码
cognitoUser.confirmRegistration("840985", true, function(err, result) {
if (err) {
alert(err);
return;
}
console.log('call result: ' + result);
});
步骤 5:让用户登录应用程序
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
image.png
登录调用AWS 的登录就可以获取到AccessToekn 的JWTToken 把这个JwtToekn 传给我们自己的服务端 根据对应的JWK 进行算法签名匹配
-
后台获取到的JWK
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的唯一标识。
网友评论