Dapr|应用间相互调用-鉴权方式
摘要
两个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()
}
}