亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go 和 JWT - 簡單的身份驗證

Go 和 JWT - 簡單的身份驗證

Go
慕田峪7331174 2021-12-27 17:45:15
我目前正在制作一個 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 數據庫中?謝謝您幫忙 !
查看完整描述

3 回答

?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

首先,您需要在 Golang 中導入一個 JWT 庫(去獲取 github.com/dgrijalva/jwt-go)。您可以在以下鏈接中找到該庫文檔。


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


首先,您需要創建一個令牌


// 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)

其次,解析該令牌


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


編輯-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.")

    }

}


查看完整回答
反對 回復 2021-12-27
?
千巷貓影

TA貢獻1829條經驗 獲得超7個贊

只是為了更新@massoud-afrashteh 的答案。在 jwt-go 設置的第 3 版中,蛤蜊應該是


// Set some claims

claims := make(jwt.MapClaims)

claims["foo"] = "bar"

claims["exp"] = time.Now().Add(time.Hour * 72).Unix()

token.Claims = claims


查看完整回答
反對 回復 2021-12-27
?
茅侃侃

TA貢獻1842條經驗 獲得超22個贊

不要忘記運行命令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)


查看完整回答
反對 回復 2021-12-27
  • 3 回答
  • 0 關注
  • 204 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號