برنامه نویسی

قسمت 1: تعریف طرح GRPC

در این پست، نحوه توسعه API احراز هویت در Rust با استفاده از پروتکل gRPC را توضیح خواهم داد. احراز هویت بر اساس توکن‌های JWT خواهد بود و ما همچنین یک فایل docker برای استقرار برنامه در یک کانتینر داکر ایجاد خواهیم کرد. در آخر، من دستورالعمل هایی را در مورد نحوه استقرار برنامه ارائه خواهم داد.

چگونه این راهنما را دنبال کنید

  • من از نام مسیر کامل برای هر فایلی که ایجاد می کنم، نسبت به ریشه پروژه استفاده می کنم /مثلا /src/main.rs.

  • استفاده خواهم کرد append path-to-symbol برای توصیف من در حال نوشتن محتوای جدید در یک فایل/ماژول/و غیره هستم. به عنوان مثال:

    ضمیمه /proto/auth.proto/MyService توصیف کنید من در حال نوشتن یک روش rpc جدید در MyService خدمات

    rpc MyMethod(MyRequest) returns (MyResponse);
    
  • create /path/to/filename.ext : describe من در حال ایجاد یک فایل جدید با نام هستم filename و گسترش ext.

ویژگی ها

  • ثبت نام کاربر
  • ورود کاربر
  • بازنشانی رمز عبور/فراموش کردن رمز عبور
  • تایید OTP
  • هش کردن رمز عبور با نمک

یک پروژه جدید ایجاد کنید و آن را در ویرایشگر کد باز کنید

cargo new auth_api && cd auth_api && code . 
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تعریف طرح GRPC برای API

ایجاد کنید /proto/auth.proto
ضمیمه /proto/auth.proto

syntax = "proto3";
package tutorial.api.auth;

