您已创建了用户池和用于访问该用户池的客户端,现在让我们看看如何在应用程序中使用 Amazon Cognito。
您项目的 application/ 目录中有一个名为 auth.js 的文件。此文件中包含一些适用于您的应用程序的身份验证帮助程序。该文件有三个核心函数。让我们依次看一下。
第一个函数是 createCognitoUser,在 Amazon Cognito 中注册新用户时使用该函数。该函数如下所示:
const createCognitoUser = async (username, password, email) => {
const signUpParams = {
ClientId: process.env.COGNITO_CLIENT_ID,
Username: username,
Password: password,
UserAttributes: [
{
Name: 'email',
Value: email
}
]
}
await cognitoidentityserviceprovider.signUp(signUpParams).promise()
const confirmParams = {
UserPoolId: process.env.USER_POOL_ID,
Username: username
}
await cognitoidentityserviceprovider.adminConfirmSignUp(confirmParams).promise()
return {
username,
email
}
}
该函数使用您在前面步骤中设置的 Amazon Cognito 客户端 ID,以及用户提供的用户名、密码和电子邮件,来创建新用户。此外,您可以立即确认用户,以便用户可以登录。通常,您可以选择一个已验证用户的电子邮件和/或手机号码的确认流程,以便您获取用户的联系方式。这不在本教程范围内,您只需自动确认新用户即可。
第二个核心方法是 login 函数,当已注册的用户进行身份验证时使用该函数。代码如下所示:
const login = async (username, password) => {
const params = {
ClientId: process.env.COGNITO_CLIENT_ID,
UserPoolId: process.env.USER_POOL_ID,
AuthFlow: 'ADMIN_NO_SRP_AUTH',
AuthParameters: {
USERNAME: username,
PASSWORD: password
}
}
const { AuthenticationResult: { IdToken: idToken } }= await cognitoidentityserviceprovider.adminInitiateAuth(params).promise()
return idToken
}
像在 createCognitoUser 函数中一样,您可以使用客户端 ID 和给定的参数来调用 Amazon Cognito。如果传递了身份验证方法,Amazon Cognito 的 adminInitiateAuth 方法会对用户进行身份验证并返回令牌。您可以使用 ID 令牌进行身份验证,因此这就是您针对用户成功登录所返回的内容。
最后是 verifyToken 函数。此函数的内容如下:
const verifyToken = async (idToken) => {
function getKey(header, callback){
client.getSigningKey(header.kid, function(err, key) {
var signingKey = key.publicKey || key.rsaPublicKey;
callback(null, signingKey);
});
}
return new Promise((res, rej) => {
jwt.verify(idToken, getKey, {}, function(err, decoded) {
if (err) { rej(err) }
res(decoded)
})
})
}
此函数可验证已随请求传递的 ID 令牌。Amazon Cognito 提供的 ID 令牌是 JSON Web 令牌,并且 verifyToken 函数会确认该令牌是否已由您的可信来源签名并用于标识用户。此函数用于要求身份验证的终端节点,以确保发出请求的用户拥有访问权限。
在后续模块中,您将在后端应用程序中使用这三个身份验证函数。