قسمت 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 {
}
روش های ایجاد حساب کاربری جدید
من ایجاد حساب کاربری را به سه روش تقسیم می کنم
- کاربر درخواستی برای شروع ثبت نام حساب کاربری جدید ارسال می کند.
- کاربر OTP را برای تأیید ایمیل ارسال می کند.
- کاربر حساب کاربری را با نام کاربری، رمز عبور و سایر جزئیات مانند جنسیت نام کامل، تاریخ تولد و غیره ایجاد می کند.
بیایید با روش اول شروع کنیم:
ابتدا باید آن را تعریف کنیم 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 شروع می کنیم.
در قسمت بعدی می بینمت.
خداحافظ