2016-03-26 17 views
9

Şu anda bir API (devam ediyor) yapıyorum ve oturum bölümünde çalışıyorum. Oturumda ne kullanacağınız hakkında araştırma yaptıktan sonra JWT'yi gerçekten ilginç buldum.Git ve JWT - Basit kimlik doğrulaması

Ancak, bazı öğreticilerden sonra nasıl kullanılacağını anlayamadığımdan emin değilim.

func main() { 

    router := mux.NewRouter().StrictSlash(true) 

    router.HandleFunc("/login", login) 
    router.HandleFunc("/logout", logout) 
    router.HandleFunc("/register", register) 

    http.ListenAndServe(":8080", router) 

} 

ele bu taleplere sonra, değişik fonksiyonlar oluşturun: Yani bu benim fikrim.

func login(w http.ResponseWriter, r *http.Request) { 
    /*                                                 
    Here I just have to search in my database (SQL, I know how to do it). If the user is registered, I create a token and give it to him, but how can I do it?           
    */ 
} 

func logout(w http.ResponseWriter, r *http.Request) { 
    /*                                                 
    I get a token and stop/delete it?                                          
    */ 
} 

func register(w http.ResponseWriter, r *http.Request) { 
    /*                                                 
    I search if the user isn't register and then, if it isn't, I create a user in the database (I know how to do it). I connect him but again, how to make a new token?         
    */ 
} 

Web'deki eğitmenlerin çoğu gerçekten zor görünüyor ama sadece basit bir şey istiyorum. Sadece bir motor belirteci kimlik doğrulaması gibi bir şey için bir hizmet paketi ile çalışan bir tanıtıcı paketi (yukarıdaki kod) istiyorum.

İkinci bir nokta anladığımdan emin değilim. Bir kullanıcı kendini bağlarsa, o zaman en iyi ne olurdu? Kullanıcı herzaman kendi uygulamasını çalıştırdığında, uygulama kendini bağlar ve kaydedilen bilgilerden (kullanıcı/şifre) yeni bir jetonu veya uygulamayı sonsuza dek jetonu kurtarır mı? Sunucuya ne dersin, JWT ile otomatik olarak yönetilen ve kaydedilen bir simge mi yoksa sql veritabanına mı yazmalıyım?

Yardımlarınız için teşekkür ederiz!

DÜZENLEME 1

teşekkür ederiz! "Token.go: tanımlanmamış: myLookupKey" Ben cevabınızı okudum Yani sonra ben

package services 

import (
    "fmt" 
    "github.com/dgrijalva/jwt-go" 
    "time" 
    "../models" 
) 

var tokenEncodeString string = "something" 

func createToken(user models.User) (string, error) { 
    // create the token                                             
    token := jwt.New(jwt.SigningMethodHS256) 

    // set some claims                                             
    token.Claims["username"] = user.Username; 
    token.Claims["password"] = user.Password; 
    token.Claims["exp"] = time.Now().Add(time.Hour * 72).Unix() 

    //Sign and get the complete encoded token as string                                     
    return (token.SignedString(tokenEncodeString)) 
} 

func parseToken(unparsedToken string) (bool, string) { 
    token, err := jwt.Parse(unparsedToken, func(token *jwt.Token) (interface{}, error) { 
      // Don't forget to validate the alg is what you expect:                                  
      if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok { 
        return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]) 
      } 
      return myLookupKey(token.Header["kid"]), nil 
    }) 

    if err == nil && token.Valid { 
      return true, unparsedToken 
    } else { 
      return false, "" 
    } 
} 

Ancak böyle kodumu (token.go) kapsüllü, aşağıdaki hata var internette baktım ve buldum Bu prototip bir kapsüllü fonksiyonu:

func ExampleParse(myToken string, myLookupKey func(interface{}) (interface{}, error)) { 
/* same code in my func parseToken() */ 
} 

Yani benim işlev ve bunun arasındaki fark nedir? Bunu nasıl kullanabilirim?

Teşekkürler!

+0

Bir İddia haritası kullanan kod örneği çalışmıyor. API, ortalama zamanda değişmiş olabilir. – chmike

+0

Dürüstlükle bir fikrim yok:/Uzun zaman önce yaptım ve bugün çalışmayı değiştirdim ..:/ – Emixam23

cevap

16

Öncelikle Golang'da bir JWT kitaplığı almanız gerekiyor (go get github.com/dgrijalva/jwt-go), o zaman aşağıdaki kütüphane belgelerini bulabilirsiniz.

https://github.com/dgrijalva/jwt-go

Önce Ayrıca, bu https://github.com/slok/go-jwt-example

gibi GOlang kullanım JWT'de için bazı örnekler vardır

token, err := jwt.Parse(myToken, func(token *jwt.Token) (interface{}, error) { 
    // Don't forget to validate the alg is what you expect: 
    if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok { 
     return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]) 
    } 
    return myLookupKey(token.Header["kid"]), nil 
}) 

if err == nil && token.Valid { 
    deliverGoodness("!") 
} else { 
    deliverUtterRejection(":(") 
} 

belirteç bir belirteç

// Create the token 
token := jwt.New(jwt.SigningMethodHS256) 
// Set some claims 
token.Claims["foo"] = "bar" 
token.Claims["exp"] = time.Now().Add(time.Hour * 72).Unix() 
// Sign and get the complete encoded token as a string 
tokenString, err := token.SignedString(mySigningKey) 

Ve sonra ayrıştırma oluşturmak için gereken

EDIT-1

package main 

import (
    "fmt" 
    "time" 

    "github.com/dgrijalva/jwt-go" 
) 

const (
    mySigningKey = "WOW,MuchShibe,ToDogge" 
) 

func main() { 
    createdToken, err := ExampleNew([]byte(mySigningKey)) 
    if err != nil { 
     fmt.Println("Creating token failed") 
    } 
    ExampleParse(createdToken, mySigningKey) 
} 

func ExampleNew(mySigningKey []byte) (string, error) { 
    // Create the token 
    token := jwt.New(jwt.SigningMethodHS256) 
    // Set some claims 
    token.Claims["foo"] = "bar" 
    token.Claims["exp"] = time.Now().Add(time.Hour * 72).Unix() 
    // Sign and get the complete encoded token as a string 
    tokenString, err := token.SignedString(mySigningKey) 
    return tokenString, err 
} 

func ExampleParse(myToken string, myKey string) { 
    token, err := jwt.Parse(myToken, func(token *jwt.Token) (interface{}, error) { 
     return []byte(myKey), nil 
    }) 

    if err == nil && token.Valid { 
     fmt.Println("Your token is valid. I like your style.") 
    } else { 
     fmt.Println("This token is terrible! I cannot accept this.") 
    } 
} 
+0

Teşekkür ederim, cevabınızı reddediyorum ve mesajımı düzenle;) – Emixam23

+0

Tamam cevabımı tekrar kontrol edin. –

+0

@MaximeGuittet Doğru cevap olsaydı, lütfen soruyu kapatmak için kontrol edin. teşekkürler –