ZBLOG

go-zero框架的 jwt-go api框架设计

Go-zero 是一个高性能的微服务框架,支持多种功能,包括 JWT(JSON Web Token)认证。以下是使用 go-zero 框架设计 JWT API 的基本步骤和示例:

1. 环境准备

首先确保你已经安装了 Go 语言环境以及 go-zero 框架。

  1. go get -u github.com/zeromicro/go-zero

2. 创建项目结构

建议的项目结构如下:

  1. your_project/
  2. ├── api/
  3. └── your_api.api
  4. ├── model/
  5. └── user.go
  6. ├── service/
  7. ├── your_service.go
  8. └── jwt.go
  9. └── main.go

3. 定义 API 接口

api/your_api.api 文件中定义你的 API 接口:

  1. syntax = "proto3";
  2. package your_api;
  3. service YourService {
  4. rpc Login(LoginRequest) returns (LoginResponse);
  5. }
  6. message LoginRequest {
  7. string username = 1;
  8. string password = 2;
  9. }
  10. message LoginResponse {
  11. string token = 1;
  12. }

然后使用 go-zero 的工具生成代码:

  1. goctl rpc proto -src api/your_api.api -dir .

4. 实现 JWT 功能

service/jwt.go 中实现 JWT 的创建与解析逻辑:

  1. package service
  2. import (
  3. "github.com/dgrijalva/jwt-go"
  4. "time"
  5. )
  6. var secretKey = []byte("your_secret_key")
  7. type Claims struct {
  8. Username string `json:"username"`
  9. jwt.StandardClaims
  10. }
  11. // GenerateToken generates a new JWT token.
  12. func GenerateToken(username string) (string, error) {
  13. claims := Claims{
  14. Username: username,
  15. StandardClaims: jwt.StandardClaims{
  16. ExpiresAt: time.Now().Add(time.Hour * 72).Unix(),
  17. },
  18. }
  19. token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
  20. return token.SignedString(secretKey)
  21. }
  22. // ParseToken parses the token and returns the claims.
  23. func ParseToken(tokenString string) (*Claims, error) {
  24. claims := &Claims{}
  25. token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
  26. return secretKey, nil
  27. })
  28. if err != nil || !token.Valid {
  29. return nil, err
  30. }
  31. return claims, nil
  32. }

5. 实现登录逻辑

service/your_service.go 中实现登录接口逻辑并返回 JWT:

  1. package service
  2. import (
  3. "context"
  4. "your_project/api"
  5. "github.com/zeromicro/go-zero/core/logx"
  6. )
  7. type YourService struct{}
  8. func (s *YourService) Login(ctx context.Context, req *api.LoginRequest) (*api.LoginResponse, error) {
  9. // 假设用户验证通过,这里可以添加数据库查询验证用户的逻辑。
  10. if req.Username == "test" && req.Password == "password" { // 示例用户验证
  11. token, err := GenerateToken(req.Username)
  12. if err != nil {
  13. logx.Error(err)
  14. return nil, err
  15. }
  16. return &api.LoginResponse{Token: token}, nil
  17. }
  18. return nil, errors.New("invalid credentials")
  19. }

6. 启动服务

main.go 中启动服务并注册路由:

  1. package main
  2. import (
  3. "log"
  4. "your_project/service"
  5. "github.com/zeromicro/go-zero/zrpc"
  6. )
  7. func main() {
  8. srv := zrpc.MustNewServer(zrpc.RpcServerConf{
  9. // 配置服务器参数...
  10. Port: 8080,
  11. })
  12. defer srv.Stop()
  13. api.RegisterYourServiceServer(srv.GetConn(), &service.YourService{})
  14. log.Println("Starting server at port:", srv.Port())
  15. srv.Start()
  16. }

总结

以上是使用 go-zero 框架设计基于 JWT 的 API 的基本流程。在实际应用中,你还需要加入更多的错误处理、配置管理、数据库连接等功能。希望这个示例能帮助你入门 go-zero 和 JWT!


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?