برنامه نویسی

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

مقدمه

من از معرفی و توضیح اینکه Cognito چیست و چرا مفید است صرف نظر می کنم—فکر می کنم دلیلی برای خواندن این مطلب دارید.

من از Node.js با AWS SDK V3 برای قطعه‌های کد استفاده می‌کنم، اما زبان آن مهم نیست—شما باید به راحتی معادل‌هایی را در سایر SDKها پیدا کنید.

لطفاً توجه داشته باشید که این یک راه حل آماده برای استفاده نیست که بتوانید آن را در برنامه خود کپی کنید. در عوض، آن را به عنوان مجموعه‌ای از بلوک‌های ساختمانی در نظر بگیرید که می‌توانید از آنها برای طراحی یک جریان احراز هویت که نیازهای خاص شما را برآورده می‌کند، استفاده کنید.

این پست بر اساس آخرین به‌روزرسانی‌های Cognito (از حدود نوامبر 2024) است که دیگر نیازی به اجرای چالش‌های سفارشی ندارد. بنابراین، بیایید شروع کنیم!

استخر کاربر را راه اندازی کنید

اولین چیزی که نیاز دارید یک مجموعه کاربری است. تنظیم ورود بدون رمز عبور بسیار ساده است. در نمای کلی استخر، باید کاشی مشابه تصویر زیر را ببینید:

پیکربندی کاشی ورود بدون رمز عبور را شروع کنید

سپس، به پیکربندی برای ورود به سیستم مبتنی بر انتخاب بروید:

پیوند پیکربندی ورود به سیستم مبتنی بر انتخاب

رمز عبور یکبار مصرف (OTP) را با انتخاب کادر مناسب فعال کنید:

صفحه پیکربندی ورود به سیستم مبتنی بر انتخاب

برای استفاده اولیه (شاید برای اهداف ارزیابی)، به سادگی انتخاب کنید ارسال ایمیل با Cognito و کلیک کنید ذخیره تغییرات:

پیکربندی ایمیل برای استخر 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 برای مدیریت احراز هویت ارائه کرده باشد.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا