gtoken

介绍

基于GoFrame框架的token插件,通过服务端验证方式实现token认证;已完全可以支撑线上token认证,通过Redis支持集群模式;使用简单,大家可以放心使用;

gtoken优势

gtoken支撑单点应用使用内存存储,也支持集群使用redis存储;完全适用于企业生产级使用;

有效的避免了jwt服务端无法退出问题;

解决jwt无法作废已颁布的令牌,只能等到令牌过期问题;

通过用户扩展信息存储在服务端,有效规避了jwt携带大量用户扩展信息导致降低传输效率问题;

有效避免jwt需要客户端实现续签功能,增加客户端复杂度;支持服务端自动续期,客户端不需要关心续签逻辑;

特性说明

支持token认证,不强依赖于session和cookie,适用jwt和session认证所有场景;

支持单机gcache和集群gredis模式;

# 缓存模式 1 gcache 2 gredis

CacheMode = 2

支持服务端缓存自动续期功能

// 注:通过MaxRefresh,默认当用户第五天访问时,自动续期

// 超时时间 默认10天

Timeout int

// 缓存刷新时间 默认为超时时间的一半

MaxRefresh int

支持分组拦截、全局拦截、深度路径拦截,便于根据个人需求定制拦截器;建议使用分组拦截方式;

框架使用简单,只需要设置登录验证方法以及登录、登出路径即可;

在gtoken v1.4.0版本开始支持分组中间件方式实现,但依然兼容全局和深度中间件实现方式;

安装教程

gopath模式: go get github.com/goflyfox/gtoken

或者 使用go.mod添加 :require github.com/goflyfox/gtoken latest

分组中间件实现

GoFrame官方推荐使用Group方式实现路由和中间件;

使用说明

推荐使用分组方式实现

// 启动gtoken

gfToken := &gtoken.GfToken{

LoginPath: "/login",

LoginBeforeFunc: loginFunc,

LogoutPath: "/user/logout",

}

s.Group("/admin", func(group *ghttp.RouterGroup) {

group.Middleware(CORS)

gfToken.Middleware(group)

group.ALL("/system/user", func(r *ghttp.Request) {

r.Response.WriteJson(gtoken.Succ("system user"))

})

………………

})

登录方法实现,通过username返回空或者r.ExitAll()\r.Exit()处理认证失败;

特别提示:这里注册的路径严格按照GF group方式,所以注册的路径是/admin/login和/admin/user/logout

func Login(r *ghttp.Request) (string, interface{}) {

username := r.GetPostString("username")

passwd := r.GetPostString("passwd")

// TODO 进行登录校验

if username == "" || passwd == "" {

r.Response.WriteJson(gtoken.Fail("账号或密码错误."))

r.ExitAll()

}

return username, ""

}

通过gtoken.GetTokenData(r)获取登录信息

路径拦截规则

AuthExcludePaths: g.SliceStr{"/user/info", "/system/user/*"}, // 不拦截路径 /user/info,/system/user/info,/system/user,

分组中间件实现,不需要设置AuthPaths认证路径,设置也没有作用,需要认证路径为该分组下所有路由;

使用分组拦截的是通过GoFrame的group.Middleware(authMiddleware)方法,对该分组下的所有路由进行拦截;

对登录接口路径loginPath和登出接口路径logoutPath做拦截认证放行,登出放行是为了避免认证过期无法登出情况;

严格按照GoFrame分组中间件拦截优先级;如果使用跨域中间件,建议放在跨域中间件之后;

如果配置AuthExcludePaths路径,会将配置的不拦截路径排除;

逻辑测试

参考sample项目,先运行main.go,然后可运行api_test.go进行测试并查看结果;验证逻辑说明:

访问用户信息,提示未携带token

调用登录后,携带token访问正常

调用登出提示成功

携带之前token访问,提示未登录

=== RUN TestAdminSystemUser

api_admin_test.go:22: 1. not login and visit user

api_admin_test.go:29: {"code":-401,"msg":"请求错误或登录超时","data":""}

api_admin_test.go:42: 2. execute login and visit user

api_admin_test.go:45: {"code":0,"msg":"success","data":"system user"}

api_admin_test.go:51: 3. execute logout

api_admin_test.go:54: {"code":0,"msg":"success","data":"Logout success"}

api_admin_test.go:60: 4. visit user

api_admin_test.go:65: {"code":-401,"msg":"请求错误或登录超时","data":""}

全局中间件实现

使用说明

只需要配置登录路径、登出路径、拦截路径以及登录校验实现即可

