ZBLOG

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

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助手提供,问题来源于学员提问

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?