Go-zero 是一个高性能的微服务框架,支持多种功能,包括 JWT(JSON Web Token)认证。以下是使用 go-zero 框架设计 JWT API 的基本步骤和示例:
1. 环境准备
首先确保你已经安装了 Go 语言环境以及 go-zero 框架。
go get -u github.com/zeromicro/go-zero
2. 创建项目结构
建议的项目结构如下:
your_project/
├── api/
│ └── your_api.api
├── model/
│ └── user.go
├── service/
│ ├── your_service.go
│ └── jwt.go
└── main.go
3. 定义 API 接口
在 api/your_api.api
文件中定义你的 API 接口:
syntax = "proto3";
package your_api;
service YourService {
rpc Login(LoginRequest) returns (LoginResponse);
}
message LoginRequest {
string username = 1;
string password = 2;
}
message LoginResponse {
string token = 1;
}
然后使用 go-zero 的工具生成代码:
goctl rpc proto -src api/your_api.api -dir .
4. 实现 JWT 功能
在 service/jwt.go
中实现 JWT 的创建与解析逻辑:
package service
import (
"github.com/dgrijalva/jwt-go"
"time"
)
var secretKey = []byte("your_secret_key")
type Claims struct {
Username string `json:"username"`
jwt.StandardClaims
}
// GenerateToken generates a new JWT token.
func GenerateToken(username string) (string, error) {
claims := Claims{
Username: username,
StandardClaims: jwt.StandardClaims{
ExpiresAt: time.Now().Add(time.Hour * 72).Unix(),
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
return token.SignedString(secretKey)
}
// ParseToken parses the token and returns the claims.
func ParseToken(tokenString string) (*Claims, error) {
claims := &Claims{}
token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
return secretKey, nil
})
if err != nil || !token.Valid {
return nil, err
}
return claims, nil
}
5. 实现登录逻辑
在 service/your_service.go
中实现登录接口逻辑并返回 JWT:
package service
import (
"context"
"your_project/api"
"github.com/zeromicro/go-zero/core/logx"
)
type YourService struct{}
func (s *YourService) Login(ctx context.Context, req *api.LoginRequest) (*api.LoginResponse, error) {
// 假设用户验证通过,这里可以添加数据库查询验证用户的逻辑。
if req.Username == "test" && req.Password == "password" { // 示例用户验证
token, err := GenerateToken(req.Username)
if err != nil {
logx.Error(err)
return nil, err
}
return &api.LoginResponse{Token: token}, nil
}
return nil, errors.New("invalid credentials")
}
6. 启动服务
在 main.go
中启动服务并注册路由:
package main
import (
"log"
"your_project/service"
"github.com/zeromicro/go-zero/zrpc"
)
func main() {
srv := zrpc.MustNewServer(zrpc.RpcServerConf{
// 配置服务器参数...
Port: 8080,
})
defer srv.Stop()
api.RegisterYourServiceServer(srv.GetConn(), &service.YourService{})
log.Println("Starting server at port:", srv.Port())
srv.Start()
}
总结
以上是使用 go-zero 框架设计基于 JWT 的 API 的基本流程。在实际应用中,你还需要加入更多的错误处理、配置管理、数据库连接等功能。希望这个示例能帮助你入门 go-zero 和 JWT!
内容由零声教学AI助手提供,问题来源于学员提问