// 启动gtoken

gtoken := &gtoken.GfToken{

LoginPath: "/login",

LoginBeforeFunc: loginFunc,

LogoutPath: "/user/logout",

AuthPaths: g.SliceStr{"/user", "/system"}, // 这里是按照前缀拦截,拦截/user /user/list /user/add ...

GlobalMiddleware: true, // 开启全局拦截,默认关闭

}

gtoken.Start()

登录方法实现,通过username返回空或者r.ExitAll()\r.Exit()处理认证失败;

func Login(r *ghttp.Request) (string, interface{}) {

username := r.GetPostString("username")

passwd := r.GetPostString("passwd")

// TODO 进行登录校验

if username == "" || passwd == "" {

r.Response.WriteJson(gtoken.Fail("账号或密码错误."))

r.ExitAll()

}

return username, ""

}

通过gtoken.GetTokenData(r)获取登录信息

路径拦截规则

AuthPaths: g.SliceStr{"/user", "/system"}, // 这里是按照前缀拦截,拦截/user /user/list /user/add ...

AuthExcludePaths: g.SliceStr{"/user/info", "/system/user/*"}, // 不拦截路径 /user/info,/system/user/info,/system/user,

GlobalMiddleware: true, // 开启全局拦截,默认关闭

GlobalMiddleware:true全局拦截的是通过GF的BindMiddleware方法创建拦截/*

GlobalMiddleware:false路径拦截的是通过GF的BindMiddleware方法创建拦截/user*和/system/*

按照中间件优先级路径拦截优先级很高;如果先实现部分中间件在认证前处理需要切换成全局拦截器,严格按照注册顺序即可;

程序先处理认证路径,如果满足;再排除不拦截路径;

如果只想用排除路径功能,将拦截路径设置为/*即可;

逻辑测试

参考sample1项目,先运行main.go,然后可运行api_test.go进行测试并查看结果;验证逻辑说明:

访问用户信息,提示未携带token

调用登录后,携带token访问正常

调用登出提示成功

携带之前token访问,提示未登录

=== RUN TestSystemUser

api_test.go:43: 1. not login and visit user

api_test.go:50: {"code":-401,"msg":"请求错误或登录超时","data":""}

api_test.go:63: 2. execute login and visit user

api_test.go:66: {"code":0,"msg":"success","data":"system user"}

api_test.go:72: 3. execute logout

api_test.go:75: {"code":0,"msg":"success","data":"Logout success"}

api_test.go:81: 4. visit user

api_test.go:86: {"code":-401,"msg":"请求错误或登录超时","data":""}

返回码及配置项

正常操作成功返回0

未登录访问需要登录资源返回401

程序异常返回-99,如编解码错误等

SUCCESS = 0 // 正常

FAIL = -1 // 失败

ERROR = -99 // 异常

UNAUTHORIZED = -401 // 未认证

配置项说明

具体可参考GfToken结构体,字段解释如下:

名称

配置字段

说明

分组中间件

全局中间件

服务名

ServerName

默认空即可

支持

支持

缓存模式

CacheMode

1 gcache 2 gredis 默认1

支持

支持

缓存key

CacheKey

默认缓存前缀GToken:

支持

支持

超时时间

Timeout

默认10天(毫秒)

支持

支持

缓存刷新时间

MaxRefresh

默认为超时时间的一半(毫秒)

支持

支持

Token分隔符

TokenDelimiter

默认_

支持

支持

Token加密key

EncryptKey

默认12345678912345678912345678912345

支持

支持

认证失败提示

AuthFailMsg

默认请求错误或登录超时

支持

支持

是否支持多端登录

MultiLogin

默认false

支持

支持

中间件类型

MiddlewareType

1、Group 2、Bind 3 、Global;

使用分组模式不需要设置

支持

支持

登录路径

LoginPath

登录接口路径

支持

支持

登录验证方法

LoginBeforeFunc

登录验证需要用户实现方法

支持

支持

登录返回方法

LoginAfterFunc

登录完成后调用

支持

支持

登出地址

LogoutPath

登出接口路径

支持

支持

登出验证方法

LogoutBeforeFunc

登出接口前调用

支持

支持

登出返回方法

LogoutAfterFunc

登出接口完成后调用

支持

支持

拦截地址

AuthPaths

此路径列表进行认证

不需要

支持

拦截排除地址

AuthExcludePaths

此路径列表不进行认证

支持

支持

认证验证方法

AuthBeforeFunc

拦截认证前后调用

支持

支持

认证返回方法

AuthAfterFunc

拦截认证完成后调用

支持

支持

文档

感谢

项目支持

go token验证_GitHub - goflyfox/gtoken: 基于gf框架的token插件,通过服务端验证方式实现token认证;...相关推荐

  1. postman关闭ssl验证_【第5期】springboot:苹果内购服务端验证

    ​苹果内购: 只要你在苹果系统购买APP中虚拟物品(虚拟货币,VIP充值等),必须通过内购方式进行支付,苹果和商家进行三七开 验证模式有两种: Validating Receipts With the ...

  2. Sign in with Apple(苹果授权登陆)服务端验证-测试通过版

    Sign in with Apple(苹果授权登陆)服务端验证-测试通过版 1.先引用2个jwt用到的jar包 2.算法的工具类 三方登录调用验证工具类 苹果登录方式有2种,这里介绍基于JWT算法验证 ...

  3. ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)

    ASP.NET MVC通过Model验证帮助我们很容易的实现对数据的验证,在默认的情况下,基于ValidationAttribute的声明是验证被使用,我们只需要将相应的ValidationAttri ...

  4. Sign in with Apple(object-c) 从开发者后台到服务端验证

    Sign in with Apple 前言 准备工作 开发工作(object-c编写) 基本流程 添加依赖库 创建Apple登录Button 向Apple发起请求 接收Apple的回调 注意: 用户注 ...

  5. JSR-303 Bean Validation 介绍及 Spring MVC 服务端验证最佳实践

    任何时候,当要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情. 应用程序必须通过某种手段来确保输入参数在上下文来说是正确的. 分层的应用在很多时候,同样的数据验证逻辑会出现在不同的层, ...

  6. twisted:基于python的twisted框架编写一个客户端和服务端的对话聊天空间

    twisted:基于python的twisted框架编写一个客户端和服务端的对话聊天空间 目录 输出结果 实现代码 输出结果 更新-- 实现代码 #基于python的twisted框架编写一个简单的聊 ...

  7. Python基于socket实现的多任务版TCP服务端

    ''' 基于socket实现的多任务版TCP服务端 ''' import socket import threadingdef client_task(client_socket,ip_port):p ...

  8. javascript调用服务端验证控件

    //*******************Ajax 调用验证控件(客户端调用服务器验证控件)********************                 Page_ClientValida ...

  9. java服务端验证谷歌支付Google Pay

    翻阅大半个谷歌,对服务器验证账单,讲的少之又少,还TM没有看懂 查阅整个百度,发现几乎所有demo都是用世界上最好的语言php写的,这我 在此坐下记录希望能帮到有需要的人 支付流程 前端支付完成,谷歌 ...

最新文章

  1. RNA-seq技术之转录组从头组装介绍
  2. 维护窗口和停机时间 可用率99.99%
  3. 帝国cms75商城包含电脑端手机端h5微信小程序的界面功能演示
  4. android四大组件五大存储六大布局,物联网研报:物联网进入规模化应用时代
  5. [CQOI2012]模拟工厂 题解(搜索+贪心)
  6. Androidz之clickable
  7. 套用表格格式转化为普通区域_学会修改表格格式,让你的报表更美观
  8. 代码补全_补全股票代码位数的一百种姿势
  9. java 获取 classpath下的配置文件
  10. ConcurrentHashMap内部原理浅析
  11. malformed utf-8 characters, possibly incorrectly encoded
  12. (转)献给迷茫中的量化工作者
  13. Nagel-Schreckenberg(交通流)模型——python实现
  14. u盘计算机软件,USBoot(U盘启动盘制作工具)
  15. python_(1)_向量运算
  16. GitHub快速上手指南
  17. 微信小程序:微信零钱模拟器微信小程序源码下载查收充电器自动充钱
  18. WWW和Web的区别
  19. Arduino Mega2560 PWM
  20. 【ThreeJS基础教程】0.在学习使用ThreeJS之前

热门文章

  1. 【linux所有命令——复习】
  2. 对电机油冷分析_【外文解读】电动汽车转子油冷电机
  3. spark规范化读取数据
  4. html select 事件 jquery,通过jquery触发select自身的change事件
  5. LeetCode33. 搜索旋转排序数组(二分查找)
  6. 叶子的离开,是因为风的追求,还是树的不挽留
  7. 07-求解Ax=0:主变量、特解
  8. git常用命令--tag
  9. 关于Apache2.4版本的phpMyAdmin的配置
  10. [Django]我的第一个网页,报错啦~(自己实现过程中遇到问题以及解决办法)