پیاده سازی ورود بدون رمز عبور با آمازون Cognito

مقدمه
من از معرفی و توضیح اینکه Cognito چیست و چرا مفید است صرف نظر می کنم—فکر می کنم دلیلی برای خواندن این مطلب دارید.
من از Node.js با AWS SDK V3 برای قطعههای کد استفاده میکنم، اما زبان آن مهم نیست—شما باید به راحتی معادلهایی را در سایر SDKها پیدا کنید.
لطفاً توجه داشته باشید که این یک راه حل آماده برای استفاده نیست که بتوانید آن را در برنامه خود کپی کنید. در عوض، آن را به عنوان مجموعهای از بلوکهای ساختمانی در نظر بگیرید که میتوانید از آنها برای طراحی یک جریان احراز هویت که نیازهای خاص شما را برآورده میکند، استفاده کنید.
این پست بر اساس آخرین بهروزرسانیهای Cognito (از حدود نوامبر 2024) است که دیگر نیازی به اجرای چالشهای سفارشی ندارد. بنابراین، بیایید شروع کنیم!
استخر کاربر را راه اندازی کنید
اولین چیزی که نیاز دارید یک مجموعه کاربری است. تنظیم ورود بدون رمز عبور بسیار ساده است. در نمای کلی استخر، باید کاشی مشابه تصویر زیر را ببینید:
سپس، به پیکربندی برای ورود به سیستم مبتنی بر انتخاب بروید:
رمز عبور یکبار مصرف (OTP) را با انتخاب کادر مناسب فعال کنید:
برای استفاده اولیه (شاید برای اهداف ارزیابی)، به سادگی انتخاب کنید ارسال ایمیل با Cognito و کلیک کنید ذخیره تغییرات:
برای موارد استفاده پیشرفته تر، راه اندازی آمازون SES مورد نیاز است. اما در این پست به این موضوع پرداخته نخواهد شد.
sdk را راه اندازی کنید
ما نیاز داریم aws-sdk کتابخانه برای تعامل با خدمات AWS:npm install @aws-sdk/client-cognito-identity-provider --save
پس از دانلود SDK، کلاینت را راه اندازی کنید. قطعه زیر شامل تمام واردات استفاده شده در این پست است:
import {
CognitoIdentityProviderClient,
InitiateAuthCommand,
RespondToAuthChallengeCommand,
AdminGetUserCommand,
AdminCreateUserCommand
} from "@aws-sdk/client-cognito-identity-provider";
const client = new CognitoIdentityProviderClient({region: "eu-north-1"});
بررسی وجود کاربر
آموختن فقط برای کاربرانی که در استخر وجود دارند ایمیل می فرستد. بنابراین، ابتدا باید بررسی کنیم که آیا این مورد وجود دارد یا خیر. نیازی به تأیید محتویات پاسخ نیست، زیرا تماس یک استثنا برای یک کاربر غیر موجود ایجاد می کند:
async function isExistingUser(username) {
try {
const getUserCommand = new AdminGetUserCommand({Username: username, UserPoolId: USER_POOL_ID})
const getUserResponse = await client.send(getUserCommand);
return true;
} catch (err) {
if (err.name === "UserNotFoundException") {
return false;
} else {
console.error("Unexpected error when verifying existence of user", err)
throw err;
}
}
}
بسته به نیاز شما، ممکن است بخواهید کاربر را به فرآیند ثبت نام اختصاصی هدایت کنید که منجر به ایجاد حساب می شود و بعداً ادامه دهید. در مورد من، ایجاد یک کاربر جدید به سادگی کافی بود:
const createUserCommand = new AdminCreateUserCommand({
Username: username,
UserPoolId: USER_POOL_ID,
MessageAction: "SUPPRESS"
})
const userCreateResponse = await client.send(createUserCommand);
به ارزش ویژگی MessageAction توجه کنید. بهطور پیشفرض، Cognito بهطور خودکار جریان تأیید کاربر را آغاز میکند و در نتیجه پیام خوشآمدگویی برای کاربر ارسال میشود. من این را نمی خواستم، بنابراین تصمیم گرفتم آن را سرکوب کنم.
ایمیل را راه اندازی کنید
در این دمو کاربر یک کد تایید از طریق ایمیل دریافت می کند که باید به صورت دستی کپی شده و در اپلیکیشن وارد شود. اگر میخواهید پیوندی اضافه کنید که مثلاً یک برنامه تلفن همراه میتواند به طور خودکار باز شود و آن را مدیریت کند، باید راهاندازی کنید. SES، که از حوصله این پست خارج است.
const initAuthCommand = new InitiateAuthCommand({
AuthFlow: "USER_AUTH",
ClientId: CLIENT_ID,
AuthParameters: {"USERNAME": username, "PREFERRED_CHALLENGE": "EMAIL_OTP"},
})
const initResult = await client.send(initAuthCommand);
دریافت رمز دسترسی
برای دریافت رمز دسترسی، باید رمز یکبار مصرف را تعویض کنیم. این کار با پاسخ به یک چالش احراز هویت انجام می شود:
const challengeCommand = new RespondToAuthChallengeCommand({
ChallengeName: "EMAIL_OTP",
ClientId: CLIENT_ID,
Session: initResult.Session,
ChallengeResponses: {
"EMAIL_OTP_CODE": code,
"USERNAME": username
}
})
const { AuthenticationResult } = await client.send(challengeCommand)
console.log(AuthenticationResult.AccessToken, AuthenticationResult.RefreshToken)
همین! را AuthenticationResult
شی شامل AccessToken
و RefreshToken
، که اکنون باید مانند هر برنامه دیگری که از نشانه ها برای احراز هویت استفاده می کند استفاده شود.
خلاصه
همانطور که همه ما می دانیم، تایپ رمز عبور در تلفن چیزی است که هیچ کس از آن لذت نمی برد. امیدوارم این پست به شما بینشی در مورد چگونگی پیادهسازی یک جریان ورود راحتتر با استفاده از Cognito برای مدیریت احراز هویت ارائه کرده باشد.