service AuthService {
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

روش های ایجاد حساب کاربری جدید

من ایجاد حساب کاربری را به سه روش تقسیم می کنم

  1. کاربر درخواستی برای شروع ثبت نام حساب کاربری جدید ارسال می کند.
  2. کاربر OTP را برای تأیید ایمیل ارسال می کند.
  3. کاربر حساب کاربری را با نام کاربری، رمز عبور و سایر جزئیات مانند جنسیت نام کامل، تاریخ تولد و غیره ایجاد می کند.

بیایید با روش اول شروع کنیم:

ابتدا باید آن را تعریف کنیم RequestCreateAccount روشی برای شروع ثبت نام حساب کاربری جدید

ضمیمه /proto/auth.proto/AuthService

rpc RequestCreateAccount(RequestCreateAccountParams) returns (RequestCreateAccountResponse);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

ضمیمه /proto/auth.proto


message RequestCreateAccountParams { 
    string email_id = 1;
}

message RequestCreateAccountResponse { 
    bool success = 1;
    string message = 2;
    string token = 3;
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در زیر پیام پاسخ موفقیت آمیز برای روش RequestCreateAccount توضیح داده می شود

{
    "success": true,
    "message": "Otp was sent to your email",
    "token": {
        // issuer
        "iss": "auth_api",
        // subject
        "sub": "",
        // this token should be short lived may be 2 minutes
        "exp": ,
        // issued at
        "iat": ,
        // requested permissions this would be granted by the VerifyOtp method
        "req_perms": ["CreateAccount"]
    }
} 

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این جریان ایجاد حساب مطمئن شوید که کاربر از شناسه ایمیل معتبر خود برای ایجاد یک حساب کاربری استفاده می کند.
ما همچنین می توانیم از شماره تلفن برای این کار استفاده کنیم، اما در حال حاضر، اجازه دهید آن را ساده نگه داریم.

بعد تعریف کنید VerifyOtp روشی برای تأیید ایمیل و اعطای مجوزهای درخواستی تعریف شده در نشانه ورودی.

ضمیمه /proto/auth.proto/AuthService

rpc VerifyOtp(VerifyOtpParams) returns (VerifyOtpResponse);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

ضمیمه /proto/auth.proto


message VerifyOtpParams { 
    string token = 1;
    string otp = 2;
}

message VerifyOtpResponse { 
    bool success = 1;
    string message = 2;
    string token = 3;
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در زیر پیام پاسخ موفقیت آمیز برای روش VerifyOtp توضیح داده شده است

{
    "success": true,
    "message": "Your email is verified",
        "token":  { 
        // issuer
        "iss": "auth_api",
        // subject
        "sub": "",
        // this token should be short lived may be 2 minutes 
        "exp": ,
        // issued at
        "iat": ,

        // permissions granted to the user
        "perms": ["CreateAccount"]
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از این روش برای اعطای مجوزهای درخواست شده استفاده می شود req_perms ادعای نشانه ورودی
در واقع این جهش نشان با perms ادعا و آن را به کاربر مشتری برگردانید.

بعد یک را ایجاد کنید CreateAccount روش ایجاد حساب کاربری با نام کاربری، رمز عبور و سایر جزئیات.

ضمیمه /proto/auth.proto/AuthService

rpc CreateAccount(CreateAccountParams) returns (CreateAccountResponse);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

ضمیمه /proto/auth.proto


message CreateAccountParams { 
    string username = 1;
    string password = 2;
    // other details
    string full_name = 3;
    Gender gender = 4;
    string birth_date = 5;
}

message CreateAccountResponse { 
    bool success = 1;
    string message = 2;
    string session_token = 3;
    User user = 4;
}

message User {
    string username = 1;
    string email = 2;
    string full_name = 3;
    Gender gender = 4;
    string birth_date = 5;
}

enum Gender {
    MALE = 0;
    FEMALE = 1;
    OTHER = 2;
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در زیر پیام پاسخ موفقیت آمیز برای روش CreateAccount توضیح داده می شود

{
    "success": true,
    "message": "Account created successfully",
    "session_token": {
        "iss": "auth_api",
        "sub": "",
        "exp": ,
        "iat": ,
        "perms": ["ApiAccess"]
    }, 
    "user": {
        "username": "",
        "email": "",
        "full_name": "",
        "gender": "",
        "birth_date": ""
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون تمام روش های ایجاد یک حساب کاربری جدید را ایجاد کرده ایم.

روش های ورود به حساب کاربری

در مرحله بعد باید روش Login را برای ورود به حساب تعریف کنیم.
کاربر می تواند از ایمیل یا نام کاربری خود برای ورود به حساب کاربری خود استفاده کند.

ابتدا باید آن را تعریف کنیم Login روش ورود به حساب کاربری

ضمیمه /proto/auth.proto/AuthService

rpc Login(LoginParams) returns (LoginResponse);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

ضمیمه /proto/auth.proto


message LoginParams { 
    string email_or_username = 1;
    string password = 2;
}
message LoginResponse { 
    bool success = 1;
    string message = 2;
    string session_token = 3;
    User user = 4;
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پاسخ موفقیت آمیز دارای یک نشانه جلسه به شرح زیر است

{
    "success": true,
    "message": "Login successful",
    "session_token": {
        "iss": "auth_api",
        "sub": "",
        "exp": ,
        "iat": ,
        "perms": ["Session"]
    }, 
    "user": {
        "username": "",
        "email": "",
        "full_name": "",
        "gender": "",
        "birth_date": ""
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

روش های بازنشانی رمز عبور کاربر

ابتدا من تعریف می کنم InitiateResetPassword روشی برای شروع فرآیند بازنشانی رمز عبور
این روش شناسه ایمیل را می پذیرد و رمز بازنشانی رمز عبور را به شناسه ایمیل کاربر ارسال می کند.
همچنین سرور یک کد otp را به شناسه ایمیل کاربر ارسال می کند.

ضمیمه /proto/auth.proto/AuthService

rpc InitiateResetPassword(InitiateResetPasswordParams) returns (InitiateResetPasswordResponse);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

ضمیمه /proto/auth.proto


message InitiateResetPasswordParams { 
    string email_id = 1;
}

message InitiateResetPasswordResponse { 
    bool success = 1;
    string message = 2;
    string token = 3;
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پاسخ موفقیت آمیز برای InitiateResetPassword متد یک رمز بازنشانی رمز عبور به شرح زیر خواهد داشت

{
    "success": true,
    "message": "Password reset token sent to your email",
    "token":  { 
        "iss": "auth_api",
        "sub": "",
        "exp": ,
        "iat": ,
        "req_perms": ["ResetPassword"]
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ادعای req_perms در توکن توضیح می‌دهد که پس از دادن کد otp درست به کاربر، اجازه بازنشانی رمز عبور داده می‌شود. VerifyOtp روش ما قبلا داریم VerifyOtp روش در بخش قبل

بیایید تعریف کنیم ResetPassword روش بازنشانی رمز عبور کاربر
روش ResetPassword رمز تنظیم مجدد رمز عبور و رمز عبور جدید را می پذیرد.

ضمیمه /proto/auth.proto/AuthService

rpc ResetPassword(ResetPasswordParams) returns (ResetPasswordResponse);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

ضمیمه /proto/auth.proto


message ResetPasswordParams { 
    string token = 1;
    string new_password = 2;
}

message ResetPasswordResponse { 
    bool success = 1;
    string message = 2;
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پاسخ موفقیت آمیز برای ResetPassword متد پیامی به شرح زیر خواهد داشت

{
    "success": true,
    "message": "Password reset successful"
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نتیجه گیری

ما طرح GRPC را برای API احراز هویت تعریف کرده ایم. در حال حاضر از ایجاد حساب کاربری، ورود به سیستم، بازنشانی رمز عبور در صورتی که کاربر رمز عبور خود را فراموش کرده باشد، پشتیبانی می کند. این همچنین شامل تأیید OTP می شود تا مطمئن شود کاربر از شناسه ایمیل معتبر استفاده می کند.

در قسمت بعدی کدگذاری API را در Rust شروع می کنیم.
در قسمت بعدی می بینمت.
خداحافظ

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

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

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

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