e
sv

Go'da JWT kimlik doğrulaması için bir kılavuz

avatar

Yazılım Method

  • e 0

    Mutlu

  • e 0

    Eğlenmiş

  • e 0

    Şaşırmış

  • e 0

    Kızgın

  • e 0

    Üzgün

JSON Web Belirteçleri (JWT'ler), çevrimiçi kimlik doğrulama ile başa çıkmak için popüler bir yöntemdir ve JWT kimlik doğrulamasını herhangi bir sunucu tarafı programlama dilinde uygulayabilirsiniz.

Genel olarak JWT'leri okumak için, LogRocket blogundaki bu makalelerle JWT'ler, en iyi uygulamalar ve JWT'lerle RESTful API'lerin güvenliğini sağlama hakkında daha fazla bilgi edinmenizi öneririm.

Bu makale, golang-jwt paketini kullanarak Go web uygulamalarınızda JWT kimlik doğrulamasını uygulamaya başlamanıza yardımcı olmayı amaçlamaktadır.

golang-jwt paketi, özellikleri ve kullanım kolaylığı nedeniyle Go'da JWT'leri uygulamak için en popüler pakettir. golang-jwt paketi, JWT'leri oluşturmak ve doğrulamak için işlevsellik sağlar.

Önkoşullar

Bu eğitimden en iyi şekilde yararlanmak için bu temel gereksinimleri karşılamanız gerekir.

  • Makinenize 1.16 veya üzeri bir sürüm yükleyin ( güvenlik nedeniyle)
  • Go veya başka bir dilde web uygulamaları oluşturma deneyimi (isteğe bağlı)

İçindekiler

Golang-JWT paketini kullanmaya başlama

Go çalışma alanınızı ayarladıktan ve Go modülleri dosyasını go.mod sonra, golang-jwt paketini kurmak için terminalinizde çalışma alanı dizininde şu komutu çalıştırın:

 github.com/golang-jwt/jwt adresini al

golang-jwt yükledikten sonra bir Go dosyası oluşturun ve bu paketleri ve modülleri içe aktarın.

 içe aktarmak (
   "kayıt"
    "kodlama/json"
   "github.com/golang-jwt/jwt"
   "net/http"
   "zaman"
)

Bu öğreticide bu paketleri, hataları günlüğe kaydetmek, bir sunucu kurmak ve belirteç sona erme süresini ayarlamak için kullanacaksınız.

Go'da bir web sunucusu kurma

Bir JWT ile güvence altına alınacak bir uç noktaya sahip basit bir web sunucusu oluşturmaya başlayalım.

 func ana() {
   http.HandleFunc("/home", handlePage)
   hata := http.ListenAndServe(":8080", nil)
   eğer hata != nil {
      log.Println("8080 numaralı bağlantı noktasını dinlerken bir hata oluştu", err)
   }

}

Ana işlev, ayarlayacağınız bir işleyici işlevi handlePage ile ev uç noktasını ayarlar. handlePage işlevi, JWT'leri kullanarak sayfayı güvence altına alacaktır. Sunucu, bağlantı noktası :8080 dinleyecek şekilde ayarlanmıştır, ancak istediğiniz herhangi bir bağlantı noktasını kullanabilirsiniz.

handlePage işleyici işlevi, istek gövdesi kodlandıktan sonra istek yetkilendirilirse, Message yapısının kodlanmış JSON'unu istemciye yanıt olarak döndürür.

 tür Mesaj yapısı {
        Durum dizesi `json:"durum"`
        Bilgi dizesi `json:"info"`
}

func handlePage(yazar http.ResponseWriter, istek *http.Request) {
        yazar.Header().Set("İçerik Türü", "uygulama/json")
        var mesaj Mesaj
        err := json.NewDecoder(request.Body).Decode(&message)
        eğer hata != nil {
                dönüş
        }
        err = json.NewEncoder(yazar).Encode(mesaj)
        eğer hata != nil {
                dönüş
        }
}

Bu noktada handlePage işlevi doğrulanmamıştır ve sayfaya istekte bulunmak serbestçe çalışacaktır. Bu öğreticide daha sonra işleyici işlevlerinize nasıl kimlik doğrulama ekleyeceğinizi öğreneceksiniz.

API ağ sayfası

Golang-JWT paketini kullanarak kimlik doğrulama için JWT'ler oluşturma

golang-jwt paketini kullanarak JWT belirteçleri oluşturmak için gizli bir anahtara ihtiyacınız olacak. İşte bu öğretici için örnek bir özel anahtar; ancak, gizli anahtarınız için kriptografik olarak güvenli bir dize kullanmalı ve bunu bir ortam değişkenleri dosyasından (.env) yüklemelisiniz.

Go uygulamalarınızda ortam değişkenlerini nasıl kullanacağınızı öğrenmek için bu makaleye göz atın.

 var sampleSecretKey = []byte("SecretYouShouldHide")

JWT'leriniz için kullandığınız gizli anahtara sahip olan kişinin, uygulamanızın kullanıcılarının kimliğini doğrulayabileceğini lütfen unutmayın. Bu durumda sampleSecretKey değişkeni özel anahtarı tutar.

İşte JWT belirteçleri oluşturmak için bir işlev. İşlev bir dize ve bir hata döndürmelidir. JWT'yi oluştururken bir hata varsa, işlev boş bir dize ve hatayı döndürür. Hata yoksa, işlev JWT dizesini ve nil türünü döndürür.

 func generateJWT() (string, error) { }

JWT paketinin New yöntemini kullanarak yeni bir belirteç oluşturabilirsiniz. New yöntem, bir imzalama yöntemini (JWT için şifreleme algoritması) alır ve bir JWT belirteci döndürür.

 belirteç := jwt.New(jwt.SigningMethodEdDSA)

JWT'yi değiştirmek istiyorsanız, belirtecin Claims yöntemini kullanabilirsiniz.

 talepler := token.Claims.(jwt.MapClaims)
request["exp"] = time.Now().Add(10 * time.Dakika)
iddialar["yetkili"] = doğru
talepler["kullanıcı"] = "kullanıcı adı"

Bu durumda, time modülünü ve kullanıcı adı ve yetkilendirme durumunu kullanarak JWT için on dakika olan bir sona erme süresi ayarlarsınız. JWT'yi doğrulamaya çalışırken hak taleplerini geri alabileceksiniz.

JWT oluşturmanın son kısmı, gizli anahtarınızı kullanarak dizeyi imzalamaktır. Belirteç dizginizi, belirtecin SignedString yöntemini kullanarak imzalayabilirsiniz. SignedString yöntemi, gizli anahtarı alır ve imzalı bir belirteç dizesi döndürür.

 tokenString, hata := token.SignedString(sampleSecretKey)
eğer hata != nil {
    dönüş "", hata
 }

 tokenString döndür, sıfır

Belirteci imzalamada hata olduğu durumlarda, boş bir dize ve hatayı döndürebilirsiniz.
Çerezlerin aksine, JWT'yi saklamanız gerekmez; jetonları doğrulamak için tek ihtiyacınız olan imzalama anahtarınız.

JWT belirteçlerini doğrulama

JWT'leri doğrulamanın geleneksel yöntemi, ara katman yazılımını (işlemler için diğer işleyici işlevlerini alan işleyici işlevleri) kullanır. Bir isteğin yetkilendirildiğini doğrulamak için ara yazılımı nasıl kullanacağınız aşağıda açıklanmıştır.

 func doğrulamaJWT(endpointHandler func(yazar http.ResponseWriter, istek *http.Request)) http.HandlerFunc {

}

verifyJWT işlevi, doğrulamak istediğiniz istek için işleyici işlevini üstlenen bir ara katman yazılımıdır. İşleyici işlevi, isteği doğrulamak ve duruma göre yanıt vermek için istek başlığındaki belirteç parametresini kullanır.

 return http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) { })

