Obecnie tworzę API (z funkcją "go") i pracuję nad częścią sesji. Po przeprowadzeniu badań dotyczących tego, czego należy użyć podczas sesji, stwierdziłem, że JWT jest naprawdę interesujący.Go i JWT - Proste uwierzytelnianie
Jednak nie jestem pewien, aby zrozumieć, jak go używać po kilku tutoriali. Więc to jest mój pomysł:
func main() {
router := mux.NewRouter().StrictSlash(true)
router.HandleFunc("/login", login)
router.HandleFunc("/logout", logout)
router.HandleFunc("/register", register)
http.ListenAndServe(":8080", router)
}
Po tych wniosków rozpatrzonych, tworzę funkcje differents.
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?
*/
}
Wiele tutoriali w sieci wydaje się naprawdę trudne, ale chcę po prostu czegoś prostego. Po prostu chcę pakiet uchwytów (powyższy kod), które działają z pakietem usług, aby mieć coś takiego jak uwierzytelnianie tokenu silnika.
Drugim punktem, którego nie jestem pewien, jest zapisanie tokena. Jeśli użytkownik łączy się sam, to co jest najlepsze? Za każdym razem, gdy użytkownik uruchamia aplikację, aplikacja łączy się i pobiera nowy token z zapisanych informacji (użytkownik/hasło) lub po prostu zapisze token na zawsze? A co z serwerem, czy token jest automatycznie zarządzany i zapisywany przy pomocy JWT, czy też muszę go umieścić w bazie danych SQL?
Dziękuję za pomoc!
EDIT 1
Dziękujemy! Więc po przeczytaniu odpowiedzi na swoje pytanie, mam obudowane mojego kodu (token.go) podoba
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, ""
}
}
Jednak mam następujący błąd: "token.go: niezdefiniowane: myLookupKey" I wyglądał na internecie i znalazłem enkapsułowana funkcja, która ma ten prototyp:
func ExampleParse(myToken string, myLookupKey func(interface{}) (interface{}, error)) {
/* same code in my func parseToken() */
}
Jaka jest różnica między moją funkcją a tą? Jak mogę użyć tego?
Dzięki!
Przykładowy kod wykorzystujący mapę roszczeń nie działa. API mogło się zmienić w międzyczasie. – chmike
Nie mam pojęcia szczerze:/Zrobiłem to dawno temu i dzisiaj zmieniłem pracę, więc ..:/ – Emixam23