Go 和 JWT - 简单的身份验证

我目前正在制作一个 API(使用 go)并且我正在处理会话部分。在研究了 session 使用什么之后,我发现 JWT 真的很有趣。


但是,在学习了一些教程后,我不确定如何使用它。所以这是我的想法:


func main() {


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


    router.HandleFunc("/login", login)

    router.HandleFunc("/logout", logout)

    router.HandleFunc("/register", register)


    http.ListenAndServe(":8080", router)


 }

处理完这些请求后,我创建了不同的函数。


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?                                  

    */

 }

网络上的许多教程似乎很难,但我只想要简单的东西。我只想要一个句柄包(上面的代码),它与一个服务包一起工作,有一个引擎令牌认证之类的东西。


我不确定的第二点是代币的保存。如果用户连接自己,那么什么是最好的?每次用户运行他们的应用程序时,应用程序都会连接自己并从保存的信息(用户/密码)中获取新令牌,还是应用程序永远保存令牌?那么服务器呢,令牌是用 JWT 自动管理和保存的,还是我必须把它放在我的 sql 数据库中?


谢谢您帮忙 !


慕田峪7331174
浏览 206回答 3
3回答

翻翻过去那场雪

首先,您需要在 Golang 中导入一个 JWT 库(去获取 github.com/dgrijalva/jwt-go)。您可以在以下链接中找到该库文档。https://github.com/dgrijalva/jwt-go首先,您需要创建一个令牌// Create the tokentoken := jwt.New(jwt.SigningMethodHS256)// Set some claimstoken.Claims["foo"] = "bar"token.Claims["exp"] = time.Now().Add(time.Hour * 72).Unix()// Sign and get the complete encoded token as a stringtokenString, err := token.SignedString(mySigningKey)其次,解析该令牌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(":(")}此外,还有一些在 GOlang 中使用 JWT 的示例,例如https://github.com/slok/go-jwt-example编辑-1package mainimport (    "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.")    }}

千巷猫影

只是为了更新@massoud-afrashteh 的答案。在 jwt-go 设置的第 3 版中,蛤蜊应该是// Set some claimsclaims := make(jwt.MapClaims)claims["foo"] = "bar"claims["exp"] = time.Now().Add(time.Hour * 72).Unix()token.Claims = claims

茅侃侃

不要忘记运行命令go get github.com/dgrijalva/jwt-go。另一种创建更简单的方法:token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{   "foo": "bar",   "nbf": time.Date(2015, 10, 10, 12, 0, 0, 0, time.UTC).Unix(),})tokenString, err := token.SignedString([]byte("your key"))fmt.Println(tokenString, err)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go