https://github.com/teacat/ginrs
🔒 JWT with RS-signing methods, designed for Gin.
https://github.com/teacat/ginrs
gin go golang jwt
Last synced: 5 months ago
JSON representation
🔒 JWT with RS-signing methods, designed for Gin.
- Host: GitHub
- URL: https://github.com/teacat/ginrs
- Owner: teacat
- Archived: true
- Created: 2022-02-08T03:21:40.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2022-02-23T19:17:49.000Z (over 4 years ago)
- Last Synced: 2024-06-20T02:05:45.838Z (about 2 years ago)
- Topics: gin, go, golang, jwt
- Language: Go
- Homepage:
- Size: 13.7 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# GinRS [](https://godoc.org/github.com/teacat/ginrs) [](https://goreportcard.com/report/github.com/teacat/ginrs)
套用在 [gin-gonic/gin](https://github.com/gin-gonic/gin) 基於 RS256 演算法的 JWT 簽署套件。
## 非對稱金鑰
透過 `openssl` 產生一個私鑰。
```go
openssl genrsa -out private.key 2048
```
再透過這個私鑰產生一個公鑰,這個公鑰可以配發到其他伺服器或是第三方的手中用來驗證未來的 JWT 是否都由同人所簽署。
```go
openssl rsa -in private.key -pubout > public.key
```
## 使用方式
產生金鑰,便能透過下列方式簽署 JWT,並以公鑰驗證其簽發正確性。
```go
package main
import (
"fmt"
"github.com/teacat/ginrs"
)
type Data struct {
Username string
}
func main() {
// 欲簽署的資料。
data := Data{
Username: "YamiOdymel",
}
// 因為要簽署和驗證,所以必須載入公私鑰兩個檔案。
err := ginrs.LoadKeys("./tests/public.key", "./tests/private.key")
if err != nil {
panic(err)
}
// 將資料透過 RS256 簽署成一個 JWT。
token, err := ginrs.SignRS256(data)
if err != nil {
panic(err)
}
// 驗證這個 JWT 是否正確。
var signedData Data
err = ginrs.Parse(token, &signedData)
if err != nil {
panic(err)
}
fmt.Println(signedData.Username) // 輸出:YamiOdymel
}
```
若沒有要進行簽署,而只是要驗證 JWT 是否正確,則可以將 `LoadKeys` 替換成 `LoadPublicKey` 僅載入公鑰作為驗證用途而不需要私鑰。
### 用於 Gin 的中介函式
透過 `Middleware` 函式可以在每個請求進入時將 JWT 簽署的資料放入 `*gin.Context` 的變數中。
```go
type Data struct {
Username string
}
func main() {
r := gin.Default()
// 套用 GinRS 的中介函式到所有 Gin 路由。
r.Use(ginrs.Middleware())
r.GET("/hello", func(c *gin.Context) {
var data Data
// 透過 ginrs.MustGet 取得 JWT 資料。
ginrs.MustGet(c, &data)
fmt.Println(v.Username)
})
}
```