برنامه نویس فان | Fun Developer یک آدم ساده که عاشق برنامه نویسی و کد زدنه :) تلاش میکنه تا به بقیه کمک کنه. توسعه دهنده هسته لاراول و فضای اوپن سورس. فاندر پرانتز و کد نیوز.
در ابتدا، مفاهیم پایه JWT توضیح داده میشود، از جمله اینکه JWT یک استاندارد برای انتقال اطلاعات به صورت امن بین دو طرف (کلاینت و سرور) است. این اطلاعات به صورت یک توکن رمزنگاری شده ذخیره میشوند که شامل سه بخش اصلی است: Header
، Payload
و Signature
. در ادامه، به نحوه پیادهسازی JWT در گولنگ پرداخته میشود. شما یاد میگیرید که چگونه یک توکن JWT ایجاد و امضا کنید، آن را به کاربر ارسال کنید، و سپس چگونه این توکن را در درخواستهای بعدی کاربر اعتبارسنجی کنید. معمولاً از کتابخانههایی مانند github.com/golang-jwt/jwt/v5 برای کار با JWT استفاده میشود.
JWT چی هست؟
JWT یا JSON Web Token یک استاندارد برای ایجاد توکنهای امن و فشرده است که برای احراز هویت و انتقال اطلاعات بین دو طرف (مثل کلاینت و سرور) استفاده میشود. این توکنها به صورت JSON رمزنگاریشده هستند و میتوانند شامل اطلاعات مختلفی مانند ادعاهای کاربر (claims) باشند.
ساختار JWT
JWT از سه بخش اصلی تشکیل شده است که با نقطه (.) از هم جدا میشوند:
Header (هدر): شامل اطلاعات مربوط به نوع توکن و الگوریتم رمزنگاری مورد استفاده (مانند HS256 یا RS256) است.
Payload (بار): شامل اطلاعات یا ادعاهایی است که میخواهید به گیرنده ارسال کنید. این ادعاها میتواند شامل شناسه کاربر، زمان انقضای توکن و دیگر اطلاعات مرتبط باشد.
Signature (امضا): برای اطمینان از یکپارچگی توکن و صحت اطلاعات آن استفاده میشود. امضا با استفاده از هدر، payload و یک کلید محرمانه (یا یک جفت کلید عمومی-خصوصی در برخی الگوریتمها) تولید میشود.
نصب پکیج مورد نیاز
برای کار با JWT در گولنگ یکی از بهترین پکیج ها، پکیج golang-jwt هست. برای نصبش کافیه دستور زیر در پروژه خود وارد کنید:
go get github.com/golang-jwt/jwt/v5
به صورت اتوماتیک دانلود و نصب خواهید شد.
ساخت توکن JWT
برای کار با JWT ما نیاز داریم که توکن بسازیم، برای اینکار ما یک فانکشن درست میکنیم که وظیفه این کار داشته باشه:
func createToken(username string) (string, error) {
token := jwt.NewWithClaims(jwt.SigningMethodHS256,
jwt.MapClaims{
"username": username,
"exp": time.Now().Add(time.Hour * 24).Unix(),
})
tokenString, err := token.SignedString(secretKey)
if err != nil {
return "", err
}
return tokenString, nil
}
در این قسمت از کد ما از پکیج fmt, time و go-jwt استفاده کردیم و نیاز داریم که اینها import کنیم. ما با استفاده از الگوریتم HS256 اومدیم یک توکن ساختیم.
تایید (verify) توکن
با در اپلیکیشن خودمون نیاز داریم که توکن ها اعتبارسنجی کنیم تا از درست بودن اون ها مطمن بشیم بخاطر همین یک فانکشن درست میکنیم برای اینکار:
func verifyToken(tokenString string) error {
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
return secretKey, nil
})
if err != nil {
return err
}
if !token.Valid {
return fmt.Errorf("token was invalid")
}
return nil
}
متد "Parse" به ما کمک میکنه که توکن خودمون بررسی کنیم و ببینیم آیا توکن درست هست یا خیر.
سیستم روتینگ
ما برای اینکه یک روت درست کنیم که سیستم احرازهویت خودمون روش پیاده کنیم نیاز به یک سیستم روتینگ داریم که من از mux استفاده میکنم شما میتونید هر پکیجی دوست دارید استفاده کنید.
برای نصب پکیج میتونید دستور زیر وارد کنید:
go get github.com/gorilla/mux
خب حالا در فانکشن "main
" خودمون میایم پروژه Serve میکنیم:
var secretKey = []byte("secret-key")
func main() {
router := mux.NewRouter()
router.HandleFunc("/login", LoginHandler).Methods("POST")
fmt.Println("Starting the server")
err := http.ListenAndServe(":4000", router)
if err != nil {
fmt.Println("Could not start the server", err)
}
}
در اینجا ما پروژه امون رو روی پورت 4000 بالا میاریم.
سیستم احرازهویت
خب حالا بخش نهایی یعنی سیستم احرازهویت ما مونده که الان اون هم انجام میدیم:
func LoginHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
var u User
json.NewDecoder(r.Body).Decode(&u)
fmt.Printf("The user request value %v", u)
if u.Username == "Chek" && u.Password == "123456" {
tokenString, err := createToken(u.Username)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
fmt.Errorf("no username found")
}
w.WriteHeader(http.StatusOK)
fmt.Fprint(w, tokenString)
} else {
w.WriteHeader(http.StatusUnauthorized)
fmt.Fprint(w, "Invalid credentials")
}
}
خب ما نیاز داشتیم که یک struct به نام User هم بسازیم:
type User struct {
Username string `json:"username"`
Password string `json:"password"`
}
الان همه چی تکمیله و کافیه با دستور زیر پروژه خودمون ران کنیم:
go run main.go
حالا شما میتونید با JWT لاگین کنید.
اولین نفر باش که نظر ثبت میکنی :) یعنی یه کامنت به ما نمیرسه 😁