首页 > 其他分享 >go-zero开发入门-API网关鉴权开发示例

go-zero开发入门-API网关鉴权开发示例

时间:2023-12-10 20:34:39浏览次数:40  
标签:网关 示例 zero 鉴权 token API go gateway

本文是go-zero开发入门-API网关开发示例一文的延伸,继续之前请先阅读此文。

在项目根目录下创建子目录 middleware,在此目录下创建文件 auth.go,内容如下:

// 鉴权中间件
package middleware

import (
    "context"
    "errors"
    "net/http"
)

var ErrInvalidToken = errors.New("invalid token")

func AuthMiddleware(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        token := r.Header.Get("Authorization")
        // 调用登录服务接口生成鉴权信息
        // 这里只是一个示例,实际需替换为实际的登录服务调用
        if token != "valid-token" {
            w.Write([]byte("invalid token"))
            return
        }

        // 将鉴权信息添加到请求上下文中
        ctx := context.WithValue(r.Context(), "token", token)
        next.ServeHTTP(w, r.WithContext(ctx))
    }
}

在网关 main.go 文件中加入鉴权中间件:

package main

import (
    "flag"
    "fmt"
    "gateway/middleware"

    "github.com/zeromicro/go-zero/core/conf"
    "github.com/zeromicro/go-zero/gateway"
)

var configFile = flag.String("f", "etc/gateway.yaml", "the config file")

func main() {
    var c gateway.GatewayConf
    flag.Parse()
    
    conf.MustLoad(*configFile, &c)
    server := gateway.MustNewServer(c)
    server.Use(middleware.AuthMiddleware) // 使用 server 的 Use() 方法添加全局中间件
    defer server.Stop()

    fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port)
    server.Start()
}

在网关的配置文件 etc/gateway.yaml 中加入鉴权:

Name: go-zero-gateway
Host: 0.0.0.0
Port: 9999
Upstreams:
  - Grpc:
      Etcd:
        Hosts:
        - 127.0.0.1:2379
        Key: add.rpc
    ProtoSets:
        - /root/go-zero/gateway/proto/add.pb
    Mappings: # Mappings can also be written in proto options
      - Method: get
        Path: /add
        RpcPath: add.Adder/add
    Headers: 
        - Authorization

编译生成网关可执行程序文件:

# cat Makefile 
all: gateway
gateway: main.go
        go build -o gateway main.go 

clean:
        rm -f gateway

rpc:
        goctl gateway -dir gateway

启动网关:

./gateway

请求网关:

# curl -i '127.0.0.1:9999/add?a=1&b=2'
HTTP/1.1 200 OK
Traceparent: 00-1cd6f9f8c902193d8dd7da646f775d0d-4959382686bbb075-00
Date: Sun, 10 Dec 2023 12:04:40 GMT
Content-Length: 13
Content-Type: text/plain; charset=utf-8

invalid token

标签:网关,示例,zero,鉴权,token,API,go,gateway
From: https://www.cnblogs.com/aquester/p/17893176.html

相关文章

  • Sync File API 指南【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/driver-api/sync_file.htmlSyncFileAPIGuide本文档旨在为设备驱动程序编写者提供有关sync_fileAPI的指南,以及驱动程序如何支持它。Syncfile是需要在驱动程序之间或跨进程边界同步的fences(structdma_fence)的载体。sync_fileAPI旨......
  • Java实现对Hadoop HDFS的API操作
    1.配置Hadoop的Windows客户端Hadoop配置Windows客户端2.新建Maven项目[略]3.添加依赖<!--https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client--><dependency><groupId>org.apache.hadoop</groupId>......
  • 幺半群同态一个示例的双向分析
    全体自然数(含0)在加法下构成一个幺半群,记作(N,+),而全体正整数在乘法下也构成一个幺半群,记作(Z+,·).假设映射f:N→ Z+满足 ①    ∀x,y∈N,  f(x+y)=f(x)·f(y). 令y=0,代入①有f(x)=f(x)·f(0),由此可知f(0)=1,即f把 (N,+)中的单位......
  • 【UniApp】-uni-app-OptionAPI应用生命周期和页面生命周期
    前言好,经过上个章节的介绍完毕之后,了解了一下uni-app-修改组件主题和样式那么了解完了uni-app-修改组件主题和样式之后,这篇文章来给大家介绍一下uni-app-OptionAPI应用生命周期和页面生命周期首先不管三七二十一,先来新建一个项目搭建演示环境创建一个全新的项目:然后在......
  • API网关
    1.API网关:(1)什么是网关?微服务背景下,一个系统被拆分为多个服务,但是像安全认证,流量控制,日志,监控等功能是每个服务都需要的,没有网关的话,我们就需要在每个服务中单独实现,重复且零散。实际上,网关主要做了两件事情:请求转发+请求过滤。由于引入网关之后,会多一步网络转......
  • refcount_t API 与 atomic_t 的比较 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/core-api/refcount-vs-atomic.htmlrefcount_tAPI与atomic_t的比较介绍相关的内存排序类型函数比较非“读/修改/写”(RMW)操作基于增量的操作,不返回值基于减量的RMW操作,不返回值基于增量的RMW操作,返回值通用的减......
  • thinkphp---电子签章功能开发示例
    最近在做一个项目,需要开发电子签章的功能,也就是电子合同,下面:具体思路:利用PDF合成,将所需要的文字,图片,合成到PDF里面。首先下载Fpdi库:https://gitee.com/meiyouzhanghao/fpdi放到extend里面: 具体代码示例:<?phpnamespaceapp\index\controller;useapp\BaseControll......
  • 核心API文档 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/core-api/index.html#memory-management核心API文档这是核心内核API手册的开头部分。非常感谢您进行文档的转换和编写!核心实用程序本节包含一般和“核心核心”文档。首先是一大堆来自docbook时代的kerneldoc信息,实际上应该在有人有精......
  • 饮冰十年-人工智能-FastAPI-03- FastAPI之模型迁移(类似Django的migrante)
         在开发Web应用程序时,通常会涉及到数据库模型的更改,例如添加新的表、字段或索引。为了使这些更改反映在数据库中,我们使用数据库迁移工具。FastAPI本身并不包含数据库迁移(migration)的功能,但你可以使用第三方库来处理数据库迁移。其中,Alembic是一个常用的数据库迁......
  • FastAPI-请求参数与验证
    最近想搞一下接口,希望能简单上手,前后端分离,大致看了一遍SpringBoot,Gin,NodeJs,Flask,Django,FastAPI等,感觉还是用Python语言来写比较简单呀,关键点在于它语法清晰,能让我直接思考业务逻辑,而不是各种语法折腾.FASTAPI简介Documentation:https://fastap......