【go-micro实践】micro API 网关增加JWT鉴权功能

Go+gRPC-Gateway(V2) 微服务实战,小程序登录鉴权服务(五):鉴权 gRPC-Interceptor 拦截器实战... 拦截器(gRPC-Interceptor)类似于 Gin 中间件(Middleware),让你在真正调用 RPC 服务前,进行身份认证、参数校验、限流等通用操作。 系列 云原生 API 网关,gRPC-Gateway V2 初探 Go + gRPC-Gateway(V2) 构建微服务实战系列,小程序登录鉴权服务:第一篇 Go + gRPC-Gateway(V2) 构建微服务实战系列,小程序... 阅读详情

github完整代码地址
个人博客

micro API网关

micro API网关是基于go-micro开发的,具有服务发现,负载均衡和RPC通信的能力。

业界普遍做法是将鉴权,限流,熔断等功能也纳入API网关。micro API网关本身是可插拔的,可以通过新增插件的方式加入其他功能。

JWT (JSON Web Token)

JWT是是微服务中常用的授权技术,关于JWT的技术原理可以参考阮一峰的博文

JWT库封装

  • lib/token 目录下封装了JWT的库。有一点特殊的是,库中利用consul的KV存储和micro的go-config库实现了动态更新JWT的PrivateKey功能,实际生产中还是应该使用拥有发布和权限管理的配置中心。
    • go-config 是micro作者实现的一个可动态加载、可插拔的配置库,可以从多种格式文件或者远程服务获取配置。详情可以参考文档中文文档|英文文档
    • PrivateKey是JWT在编解码时使用的私钥,一旦泄漏,客户端便可以利用这个私钥篡改、伪造Token。所以一般生产环境中都必须具备动态更新私钥的能力,一旦发现泄漏可以立即更改,或者定期更换私钥,提高安全性。
// InitConfig 初始化
func (srv *Token) InitConfig(address string, path ...string) {
	consulSource := consul.NewSource(
		consul.WithAddress(address),
	)
	srv.conf = config.NewConfig()
	err := srv.conf.Load(consulSource)
	if err != nil {
		log.Fatal(err)
	}

	value := srv.conf.Get(path...).Bytes()
	if err != nil {
		log.Fatal(err)
	}

	srv.put(value)
	log.Println("JWT privateKey:", string(srv.get()))
	srv.enableAutoUpdate(path...)
}

func (srv *Token) enableAutoUpdate(path ...string) {
	go func() {
		for {
			w, err := srv.conf.Watch(path...)
			if err != nil {
				log.Println(err)
			}
			v, err := w.Next()
			if err != nil {
				log.Println(err)
			}

			value := v.Bytes()
			srv.put(value)
			log.Println("New JWT privateKey:", string(srv.get()))
		}
	}()
}

作者已经实现了consul的KV配置的插件,所以只需要导入这个库"github.com/micro/go-config/source/consul",便可以直接读取consul中的配置。

动态跟新实现就是利用go-config的watch方法,当consul KV里的配置更改,Watch函数返回再通过Next方法读取新数据。将watch 读取的操作起一个协程循环执行(没有考虑优雅退出),通过读写锁来保证操作安全。

实现API网关插件

将JWT Token在HTTP头中携带,通过HTTP中间件过滤每一个HTTP请求,提取头中的Token鉴权,通过则继续执行,不通过就直接返回。

//microservices/lib/wrapper/auth

// JWTAuthWrapper JWT鉴权Wrapper
func JWTAuthWrapper(token *token.Token) plugin.Handler {
	return func(h http.Handler) http.Handler {
		return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
			log.Println("auth plugin received: " + r.URL.Path)
			// TODO 从配置中心动态获取白名单URL
			if r.URL.Path == "/user/login" || r.URL.Path == "/user/register"{
				h.ServeHTTP(w, r)
				return
			}

			tokenstr := r.Header.Get("Authorization")
			userFromToken, e := token.Decode(tokenstr)

			if e != nil {
				w.WriteHeader(http.StatusUnauthorized)
				return
			}

			log.Println("User Name : ", userFromToken.UserName)
			r.Header.Set("X-Example-Username", userFromToken.UserName)
			h.ServeHTTP(w, r)
		})
	}
}
 ...