verifyJWT işlevi, istek yetkilendirilmişse parametre olarak geçirilen işleyici işlevini döndürür.

JWT'leri doğrulamanın ilk adımı, isteğin başlığındaki belirteci incelemektir.

 if request.Header["Token"] != nil {

}

Bir belirteç varsa, belirteci doğrulamaya ve hak taleplerini doğrulamaya devam edebilirsiniz.

Belirteci ayrıştırmanız gerekecek ve belirteci jwt paketinin Parse yöntemini kullanarak ayrıştırabilirsiniz. parse yöntemi, belirteci ve bir JWT dekoratör işlevini alır ve bir arabirim ve bir hata döndürür.

Belirtecin Method yöntemini kullanarak imzayı doğrulamak için belirteci oluşturduğunuzda imzalamak için kullandığınız aynı imzalama yöntemini kullanmanız gerekir. Bu durumda, imzalama yöntemi ECDSA yöntemiydi.

 belirteç, err := jwt.Parse(request.Header["Token"][0], func(token *jwt.Token) (arayüz{}, hata) {
            _, tamam := belirteç.Yöntem.(*jwt.SigningMethodECDSA)
            Eğer tamam ise {
               yazar.WriteHeader(http.StatusYetkisiz)
               _, err := yazar.Write([]byte("Yetkisizsiniz!"))
               eğer hata != nil {
                  dönüş sıfır, hata

               }
            }
            dönüş "", sıfır

         })

İmza doğrulaması başarısız olursa (işlev !ok döndürür), istemciye StatusUnauthorized üstbilgisi döndürebilirsiniz.

 eğer hata != nil {
               yazar.WriteHeader(http.StatusYetkisiz)
               _, err2 :=writer.Write([]byte("JWT ayrıştırma hatası nedeniyle Yetkisizsiniz"))
              eğer err2 != nil {
                      dönüş
                }
}

Yukarıdaki kodda, belirteç ayrıştırılırken bir hata var. Bu nedenle, kullanıcı yetkisizdir ve bir mesaj yazabilir ve yetkisiz bir durum döndürebilirsiniz.

Belirtecin Valid yöntemini kullanarak belirteci doğrulayabilirsiniz.

 if belirteci.Geçerli {
                      endpointHandler(yazar, istek)
                        } başka {
                                yazar.WriteHeader(http.StatusYetkisiz)
                                _, err := yazar.Write([]byte("Geçersiz belirteç nedeniyle Yetkisizsiniz"))
                                eğer hata != nil {
                                        dönüş
                                }
}

