Ş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!
Bir İddia haritası kullanan kod örneği çalışmıyor. API, ortalama zamanda değişmiş olabilir. – chmike
Dürüstlükle bir fikrim yok:/Uzun zaman önce yaptım ve bugün çalışmayı değiştirdim ..:/ – Emixam23