// main.go
func init() {
	token := &token.Token{}
	token.InitConfig("127.0.0.1:8500", "micro", "config", "jwt-key", "key")

	plugin.Register(plugin.NewPlugin(
		plugin.WithName("auth"),
		plugin.WithHandler(
			auth.JWTAuthWrapper(token),
		),
	))
}
const name = "API gateway"

func main() {
	cmd.Init()
}
  • 初始化我们封装JWT Token
func (srv *Token) InitConfig(address string, path ...string)
token.InitConfig("127.0.0.1:8500", "micro", "config", "jwt-key", "key")

“127.0.0.1:8500” 是本地consul 监听地址,path是可变参数,传递consul KV中的配置路径:micro/config/jwt-key。
在这里插入图片描述

  • 注册插件
func Register(plugin Plugin) error //全局注册一个插件
func NewPlugin(opts ...Option) Plugin //生成一个插件
func WithName(n string) Option //设置插件的名字
func WithHandler(h ...Handler) Option  //http handler中间件

注册一个新插件的时候,还可以定制其他操作,具体可以看作者的文档英文文档|中文文档

在hander中将Token进行校验,如果鉴权成功,则调用 h.ServeHTTP(w, r) ,此时micro会调用下一个hander。
如果鉴权失败,就修改状态码w.WriteHeader(http.StatusUnauthorized), 不调用 h.ServeHTTP(w, r),此时链式调用中断,micro框架不会调用剩下的hander。

github完整代码地址

.net微服务框架解决方案(配置中心+),前后端分离 微服务:单点登陆SSO,token授权-OAUTH/JWT,服务发现注册consul,配置中心,api网关Ocelot、垄断Polly,消息总线ribitmq、定时调度总线quartz,数据集群:mysql集群、redis集群、solr集群。 web后端:IOC/DI-autofac,ORM-sqlSugar,AOP-Castle web前端:MVVM-Vue.js,webpack 立即下载

相关推荐

中兴B860AV2.1-A刷机避坑指南:晶晨免拆神器+安卓7.1.2固件实测

本文提供中兴B860AV2.1-A机顶盒的详细刷机教程,重点介绍使用晶晨免拆神器配合安卓7.1.2线刷固件包的实操步骤。内容涵盖刷机前的硬件确认、工具准备、软件设置、烧录全过程监控及常见问题解决,旨在帮助用户安全、高效地完成刷机,规避变砖风险,释放设备潜力。

pytorch8learner的博客 749

Golang Gin框架搭建项目(五)jwt登录和权限验证

1、AuthUtil.go : 用于生成和解析token 2、jwt相关配置:额外加上以下内容Golang Gin框架搭建项目(二)解析json配置文件_Bear Coding的博客-优快云博客_gin解析json 3、登录接口:不包含业务逻辑,只验证jwt功能.........

qq_26900081的博客 5421

【SPSS实战】手动实现Quade非参数协方差分析:从数据准备到结果解读

本文详细介绍了在SPSS中手动实现Quade非参数协方差分析的实战方法。当数据不满足正态分布等参数检验假设时,通过将协变量和因变量转换为秩,并利用秩回归残差进行Kruskal-Wallis组间比较,提供了一种清晰、可操作的近似解决方案。该方法有效解决了非正态数据的协变量调整问题,适用于实验研究和调查数据分析。

bean的博客 468

基于go-micro微服务的实战-Gateway网关层的鉴权-rbac(六)

go-micro的认证授权rbac

toegg的博客 1229

FH8626V100之开发环境搭建

FH8626V100是富瀚微出的一款带摄像头的方案,开发工具在Linux 上进行。版本 Ubuntu 20.04 64位。

xue_nuo的博客 1万+

apollo-减速带通行

主车在通过减速带时速度不超过3m/s

是菜鸟o的博客 390

基于go-micro微服务的实战-实现网关Gateway(三)

go-micro v3的实现网关Gateway

toegg的博客 1844

固定效应模型-以stata为工具

固定效应模型(Fixed Effects Model)是一种面板数据分析方法,通过引入个体固定效应来控制个体间的异质性,并更准确地估计解释变量对因变量的影响。它在许多经济、社会科学和健康研究中被广泛应用。

