要在 Go 中使用 go-zero
框架与 jwt-go
创建一个 API 并进行编译,以下是详细的步骤:
1. 环境准备
确保你已经安装了 Go 环境。你可以通过命令检查:
go version
如果未安装,可以前往 Go 官方网站 下载并安装。
2. 创建项目目录
首先,创建一个新的项目目录并进入其中:
mkdir go-zero-jwt-example
cd go-zero-jwt-example
3. 初始化 Go 模块
初始化你的 Go 项目:
go mod init go-zero-jwt-example
4. 安装依赖
安装 go-zero
和 jwt-go
库:
go get github.com/zeromicro/go-zero@latest
go get github.com/dgrijalva/jwt-go@latest
5. 编写代码
在项目目录下,创建一个新的 Go 文件(如 main.go
),并添加如下代码来实现 JWT 身份验证的基本功能:
package main
import (
"net/http"
"strings"
"github.com/dgrijalva/jwt-go"
"github.com/zeromicro/go-zero/rest"
)
var jwtSecret = []byte("your_secret_key") // 请替换为更强的密钥
// User structure for demonstration purpose.
type User struct {
Username string `json:"username"`
}
// GenerateJWT generates a new JWT token.
func GenerateJWT(username string) (string, error) {
claims := jwt.MapClaims{
"username": username,
"exp": jwt.At(time.Now().Add(time.Hour * 72).Unix()),
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
return token.SignedString(jwtSecret)
}
func loginHandler(w http.ResponseWriter, r *http.Request) {
username := r.FormValue("username")
// Here you should validate the username and password against your database.
token, err := GenerateJWT(username)
if err != nil {
http.Error(w, "Could not generate token", http.StatusInternalServerError)
return
}
w.Write([]byte(token))
}
func protectedHandler(w http.ResponseWriter, r *http.Request) {
tokenStr := r.Header.Get("Authorization")
if !strings.HasPrefix(tokenStr, "Bearer ") {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
tokenStr = strings.TrimPrefix(tokenStr, "Bearer ")
_, err := jwt.Parse(tokenStr, func(token *jwt.Token) (interface{}, error) {
return jwtSecret, nil
})
if err != nil || !token.Valid {
http.Error(w, "Invalid token", http.StatusUnauthorized)
return
}
w.Write([]byte("Welcome to the protected route!"))
}
func main() {
r := rest.NewServer()
defer r.Stop()
r.POST("/login", loginHandler)
r.GET("/protected", protectedHandler)
r.Start()
}
6. 编译和运行应用程序
保存文件后,你可以使用以下命令来编译并运行应用程序:
go run main.go
或者,如果你想生成二进制文件,可以执行:
go build -o myapp .
./myapp # 在 Unix/Linux 系统上运行;Windows 上直接运行 myapp.exe。
7. 测试 API
登录以获取 Token:
使用 cURL 或 Postman 等工具发送请求以获取 JWT。
示例 cURL 命令:
curl -X POST -d 'username=your_username' http://localhost:8080/login
使用 Token 访问保护资源:
将返回的 Token 用于访问受保护的资源。
示例 cURL 命令:
curl -H 'Authorization: Bearer <your_token>' http://localhost:8080/protected
确保替换 <your_token>
为实际返回的 JWT。
注意事项
- 安全性:请勿在生产环境中硬编码密钥,应从安全配置源(如环境变量)读取。
- 用户管理:该示例没有包含用户注册和密码加密等功能,这在实际应用中是必要的。
- 错误处理:请根据需求扩展错误处理逻辑,以增强用户体验。
内容由零声教学AI助手提供,问题来源于学员提问