ZBLOG

go-zero 实现jwt 校验token 的api接口 包含api文件

下面是一个使用 Go-Zero 框架实现 JWT 校验的 API 接口示例,包括完整的 API 文件和相关代码结构。这个示例将涵盖 API 的定义、JWT 中间件以及基本的登录逻辑以生成 JWT。

1. 创建项目结构

你可以创建一个新的 Go 项目,目录结构如下:

  1. my-go-zero-project/
  2. ├── api/
  3. └── user.api
  4. ├── config/
  5. └── etc.yaml
  6. ├── middleware/
  7. └── jwt.go
  8. ├── model/
  9. └── user_model.go
  10. ├── main.go
  11. └── auth.go

2. 创建 user.api 文件

api/user.api 文件中定义接口。

  1. syntax = "proto3";
  2. package api;
  3. service User {
  4. rpc Login (LoginRequest) returns (LoginResponse);
  5. rpc Protected (ProtectedRequest) returns (ProtectedResponse);
  6. }
  7. message LoginRequest {
  8. string username = 1;
  9. string password = 2;
  10. }
  11. message LoginResponse {
  12. string token = 1;
  13. }
  14. message ProtectedRequest {}
  15. message ProtectedResponse {
  16. string message = 1;
  17. }

3. 创建用户模型(model/user_model.go)

我们可以创建一个简单的用户模型来模拟用户数据。

  1. // model/user_model.go
  2. package model
  3. type User struct {
  4. Username string
  5. Password string // 注意:实际应用中请不要明文存储密码,应进行加密处理。
  6. }
  7. // 模拟用户登录检查的方法
  8. func ValidateUser(username, password string) bool {
  9. // 在这里,我们假设只有一个用户名为 "test" 的用户,密码为 "password"
  10. return username == "test" && password == "password"
  11. }

4. 实现 JWT 中间件(middleware/jwt.go)

创建一个 JWT 中间件,用于校验 token。

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

5. 实现身份验证逻辑(auth/auth.go)

创建用于生成 JWT 的函数。

  1. // auth/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(username string) (string, error) {
  9. expirationTime := time.Now().Add(24 * time.Hour)
  10. clams := &jwt.StandardClaims{
  11. Subject: username,
  12. ExpiresAt: expirationTime.Unix(),
  13. }
  14. token := jwt.NewWithClaims(jwt.SigningMethodHS256, clams)
  15. return token.SignedString(jwtSecret)
  16. }

6. 实现主程序(main.go)

最后,在主程序中设置 HTTP 路由,并实现 API 的处理逻辑。

  1. // main.go
  2. package main
  3. import (
  4. "encoding/json"
  5. "net/http"
  6. _ "github.com/go-sql-driver/mysql" // MySQL 驱动,根据需要引入数据库驱动。
  7. "github.com/gorilla/mux"
  8. "./api" // 修改为你实际的路径
  9. "./middleware" // 修改为你实际的路径
  10. "./auth" // 修改为你实际的路径
  11. "./model" // 修改为你实际的路径
  12. )
  13. func main() {
  14. r := mux.NewRouter()
  15. r.HandleFunc("/api/login", loginHandler).Methods("POST")
  16. r.Handle("/api/protected", middleware.JwtMiddleware(http.HandlerFunc(protectedHandler))).Methods("GET")
  17. http.ListenAndServe(":8080", r)
  18. }
  19. // 登录处理函数,生成JWT Token。
  20. func loginHandler(w http.ResponseWriter, r *http.Request) {
  21. var req api.LoginRequest
  22. if err := json.NewDecoder(r.Body).Decode(&req); err != nil || req.Username == "" || req.Password == "" {
  23. http.Error(w, "Invalid request", http.StatusBadRequest)
  24. return
  25. }
  26. if !model.ValidateUser(req.Username, req.Password) {
  27. http.Error(w, "Invalid credentials", http.StatusUnauthorized)
  28. return
  29. }
  30. token, err := auth.GenerateToken(req.Username)
  31. if err != nil {
  32. http.Error(w,"Could not generate token",http.StatusInternalServerError)
  33. return
  34. }
  35. w.Header().Set("Content-Type", "application/json")
  36. json.NewEncoder(w).Encode(api.LoginResponse{Token: token})
  37. }
  38. // 受保护的路由处理函数。
  39. func protectedHandler(w http.ResponseWriter, r *http.Request) {
  40. userID := r.Context().Value("userID") // 从上下文获取用户信息(如果有的话)
  41. message := fmt.Sprintf("This is a protected route for user: %s.", userID.(string))
  42. w.Write([]byte(message))
  43. }

7. 启动服务器并测试接口

现在,你可以启动服务器:

  1. go run main.go middleware/jwt.go auth/auth.go model/user_model.go api/user.api # 根据需要调整命令格式.

测试 API 接口:

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

这将返回一个 JSON 响应,其中包含生成的 JWT Token。

  1. 调用受保护接口
  1. curl -H "Authorization: Bearer your_jwt_token" http://localhost:8080/api/protected

确保替换 your_jwt_token 为从登录接口获得的 Token。如果有效,你会看到对应的信息响应。

这样就完成了在 Go-Zero 框架中实现带有 JWT 校验的 API 接口!如果还有其他问题或需求,请随时询问!


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?