侯小啾技术博客 2840

【go语言微服务实践】#5-go-micro实现JWT认证

线上答题系统,微服务架构的小小实践,项目代码 一、服务认证概述   处于安全和保密要求,常常要对API的请求进行鉴权。目前常见的鉴权的方法有JWT、OAuth2.0、OpenID等。我们系统选用的是比较简便的JWT方式。请求端web应用,使用beego框架,服务端是对外提供API的微服务,使用go-micro框架。客户端和服务器端使用RPC(远程过程调用)的方式进行API的调用。因此我们要实现...

LittleRong_G的博客 1453

C#联合Halcon机器视觉框架源码—升级版

相较于之前的NxtVision,本软件代码架构更加合理,且新增。对源码有需求的,订阅本专栏后,私信我领取。、原来的vb脚本改为。

Z's Palace 1416

信号处理仿真:自适应信号处理_(8).自适应信道均衡

在无线通信系统中,信道的多径效应和时变特性会导致信号的失真,从而影响通信质量。自适应信道均衡技术通过实时调整均衡器的参数,以补偿信道失真,提高信号的质量和可靠性。本节将详细介绍自适应信道均衡的原理、算法和实现方法,并通过具体的仿真例子来说明其应用。

2401_87715305的博客 1040

(12)go-micro微服务JWT跨域认证

JWT 英文名是 Json Web Token ,是一种用于通信双方之间传递安全信息的简洁的、URL安全的表述性声明规范,经常用在跨域身份验证。JWT 以 JSON 对象的形式安全传递信息。因为存在数字签名,因此所传递的信息是安全的。一个JWT Token就像这样:头部(Header)负载(Payload)签名(Signature)头部和负载以jSON形式存在,这就是JWT中的JSON,三部分的内容都分别单独经过了Base64编码,以.拼接成一个JWT Token。

夏沫の梦的博客 720

2026年运维工程师常见面试选择题

这篇文章总结了30道Linux运维面试常见问题及解析,涵盖基础命令、系统监控、故障排查、数据库、缓存、容器编排等多个方面。主要内容包括: 基础命令使用:如df查看磁盘、free查看内存、top监控进程等 系统监控与故障排查:负载判断、端口检查、进程管理等 中间件相关:Nginx状态码、MySQL主从复制、Redis缓存问题 容器技术:Docker优势、Kubernetes作用 运维理念:高可用、监控告警、发布策略、备份容灾 工作原则:故障处理优先级、运维工程师核心能力 文章不仅提供标准答案,还解析了各命令的

不务正业的猿 194

go-micro V2 从零开始(九)定制网关(1)——集成JWT鉴权

本文相关代码:gitee 文章目录前言步骤一、jaeger1.1 简介1.2 启动二、OpenTracing2.1 简介2.2 配置三、代码改造3.1 WrapHandler3.2 WrapClient3.3 WrapSubscriber3.4 Finished接口web api四、验证总结支持一下 前言 本章属于特别篇,不在我原本的计划内。 这个系列我同步发布在csdn和知乎,前几天我在知乎为数不多的几条评论里,看到了两条对go-micro框架的差评。第一条只是简单的表示这个框架有坑,但是似乎并没有兴趣

hotcoffie的博客 1285

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【go-micro实践】micro 微服务架构实践

Github完整代码地址 个人博客 微服务架构 micro拥有完整的微服务生态,使用它构建一整套完整的微服务架构。下图是作者在博客中给出的使用micro的微服务架构图。 使用micro框架提供的工具Micro API(命令 micro api 运行)即可启动启动一个API网关。 $ go get -u github.com/micro/micro​ $ micro api --help NA...

linux_Allen的博客 751

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

go token验证_go-micro V2 从零开始(九)定制网关(1)——集成JWT鉴权

本文相关代码:gitee 前言熟悉了普通微服务如何集成插件之后,再回顾第四章引入的micro api网关,作为一个封装服务,他足够的便捷易用,但仍不够强大。接下来几章,我们基于官方网关开发定制化的网关,逐步为他集成JWT鉴权和断路器等功能。在生产情况下,不论需求大小都建议在项目中自己编译micro工具,确保开发、生产等环境一致。步骤一、自定义网关之前的网关是使用micro api命令启动的,mic...