Belirteç geçerliyse, writer birlikte uç nokta işleyicisine geçebilir ve ara yazılım işlevinin uç noktayı döndürmesi için işleyici işlevinin parametrelerini request .

Müşterinin isteğinin başlığında belirteç olmadığı bir durum için else ifadesi:

 başka {
          yazar.WriteHeader(http.StatusYetkisiz)
          _, err :=writer.Write([]byte("Başlıktaki belirteç olmadığından Yetkisizsiniz"))
           eğer hata != nil {
               dönüş
           }
}

Ara yazılım kullandığınız için, rota bildiriminizdeki işleyici işlevi, argüman olarak rota için işleyici işleviyle birlikte verifyJWT ara yazılımı olacaktır.

 http.HandleFunc("/home", doğrulamaJWT(handlePage))

Doğrulama işlevinizi rotaya ekledikten sonra uç noktanın kimliği doğrulanır.

Uç nokta kimliği doğrulandı

İstemci tarafında, istemcinin verilmiş bir belirteç sağlaması gerekir. İşte, isteklere belirteç eklemek için generateJWT işlevini kullanan bir işlev.

 func authPage(yazar http.ResponseWriter, ) {
        belirteç, hata := oluşturJWT()
        eğer hata != nil {
                        dönüş
        } 
        istemci := &http.Client{}
        request, _ := http.NewRequest("POST", "<http://localhost:8080/>", nil)
        request.Header.Set("Jeton", jeton)
        _, _ = müşteri.Yap(istek)

}

authPage işlevinde, token değişkeni, generateJWT işlevinden belirteci tutar. http paketinin Client türüne bir başvuru kullanarak yeni bir istemci oluşturabilir ve uç noktaya istekte bulunabilirsiniz. request değişkeni, istek örneğidir ve istek örneğinin header yönteminin Set yöntemini kullanarak, belirteci istek başlığında yukarıda gösterildiği gibi ayarlayabilirsiniz.

Ayrıca belirteci bir tanımlama bilgisi olarak ayarlamayı ve bir istemci kimliği doğrulanmış uç noktaya istekte bulunduğunda doğrulama için almayı da seçebilirsiniz.

JWT belirteçlerinden taleplerin çıkarılması

Bir JWT oluştururken, belirteç içine bilgi gömmeyi seçebilirsiniz. generateJWT işlevinde, username değişkenini claims haritasına eklediniz.

Örnek olarak username taleplerini kullanarak hak taleplerini nasıl çıkarabileceğiniz aşağıda açıklanmıştır. Belirteç imzasını doğrularken ara katman yazılımını kullanabilir veya doğrulama işlevinize işlevsellik ekleyebilirsiniz.

 func ExtractClaims(_ http.ResponseWriter, request *http.Request) (string, error) {
        if request.Header["Token"] != nil {
                tokenString := request.Header["Token"][0]
                belirteç, hata := jwt.Parse(tokenString, func(token *jwt.Token) (arayüz{}, hata) {

          if _, tamam := token.Method.(*jwt.SigningMethodECDSA); !tamam {
                return nil, fmt.Errorf("imzalama yönteminde bir hata var")
          }
                numuneyi döndürSecretKey, sıfır

            })

            eğer hata != nil {
                        dönüş "Hata Ayrıştırma Belirteci: ", err
                }
}

extractClaims işlevlerinde işlem, verifyJWT işleviyle aynıdır; jetonu başlıktan aldınız, jetonu ayrıştırdınız ve imzayı doğruladınız.

 iddialar, tamam := token.Claims.(jwt.MapClaims)
          tamam ise && belirteç.Geçerli {
                kullanıcı adı := talepler["kullanıcı adı"].(string)
                kullanıcı adını döndür, nil
          }

        }
        "talepler alınamıyor" iade, nil

Belirteci doğrularken, Claims yöntemini kullanarak talepleri alabilir ve yukarıda gösterildiği gibi JWT'deki verileri almak için talep haritasını kullanabilirsiniz.

Çözüm

Bu eğitici, golang-jwt paketini kullanarak Go with JSON Web Belirteçleri'nde API ve web sayfası uç noktalarınızın kimliğini doğrulamak için JWT kimlik doğrulamasını nasıl kullanacağınızı öğretti. Kodun tamamını bu eğitimde Github Gist olarak bulabilirsiniz.

Gizli anahtarlarınız için ortam değişkenlerini kullanmayı unutmayın ve hassas verileri JWT'lerde saklamayın. LogRocket blogunda, kullanmak istediğiniz dilde veya çerçevede başlamak için kontrol edebileceğiniz birçok JWT öğreticisi var!

Go'da JWT kimlik doğrulama kılavuzu yazısı ilk olarak LogRocket Blog'da yayınlandı.

etiketlerETİKETLER
Üzgünüm, bu içerik için hiç etiket bulunmuyor.

Sıradaki içerik:

Go'da JWT kimlik doğrulaması için bir kılavuz