摘要

两个Go语言服务的示例,它们分别提供了鉴权服务和评论服务。

第一个服务是一个简单的鉴权服务,它使用Golang和Gin框架编写。该服务定义了一个POST /auth/verify路由,接收包含Token的JSON请求,然后返回包含UID、Role、Nickname等参数的JSON响应。

第二个服务是一个使用Dapr的评论服务,它包含一个鉴权中间件函数Auth()。该函数从HTTP请求中获取Token,然后使用Dapr客户端调用鉴权服务接口来验证Token。如果验证成功,该函数将允许请求继续处理。

鉴权服务

Golang 鉴权服务,定义了一个 POST /auth/verify 路由

package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

type verifyReq struct {
	Token string `json:"token"`
}

type verifyRes struct {
	Uid      string `json:"uid"`
	Role     string `json:"role"`
	Nickname string `json:"nickname"`
	// 其他需要的参数
}

func main() {
	r := gin.Default()

	r.POST("/auth/verify", func(c *gin.Context) {
		var req verifyReq
		err := c.BindJSON(&req)
		if err != nil {
			// 异常返回
			c.JSON(http.StatusBadRequest, gin.H{})
			return
		}
		// TODO 验证Token,异常返回
		
		// 验证正常, 返回定义数据
		res := verifyRes{
			Uid:      "d7677121-022b-8ae8-fa14-d2b62995d492",
			Role:     "system",
			Nickname: "SystemUser",
		}
		c.JSON(http.StatusOK, res)
	})

	err := r.Run(":8080")
	if err != nil {
		panic(err)
	}
}

评论服务

评论服务 Gin 鉴权中间件代码

package main

import (
	"context"
	"encoding/json"
	"log"

	dapr "github.com/dapr/go-sdk/client"
	"github.com/gin-gonic/gin"
)

var client dapr.Client
var err error

func init() {
	client, err = dapr.NewClient()
	if err != nil {
		panic(err)
	}
}

func Auth() gin.HandlerFunc {
	return func(ctx *gin.Context) {
		tokenStr := ctx.GetHeader("authorization")
		// 请求auth服务接口
		marshal, _ := json.Marshal(map[string]string{
			"token": tokenStr,
		})
		content := &dapr.DataContent{
			ContentType: "application/json", // text/plain
			Data:        marshal,
		}
		out, err := client.InvokeMethodWithContent(context.Background(),
			"auth", "/auth/verify", "POST", content)
		log.Println("resp out", string(out), err)
		// TODO 往下传递 auth 服务返回的数据
		//ctx.Set("uid", "uid")
		//ctx.Set("role", "role")
		ctx.Next()
	}
}