ZBLOG

go-zero 实现jwt 校验tokende api接口组

在 Go-Zero 中实现 JWT 校验的 API 接口组,可以通过以下步骤进行设置。下面将提供一个完整的示例,演示如何创建带有 JWT 校验的 API 接口。

1. 安装依赖

确保你已经安装了 go-zerojwt-go 库:

  1. go get github.com/zeromicro/go-zero
  2. go get github.com/dgrijalva/jwt-go

2. 创建 JWT 中间件

首先,我们需要创建一个中间件来处理 JWT 的验证逻辑。

  1. // middleware/jwt.go
  2. package middleware
  3. import (
  4. "net/http"
  5. "strings"
  6. "github.com/dgrijalva/jwt-go"
  7. )
  8. var jwtSecret = []byte("your_secret_key") // 替换为你的密钥
  9. func JwtMiddleware(next http.Handler) http.Handler {
  10. return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  11. tokenString := r.Header.Get("Authorization")
  12. if tokenString == "" || !strings.HasPrefix(tokenString, "Bearer ") {
  13. http.Error(w, "Unauthorized", http.StatusUnauthorized)
  14. return
  15. }
  16. tokenString = strings.TrimPrefix(tokenString, "Bearer ")
  17. claims := &jwt.StandardClaims{}
  18. token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
  19. return jwtSecret, nil
  20. })
  21. if err != nil || !token.Valid {
  22. http.Error(w, "Unauthorized", http.StatusUnauthorized)
  23. return
  24. }
  25. // 可以根据需要将用户信息添加到上下文中,这里仅作为示例
  26. ctx := r.Context()
  27. ctx = context.WithValue(ctx, "userID", claims.Subject)
  28. r = r.WithContext(ctx)
  29. next.ServeHTTP(w, r)
  30. })
  31. }

3. 创建 API 接口和路由

然后我们可以定义一些接口并应用上面的 JWT 中间件。

  1. // main.go
  2. package main
  3. import (
  4. "net/http"
  5. "github.com/gorilla/mux"
  6. "your_project_path/middleware" // 修改为实际路径
  7. )
  8. func main() {
  9. r := mux.NewRouter()
  10. // 定义受保护的路由,并应用JWT中间件
  11. r.Handle("/api/protected", middleware.JwtMiddleware(http.HandlerFunc(protectedHandler))).Methods("GET")
  12. // 启动HTTP服务器
  13. http.ListenAndServe(":8080", r)
  14. }
  15. func protectedHandler(w http.ResponseWriter, r *http.Request) {
  16. userID := r.Context().Value("userID") // 从上下文获取用户信息(如果有的话)
  17. w.Write([]byte("This is a protected route for user ID: " + userID.(string)))
  18. }

4. 生成和签发 JWT Token 的函数(可选)

你可能还想要一个函数来生成和返回有效的 JWT Token,以便进行身份验证。这可以在你需要登录的地方调用:

  1. // auth.go
  2. package auth
  3. import (
  4. "time"
  5. "github.com/dgrijalva/jwt-go"
  6. )
  7. var jwtSecret = []byte("your_secret_key") // 替换为你的密钥
  8. func GenerateToken(userID string) (string, error) {
  9. expirationTime := time.Now().Add(24 * time.Hour)
  10. clams := &jwt.StandardClaims{
  11. Subject: userID,
  12. ExpiresAt: expirationTime.Unix(),
  13. }
  14. token := jwt.NewWithClaims(jwt.SigningMethodHS256, clams)
  15. return token.SignedString(jwtSecret)
  16. }

5. 使用 Postman 或 Curl 测试接口

登录并获取 Token 示例:

假设你已经实现了用户登录并生成了 Token,你可以使用如下方式测试获取 Token:

  1. curl -X POST -d '{"username": "test", "password": "password"}' -H 'Content-Type: application/json' http://localhost:8080/api/login

这将返回一个有效的 Bearer Token。

调用受保护的接口:

  1. curl -H "Authorization: Bearer your_jwt_token" http://localhost:8080/api/protected

如果 token 有效,你会看到类似于 "This is a protected route for user ID: ..." 的响应。

注意事项:

  • 安全性:请勿将敏感信息(如 secret key)硬编码在代码中,建议使用环境变量。
  • 错误处理:生产代码应包含详细的错误处理机制,以帮助调试和追踪问题。
  • Token管理:可以考虑实现 Token 刷新、失效等功能,根据业务需求增加更多功能。

这样,你就成功地在 Go-Zero 框架中实现了带有 JWT 校验的 API 接口。如果有任何疑问或其他需求,请随时询问!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=22322

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?