weixin_39834488的博客 364

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Go Micro 生产环境 Web 控制台与认证 API 网关:micro server 使用与原理指南

`micro server` 是 go-micro 面向生产环境的可选 Web 控制台与认证 API 网关,它不构建、不运行、也不监听服务进程,而是通过注册中心(registry)发现**已经运行中的服务**,为它们提供带 JWT 认证的 HTTP 访问入口、用户/令牌管理、端点权限(Scopes)以及日志状态查看能力。读完本文你将掌握 `micro server` 的安装启动、与 `micro

gitblog_00270的博客 730

x-gateway:高性能Go-micro网关,助力微服务架构

x-gateway:高性能Go-micro网关,助力微服务架构 项目介绍 在微服务架构中,API网关扮演着至关重要的角色,它不仅是流量的统一入口,还负责认证、鉴权、日志记录、链路追踪等一系列关键功能。x-gateway 是一个基于Go-micro的高性能API网关,旨在为微服务架构提供一个强大且灵活的流量管理解决方案。 x-gateway 不仅继承了Go-micro的强大功能,还增加了自定义的mi...

gitblog_00304的博客 453

go-micro 命令行工具(Micro CLI)实战指南:从服务脚手架到云原生部署

Micro CLI 是 go-micro 框架官方提供的命令行工具集,用于完成 Go 微服务的全生命周期管理:一条命令生成服务工程、一键运行并注册服务、通过 RPC 调用服务端点,还能启动内置的 API 网关与 Web 控制台。本文以仓库中的官方文档 [cmd/micro/cli/README.md](https://link.gitcode.com/i/59cb5a8141fa35db43d1b

gitblog_00180的博客 695

Golang微服务开发实践

github: github.com/yun-mu/Micr… 微服务概念学习:可参考 Nginx 的微服务文章 微服务最佳实践:可参考 微服务最佳实践 demo 简介 服务: consignment-service(货运服务) user-service(用户服务) log-service (日志服务) vessel-service(货船服务) api-service (API 服务) 用到的...

weixin_34049032的博客 1896

使用 go-micro Auth Wrapper 构建微服务认证与授权体系:基于 examples/auth 的完整实战指南

本文以 go-micro 仓库中的 [examples/auth](https://link.gitcode.com/i/ee9b2d8f178e331a3ca4d8f6271928c7) 示例为核心,系统讲解如何利用 go-micro 的 auth 认证抽象与 `wrapper/auth` 包装器,为微服务添加"认证(Authentication)+ 授权(Authorization)"能力。你

gitblog_01175的博客 287

RSA,JWT和Micro微服务框架的权限管理系统

文章目录关于RSA简介关于PKCSgo语言实践生成公钥和私钥私钥签名公钥验证公钥加密私钥解密关于JWT简介go语言实践生成JWT字符串解析JWT字符串源码小探Micro微服务框架的权限管理Micro框架权限管理总览Micro框架内JWT的使用生成JWT验证JWT小结 关于RSA 简介 RSA作为著名的非对称加密算法,在计算机世界里有着广泛的应用。 相对于加密和解密都使用同一份秘钥的对称加密,非对称加密将秘钥分为公钥和私钥两种。加密的时候使用私钥进行加密,加密的内容可以使用公钥进行解密,即达到了非对称加密的效

彼岸花开的彼岸 634

用 Go Micro + MCP 让现有微服务零改造接入 AI Agent

**导读**:本文以 Go Micro 博客平台为例,完整演示如何通过一行 `mcp.WithMCP(":3001")` 把已有的微服务(Users / Posts / Comments / Mail)直接暴露为 MCP(Model Context Protocol)工具,供任意 MCP 兼容的 AI Agent 调用。读完本文,你将掌握 MCP 网关注入方式、工具 Schema 自动生成原理、d

gitblog_00825的博客 457
上一篇: 【go-micro实践】micro 微服务架构实践
下一篇: 【go-micro实践】jaeger分布式链路追踪
惜朝_
博客等级 码龄10年 9粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值