Hero Circle Shape
Hero Moon Shape
Hero Right Shape
tokenpocket钱包官方苹果app下载|gtoken

tokenpocket钱包官方苹果app下载|gtoken

  • 作者: tokenpocket钱包官方苹果app下载
  • 2024-03-07 19:04:12

gtoken: 基于gf框架的token插件,通过服务端验证方式实现token认证;已完全可以支撑线上token认证,并支持集群模式

gtoken: 基于gf框架的token插件,通过服务端验证方式实现token认证;已完全可以支撑线上token认证,并支持集群模式

登录

注册

开源

企业版

高校版

搜索

帮助中心

使用条款

关于我们

开源

企业版

高校版

私有云

Gitee AI

NEW

我知道了

查看详情

登录

注册

代码拉取完成,页面将自动刷新

开源项目

>

WEB应用开发

>

OAuth/单点登录/统一认证

&&

捐赠

捐赠前请先登录

取消

前往登录

扫描微信二维码支付

取消

支付完成

支付提示

将跳转至支付宝完成支付

确定

取消

Watch

不关注

关注所有动态

仅关注版本发行动态

关注但不提醒动态

11

Star

88

Fork

19

goflyfox / gtoken

代码

Issues

0

Pull Requests

0

Wiki

统计

流水线

服务

Gitee Pages

质量分析

Jenkins for Gitee

腾讯云托管

腾讯云 Serverless

悬镜安全

阿里云 SAE

Codeblitz

我知道了,不再自动展开

加入 Gitee

与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)

免费加入

已有帐号?

立即登录

返回

master

管理

管理

分支 (3)

标签 (49)

master

dev

v1.4.5

v1.5.10

v1.5.9

v1.5.8

v1.5.7

v1.5.6

v1.5.4

v1.4.5.1

v1.5.3

v1.5.2

v1.5.1

v1.5.0

v1.4.5

v1.4.3

v1.4.4

v1.4.2

v1.4.1

v1.4.0

v1.3.21

v1.3.20

v1.3.19

克隆/下载

克隆/下载

HTTPS

SSH

SVN

SVN+SSH

下载ZIP

登录提示

该操作需登录 Gitee 帐号,请先登录后再操作。

立即登录

没有帐号,去注册

提示

下载代码请复制以下命令到终端执行

为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置

git config --global user.name userName

git config --global user.email userEmail

初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置

1

生成 RSA 密钥

2

获取 RSA 公钥内容,并配置到 SSH公钥 中

在 Gitee 上使用 SVN,请访问 使用指南

使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作

Username for 'https://gitee.com': userName

Password for 'https://userName@gitee.com':

#

私人令牌

新建文件

新建 Diagram 文件

新建子模块

上传文件

分支 3

标签 49

贡献代码

同步代码

创建 Pull Request

了解更多

对比差异

通过 Pull Request 同步

同步更新到分支

通过 Pull Request 同步

将会在向当前分支创建一个 Pull Request,合入后将完成同步

zhangb

update version

4b19df9

129 次提交

提交

取消

提示:

由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件

example

保存

取消

gtoken

保存

取消

.gitignore

保存

取消

ChangeLog.md

保存

取消

LICENSE

保存

取消

README.md

保存

取消

go.mod

保存

取消

go.sum

保存

取消

Loading...

README

Apache-2.0

gtoken

介绍

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

全面适配GoFrame v2.0.0 ; GoFrame v1.X.X 请使用gtoken v1.4.X相关版本;

github地址:https://github.com/goflyfox/gtoken

gitee地址:https://gitee.com/goflyfox/gtoken

gtoken优势

gtoken支撑单点应用测试使用内存存储,支持个人项目文件存储,也支持企业集群使用redis存储;完全适用于企业生产级使用;

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

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

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

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

特性说明

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

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

# 缓存模式 1 gcache 2 gredis 3 fileCache

CacheMode = 2

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

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

// 超时时间 默认10天

Timeout int

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

MaxRefresh int

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

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

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

在gtoken v1.5.0全面适配GoFrame v2.0.0 ; GoFrame v1.X.X 请使用GfToken v1.4.X相关版本;

安装教程

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

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

分组中间件实现

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

使用说明

推荐使用分组方式实现

// 启动gtoken

gfToken := >oken.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()

}

// 第一个字段是用户唯一标识,第二个字段是扩展参数user data

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 := >oken.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()

}

// 第一个字段是用户唯一标识,第二个字段是扩展参数user data

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 3 fileCache 默认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

拦截认证完成后调用

支持

支持

文档

https://goframe.org/pages/viewpage.action?pageId=1115974

感谢

gf框架 https://github.com/gogf/gf

项目支持

项目的发展,离不开大家得支持~!~

阿里云:ECS云服务器新人优惠券;请点击这里

也可以请作者喝一杯咖啡:)

Apache License

Version 2.0, January 2004

http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.

"License" shall mean the terms and conditions for use, reproduction,

and distribution as defined by Sections 1 through 9 of this document.

"Licensor" shall mean the copyright owner or entity authorized by

the copyright owner that is granting the License.

"Legal Entity" shall mean the union of the acting entity and all

other entities that control, are controlled by, or are under common

control with that entity. For the purposes of this definition,

"control" means (i) the power, direct or indirect, to cause the

direction or management of such entity, whether by contract or

otherwise, or (ii) ownership of fifty percent (50%) or more of the

outstanding shares, or (iii) beneficial ownership of such entity.

"You" (or "Your") shall mean an individual or Legal Entity

exercising permissions granted by this License.

"Source" form shall mean the preferred form for making modifications,

including but not limited to software source code, documentation

source, and configuration files.

"Object" form shall mean any form resulting from mechanical

transformation or translation of a Source form, including but

not limited to compiled object code, generated documentation,

and conversions to other media types.

"Work" shall mean the work of authorship, whether in Source or

Object form, made available under the License, as indicated by a

copyright notice that is included in or attached to the work

(an example is provided in the Appendix below).

"Derivative Works" shall mean any work, whether in Source or Object

form, that is based on (or derived from) the Work and for which the

editorial revisions, annotations, elaborations, or other modifications

represent, as a whole, an original work of authorship. For the purposes

of this License, Derivative Works shall not include works that remain

separable from, or merely link (or bind by name) to the interfaces of,

the Work and Derivative Works thereof.

"Contribution" shall mean any work of authorship, including

the original version of the Work and any modifications or additions

to that Work or Derivative Works thereof, that is intentionally

submitted to Licensor for inclusion in the Work by the copyright owner

or by an individual or Legal Entity authorized to submit on behalf of

the copyright owner. For the purposes of this definition, "submitted"

means any form of electronic, verbal, or written communication sent

to the Licensor or its representatives, including but not limited to

communication on electronic mailing lists, source code control systems,

and issue tracking systems that are managed by, or on behalf of, the

Licensor for the purpose of discussing and improving the Work, but

excluding communication that is conspicuously marked or otherwise

designated in writing by the copyright owner as "Not a Contribution."

"Contributor" shall mean Licensor and any individual or Legal Entity

on behalf of whom a Contribution has been received by Licensor and

subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of

this License, each Contributor hereby grants to You a perpetual,

worldwide, non-exclusive, no-charge, royalty-free, irrevocable

copyright license to reproduce, prepare Derivative Works of,

publicly display, publicly perform, sublicense, and distribute the

Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of

this License, each Contributor hereby grants to You a perpetual,

worldwide, non-exclusive, no-charge, royalty-free, irrevocable

(except as stated in this section) patent license to make, have made,

use, offer to sell, sell, import, and otherwise transfer the Work,

where such license applies only to those patent claims licensable

by such Contributor that are necessarily infringed by their

Contribution(s) alone or by combination of their Contribution(s)

with the Work to which such Contribution(s) was submitted. If You

institute patent litigation against any entity (including a

cross-claim or counterclaim in a lawsuit) alleging that the Work

or a Contribution incorporated within the Work constitutes direct

or contributory patent infringement, then any patent licenses

granted to You under this License for that Work shall terminate

as of the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the

Work or Derivative Works thereof in any medium, with or without

modifications, and in Source or Object form, provided that You

meet the following conditions:

(a) You must give any other recipients of the Work or

Derivative Works a copy of this License; and

(b) You must cause any modified files to carry prominent notices

stating that You changed the files; and

(c) You must retain, in the Source form of any Derivative Works

that You distribute, all copyright, patent, trademark, and

attribution notices from the Source form of the Work,

excluding those notices that do not pertain to any part of

the Derivative Works; and

(d) If the Work includes a "NOTICE" text file as part of its

distribution, then any Derivative Works that You distribute must

include a readable copy of the attribution notices contained

within such NOTICE file, excluding those notices that do not

pertain to any part of the Derivative Works, in at least one

of the following places: within a NOTICE text file distributed

as part of the Derivative Works; within the Source form or

documentation, if provided along with the Derivative Works; or,

within a display generated by the Derivative Works, if and

wherever such third-party notices normally appear. The contents

of the NOTICE file are for informational purposes only and

do not modify the License. You may add Your own attribution

notices within Derivative Works that You distribute, alongside

or as an addendum to the NOTICE text from the Work, provided

that such additional attribution notices cannot be construed

as modifying the License.

You may add Your own copyright statement to Your modifications and

may provide additional or different license terms and conditions

for use, reproduction, or distribution of Your modifications, or

for any such Derivative Works as a whole, provided Your use,

reproduction, and distribution of the Work otherwise complies with

the conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise,

any Contribution intentionally submitted for inclusion in the Work

by You to the Licensor shall be under the terms and conditions of

this License, without any additional terms or conditions.

Notwithstanding the above, nothing herein shall supersede or modify

the terms of any separate license agreement you may have executed

with Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade

names, trademarks, service marks, or product names of the Licensor,

except as required for reasonable and customary use in describing the

origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or

agreed to in writing, Licensor provides the Work (and each

Contributor provides its Contributions) on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or

implied, including, without limitation, any warranties or conditions

of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A

PARTICULAR PURPOSE. You are solely responsible for determining the

appropriateness of using or redistributing the Work and assume any

risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory,

whether in tort (including negligence), contract, or otherwise,

unless required by applicable law (such as deliberate and grossly

negligent acts) or agreed to in writing, shall any Contributor be

liable to You for damages, including any direct, indirect, special,

incidental, or consequential damages of any character arising as a

result of this License or out of the use or inability to use the

Work (including but not limited to damages for loss of goodwill,

work stoppage, computer failure or malfunction, or any and all

other commercial damages or losses), even if such Contributor

has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability. While redistributing

the Work or Derivative Works thereof, You may choose to offer,

and charge a fee for, acceptance of support, warranty, indemnity,

or other liability obligations and/or rights consistent with this

License. However, in accepting such obligations, You may act only

on Your own behalf and on Your sole responsibility, not on behalf

of any other Contributor, and only if You agree to indemnify,

defend, and hold each Contributor harmless for any liability

incurred by, or claims asserted against, such Contributor by reason

of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

To apply the Apache License to your work, attach the following

boilerplate notice, with the fields enclosed by brackets "[]"

replaced with your own identifying information. (Don't include

the brackets!) The text should be enclosed in the appropriate

comment syntax for the file format. We also recommend that a

file or class name and description of purpose be included on the

same "printed page" as the copyright notice for easier

identification within third-party archives.

Copyright [2019] [FLY的狐狸]

Licensed under the Apache License, Version 2.0 (the "License");

you may not use this file except in compliance with the License.

You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and

limitations under the License.

Starred

88

Star

88

Fork

19

捐赠

0 人次

举报

举报成功

我们将于2个工作日内通过站内信反馈结果给你!

请认真填写举报原因,尽可能描述详细。

举报类型

请选择举报类型

举报原因

取消

发送

误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消

提交

简介

基于gf框架的token插件,通过服务端验证方式实现token认证;已完全可以支撑线上token认证,并支持集群模式

展开

收起

暂无标签

Go

Go

100.0%

Apache-2.0

使用 Apache-2.0 开源许可协议

保存更改

取消

发行版

暂无发行版

开源评估指数源自 OSS-Compass 评估体系,评估体系围绕以下三个维度对项目展开评估:

1. 开源生态

生产力:来评估开源项目输出软件制品和开源价值的能力。

创新力:用于评估开源软件及其生态系统的多样化程度。

稳健性:用于评估开源项目面对多变的发展环境,抵御内外干扰并自我恢复的能力。

2. 协作、人、软件

协作:代表了开源开发行为中协作的程度和深度。

人:观察开源项目核心人员在开源项目中的影响力,并通过第三方视角考察用户和开发者对开源项目的评价。

软件:从开源项目对外输出的制品评估其价值最终落脚点。也是开源评估最“古老”的主流方向之一“开源软件” 的具体表现。

3. 评估模型

基于“开源生态”与“协作、人、软件”的维度,找到与该目标直接或间接相关的可量化指标,对开源项目健康与生态进行量化评估,最终形成开源评估指数。

贡献者

全部

近期动态

加载更多

不能加载更多了

编辑仓库简介

简介内容

基于gf框架的token插件,通过服务端验证方式实现token认证;已完全可以支撑线上token认证,并支持集群模式

主页

取消

保存更改

Go

1

https://gitee.com/goflyfox/gtoken.git

git@gitee.com:goflyfox/gtoken.git

goflyfox

gtoken

gtoken

master

深圳市奥思网络科技有限公司版权所有

Git 大全

Git 命令学习

CopyCat 代码克隆检测

APP与插件下载

Gitee Reward

Gitee 封面人物

GVP 项目

Gitee 博客

Gitee 公益计划

Gitee 持续集成

OpenAPI

帮助文档

在线自助服务

更新日志

关于我们

加入我们

使用条款

意见建议

合作伙伴

售前咨询客服

技术交流QQ群

微信服务号

client#oschina.cn

企业版在线使用:400-606-0201

专业版私有部署:

13670252304

13352947997

开放原子开源基金会

合作代码托管平台

违法和不良信息举报中心

粤ICP备12009483号

简 体

/

繁 體

/

English

点此查找更多帮助

搜索帮助

Git 命令在线学习

如何在 Gitee 导入 GitHub 仓库

Git 仓库基础操作

企业版和社区版功能对比

SSH 公钥设置

如何处理代码冲突

仓库体积过大,如何减小?

如何找回被删除的仓库数据

Gitee 产品配额说明

GitHub仓库快速导入Gitee及同步更新

什么是 Release(发行版)

将 PHP 项目自动发布到 packagist.org

评论

仓库举报

回到顶部

登录提示

该操作需登录 Gitee 帐号,请先登录后再操作。

立即登录

没有帐号,去注册

Gtoken “鉴权” 技术栈 - 知乎

Gtoken “鉴权” 技术栈 - 知乎首发于golang开发者实践切换模式写文章登录/注册Gtoken “鉴权” 技术栈文化科技君经济,人工智能,时讯,脱口秀,文学分享Gtoken基于GoFrame框架的token插件,通过服务端验证方式实现token认证;已完全可以支撑线上token认证,通过Redis支持集群模式。gtoken优势gtoken支撑单点应用使用内存存储,也支持集群使用redis存储;完全适用于企业生产级使用;有效的避免了jwt服务端无法退出问题;解决jwt无法作废已颁布的令牌,只能等到令牌过期问题;通过用户扩展信息存储在服务端,有效规避了jwt携带大量用户扩展信息导致降低传输效率问题;有效避免jwt需要客户端实现续签功能,增加客户端复杂度;支持服务端自动续期,客户端不需要关心续签逻辑;特性说明支持token认证,不强依赖于session和cookie,适用jwt和session认证所有场景;支持单机gcache和集群gredis模式;# 缓存模式 1 gcache 2 gredis 3 fileCache

CacheMode = 2

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

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

// 超时时间 默认10天

Timeout int

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

MaxRefresh int支持分组拦截、全局拦截、深度路径拦截,便于根据个人需求定制拦截器;建议使用分组拦截方式;框架使用简单,只需要设置登录验证方法以及登录、登出路径即可;在gtoken v1.4.0版本开始支持分组中间件方式实现,但依然兼容全局和深度中间件实现方式;分组实操分享GoFrame官方推荐使用Group方式实现路由和中间件; // 启动gtoken

gfToken := >oken.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/logoutfunc 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 := >oken.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":""}

分组拦截器 // 不认证接口

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

group.Middleware(CORS)

// 调试路由

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

r.Response.WriteJson(gtoken.Succ("hello"))

})

})

// 认证接口

loginFunc := Login

// 启动gtoken

gfToken := >oken.GfToken{

ServerName: TestServerName,

LoginPath: "/login",

LoginBeforeFunc: loginFunc,

LogoutPath: "/user/logout",

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

MultiLogin: g.Config().GetBool("gToken.MultiLogin"),

}

s.Group("/", 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"))

})

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

r.Response.WriteJson(gfToken.GetTokenData(r))

})

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

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

})

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

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

})

})

// 启动gtoken

gfAdminToken := >oken.GfToken{

ServerName: TestServerName,

//Timeout: 10 * 1000,

LoginPath: "/login",

LoginBeforeFunc: loginFunc,

LogoutPath: "/user/logout",

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

MultiLogin: g.Config().GetBool("gToken.MultiLogin"),

}

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

group.Middleware(CORS)

gfAdminToken.Middleware(group)

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

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

})

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

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

})

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

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

})

})发布于 2023-03-08 21:58・IP 属地上海tokenGo 语言Go 编程​赞同​​添加评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录golang开发者实践分享golang开

GitHub - goflyfox/gtoken: 基于gf框架的token插件,通过服务端验证方式实现token认证;

GitHub - goflyfox/gtoken: 基于gf框架的token插件,通过服务端验证方式实现token认证;

Skip to content

Toggle navigation

Sign in

Product

Actions

Automate any workflow

Packages

Host and manage packages

Security

Find and fix vulnerabilities

Codespaces

Instant dev environments

Copilot

Write better code with AI

Code review

Manage code changes

Issues

Plan and track work

Discussions

Collaborate outside of code

Explore

All features

Documentation

GitHub Skills

Blog

Solutions

For

Enterprise

Teams

Startups

Education

By Solution

CI/CD & Automation

DevOps

DevSecOps

Resources

Learning Pathways

White papers, Ebooks, Webinars

Customer Stories

Partners

Open Source

GitHub Sponsors

Fund open source developers

The ReadME Project

GitHub community articles

Repositories

Topics

Trending

Collections

Pricing

Search or jump to...

Search code, repositories, users, issues, pull requests...

Search

Clear

Search syntax tips

Provide feedback

We read every piece of feedback, and take your input very seriously.

Include my email address so I can be contacted

Cancel

Submit feedback

Saved searches

Use saved searches to filter your results more quickly

Name

Query

To see all available qualifiers, see our documentation.

Cancel

Create saved search

Sign in

Sign up

You signed in with another tab or window. Reload to refresh your session.

You signed out in another tab or window. Reload to refresh your session.

You switched accounts on another tab or window. Reload to refresh your session.

Dismiss alert

goflyfox

/

gtoken

Public

Notifications

Fork

66

Star

245

基于gf框架的token插件,通过服务端验证方式实现token认证;

License

Apache-2.0 license

245

stars

66

forks

Branches

Tags

Activity

Star

Notifications

Code

Issues

7

Pull requests

0

Actions

Projects

0

Security

Insights

Additional navigation options

Code

Issues

Pull requests

Actions

Projects

Security

Insights

goflyfox/gtoken

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

 masterBranchesTagsGo to fileCodeFolders and filesNameNameLast commit messageLast commit dateLatest commit History129 Commitsexampleexample  gtokengtoken  .gitignore.gitignore  ChangeLog.mdChangeLog.md  LICENSELICENSE  README.mdREADME.md  go.modgo.mod  go.sumgo.sum  View all filesRepository files navigationREADMEApache-2.0 licensegtoken

介绍

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

全面适配GoFrame v2.0.0 ; GoFrame v1.X.X 请使用gtoken v1.4.X相关版本;

github地址:https://github.com/goflyfox/gtoken

gitee地址:https://gitee.com/goflyfox/gtoken

gtoken优势

gtoken支撑单点应用测试使用内存存储,支持个人项目文件存储,也支持企业集群使用redis存储;完全适用于企业生产级使用;

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

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

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

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

特性说明

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

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

# 缓存模式 1 gcache 2 gredis 3 fileCache

CacheMode = 2

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

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

// 超时时间 默认10天

Timeout int

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

MaxRefresh int

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

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

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

在gtoken v1.5.0全面适配GoFrame v2.0.0 ; GoFrame v1.X.X 请使用GfToken v1.4.X相关版本;

安装教程

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

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

分组中间件实现

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

使用说明

推荐使用分组方式实现

// 启动gtoken

gfToken := >oken.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()

}

// 第一个字段是用户唯一标识,第二个字段是扩展参数user data

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 := >oken.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()

}

// 第一个字段是用户唯一标识,第二个字段是扩展参数user data

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 3 fileCache 默认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

拦截认证完成后调用

支持

支持

文档

https://goframe.org/pages/viewpage.action?pageId=1115974

感谢

gf框架 https://github.com/gogf/gf

项目支持

项目的发展,离不开大家得支持~!~

阿里云:ECS云服务器新人优惠券;请点击这里

也可以请作者喝一杯咖啡:)

About

基于gf框架的token插件,通过服务端验证方式实现token认证;

Topics

golang

auth

token

gf

Resources

Readme

License

Apache-2.0 license

Activity

Custom properties

Stars

245

stars

Watchers

11

watching

Forks

66

forks

Report repository

Releases

48

gtoken v1.5.9

Latest

Jun 28, 2023

+ 47 releases

Packages

0

No packages published

Used by 117

+ 109

Contributors

2

 

 

Languages

Go

100.0%

Footer

© 2024 GitHub, Inc.

Footer navigation

Terms

Privacy

Security

Status

Docs

Contact

Manage cookies

Do not share my personal information

You can’t perform that action at this time.

通过阅读源码解决项目难题:GToken替换JWT实现SSO单点登录 - 掘金

通过阅读源码解决项目难题:GToken替换JWT实现SSO单点登录 - 掘金

首页 首页

沸点

课程

直播

活动

竞赛

商城

APP

插件 搜索历史

清空

创作者中心

写文章 发沸点 写笔记 写代码 草稿箱 创作灵感

查看更多

会员

登录

注册

通过阅读源码解决项目难题:GToken替换JWT实现SSO单点登录

王中阳Go

VIP.5 如鱼得水

2022-05-19

17,280

今天和大家分享一下使用GoFrame的gtoken替换jwt实现sso登录的经验,为了让大家更好的理解会带大家读一下重点的源码。

jwt的问题

首先说明一个jwt存在的问题,也就是要替换jwt的原因:

jwt无法在服务端主动退出的问题

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

jwt携带大量用户扩展信息导致降低传输效率问题

jwt的请求流程图

gtoken的优势

gtoken的请求流程和jwt的基本一致。

gtoken的优势就是能帮助我们解决jwt的问题,另外还提供好用的特性,比如:

gtoken支持单点应用使用内存存储,支持个人项目文件存储,也支持企业集群使用redis存储,完全适用于个人和企业生产级使用;

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

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

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

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

注意问题

支持服务端缓存自动续期功能,不需要通过refresh_token刷新token,简化了客户端的操作

版本问题千万注意:在gtoken v1.5.0全面适配GoFrame v2.0.0 ; GoFrame v1.X.X 请使用GfToken v1.4.X相关版本

TIPS:下面我的演示demo和源码阅读都是基于v1.4.x版本的。

演示demo

下面的演示demo可以复制到本地main.go文件中执行,更新依赖的时候千万注意版本。

重点说一下踩的坑,Login方法会要求我们返回两个值:

第一个值对应userKey,后续我们可以根据userKey获得token

第二个值对应data,是interface{}类型,我们可以在这里定义例如userid、username等数据。

先有这个概念即可,为了让大家更好的理解,文章最后会带大家读源码。

入门示例

代码段的关键逻辑,已经添加了注释。

package main

import (

"github.com/goflyfox/gtoken/gtoken"

"github.com/gogf/gf/frame/g"

"github.com/gogf/gf/net/ghttp"

"github.com/gogf/gf/os/glog"

)

var TestServerName string

//var TestServerName string = "gtoken"

func main() {

glog.Info("########service start...")

g.Cfg().SetPath("example/sample")

s := g.Server(TestServerName)

initRouter(s)

glog.Info("########service finish.")

s.Run()

}

var gfToken *gtoken.GfToken

/*

统一路由注册

*/

func initRouter(s *ghttp.Server) {

// 不认证接口

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

group.Middleware(CORS)

// 调试路由

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

r.Response.WriteJson(gtoken.Succ("hello"))

})

})

// 认证接口

loginFunc := Login

// 启动gtoken

gfToken := >oken.GfToken{

ServerName: TestServerName,

LoginPath: "/login",

LoginBeforeFunc: loginFunc,

LogoutPath: "/user/logout",

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

MultiLogin: g.Config().GetBool("gToken.MultiLogin"),

}

s.Group("/", 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"))

})

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

r.Response.WriteJson(gfToken.GetTokenData(r))

})

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

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

})

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

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

})

})

// 启动gtoken

gfAdminToken := >oken.GfToken{

ServerName: TestServerName,

//Timeout: 10 * 1000,

LoginPath: "/login",

LoginBeforeFunc: loginFunc,

LogoutPath: "/user/logout",

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

MultiLogin: g.Config().GetBool("gToken.MultiLogin"),

}

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

group.Middleware(CORS)

gfAdminToken.Middleware(group)

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

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

})

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

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

})

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

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

})

})

}

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

username := r.GetString("username")

passwd := r.GetString("passwd")

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

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

r.ExitAll()

}

return username, "1"

/**

返回的第一个参数对应:userKey

返回的第二个参数对应:data

{

"code": 0,

"msg": "success",

"data": {

"createTime": 1652838582190,

"data": "1",

"refreshTime": 1653270582190,

"userKey": "王中阳",

"uuid": "ac75676efeb906f9959cf35f779a1d38"

}

}

*/

}

// 跨域

func CORS(r *ghttp.Request) {

r.Response.CORSDefault()

r.Middleware.Next()

}

运行效果

启动项目:

访问不认证接口:返回成功

未登录时访问认证接口:返回错误提示

请求登录接口:返回token

携带token再次访问认证接口:返回成功

以上就跑通了主体流程,就是这么简单。

分析源码

tips:下面带大家看的是 v1.4.1

下面带大家分析一下源码,学习一下作者是如何设计的。

刷新token

首先我认为gtoken很好的设计思想是不使用refresh_token来刷新token,而是服务端主动刷新。

在源码的getToken方法中做了更新refreshTime和createTime的处理。

更新createTime为当前时间,refreshTime为当前时间+自定义的刷新时间。

如下图所示,getToken方法在每次执行validToken校验token的时候都会调用,即每次校验token有效性时,如果符合刷新token有效期的条件,就会进行刷新操作(刷新token的过期时间,token值不变)

这样就实现了无感刷新token。

GfToken结构体

我们再来看一下GfToken的结构体,更好的理解一下作者的设计思路:

因为CacheMode支持redis,也就意味着支持集群模式。

我们在启动gtoken的时候,只需要设置登录和登出路径,另外登录和登出都提供了BeforeFunc和AfterFunc,让我们能清晰的界定使用场景。

// GfToken gtoken结构体

type GfToken struct {

// GoFrame server name

ServerName string

// 缓存模式 1 gcache 2 gredis 默认1

CacheMode int8

// 缓存key

CacheKey string

// 超时时间 默认10天(毫秒)

Timeout int

// 缓存刷新时间 默认为超时时间的一半(毫秒)

MaxRefresh int

// Token分隔符

TokenDelimiter string

// Token加密key

EncryptKey []byte

// 认证失败中文提示

AuthFailMsg string

// 是否支持多端登录,默认false

MultiLogin bool

// 是否是全局认证,兼容历史版本,已废弃

GlobalMiddleware bool

// 中间件类型 1 GroupMiddleware 2 BindMiddleware 3 GlobalMiddleware

MiddlewareType uint

// 登录路径

LoginPath string

// 登录验证方法 return userKey 用户标识 如果userKey为空,结束执行

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

// 登录返回方法

LoginAfterFunc func(r *ghttp.Request, respData Resp)

// 登出地址

LogoutPath string

// 登出验证方法 return true 继续执行,否则结束执行

LogoutBeforeFunc func(r *ghttp.Request) bool

// 登出返回方法

LogoutAfterFunc func(r *ghttp.Request, respData Resp)

// 拦截地址

AuthPaths g.SliceStr

// 拦截排除地址

AuthExcludePaths g.SliceStr

// 认证验证方法 return true 继续执行,否则结束执行

AuthBeforeFunc func(r *ghttp.Request) bool

// 认证返回方法

AuthAfterFunc func(r *ghttp.Request, respData Resp)

}

思考题

我有N个子系统如何用gtoken实现sso登录呢?即实现一个子系统登录,其他各个子系统都自动登录,而无需二次登录呢?

想一想

.

.

.

我想到的解决方案是配合cookie实现:各个子系统二级域名不一致,但是主域名一致。

我在登录之后把token写入主域名的cookie中进行共享,前端网站通过cookie获得token请求服务接口。

同时在刷新token之后,也要刷新cookie的有效期,避免cookie失效导致获取不到token。

进一步阅读源码

在经过又一次仔细阅读源码之后,找到了刷新cookie有效期的合适场景:AuthAfterFunc,我们可以重写这个方法,来实现验证通过后的操作:

如果token验证有效则刷新cookie有效期;如果验证无效则自定义返回信息。(往往我们自己项目中的code码和gtoken定义的不一致,但是gtoken支持非常方便的重写返回值)

总结

我们项目之前是使用jwt实现sso登录,在刚刚拿到需求要重写时,自己也是一头雾水。

在没有认真阅读gtoken源码之前,我已经设计了refresh_token刷新的策略。

在仔细阅读源码之后,发现真香。

这次经历最大的收获是:碰到不好解决的问题时,带着问题去阅读源码是非常高效的方式。

一起学习

公众号:程序员升级打怪之旅

微信号:wangzhongyang1993

福利:点这里-->半价买掘金小册,额外领红包

王中阳Go

掘金签约作者 @程序员升职加薪之旅

270

文章

1.1m

阅读

4.0k

粉丝 目录 收起

jwt的问题

jwt的请求流程图

gtoken的优势

注意问题

演示demo

入门示例

运行效果

启动项目:

访问不认证接口:返回成功

未登录时访问认证接口:返回错误提示

请求登录接口:返回token

携带token再次访问认证接口:返回成功

分析源码

刷新token

GfToken结构体

思考题

进一步阅读源码

总结

一起学习

友情链接:

娱乐高清正版视频

莲花香图解

angularjs json转换

火车头 采集 js

mysql慢查询设置路径

没有被你改写一生怎配有心事

gtoken: 基于gf框架的token插件,通过服务端验证方式实现token认证;

gtoken: 基于gf框架的token插件,通过服务端验证方式实现token认证;

登录

注册

开源

企业版

高校版

搜索

帮助中心

使用条款

关于我们

开源

企业版

高校版

私有云

Gitee AI

NEW

我知道了

查看详情

登录

注册

代码拉取完成,页面将自动刷新

捐赠

捐赠前请先登录

取消

前往登录

扫描微信二维码支付

取消

支付完成

支付提示

将跳转至支付宝完成支付

确定

取消

Watch

不关注

关注所有动态

仅关注版本发行动态

关注但不提醒动态

1

Star

0

Fork

0

tanglichong / gtoken

代码

Issues

0

Pull Requests

0

Wiki

统计

流水线

服务

Gitee Pages

JavaDoc

PHPDoc

质量分析

Jenkins for Gitee

腾讯云托管

腾讯云 Serverless

悬镜安全

阿里云 SAE

Codeblitz

我知道了,不再自动展开

加入 Gitee

与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)

免费加入

已有帐号?

立即登录

返回

master

管理

管理

分支 (2)

标签 (28)

master

dev

v1.3.17

v1.3.16

v1.3.15

v1.3.14

v1.3.13

v1.3.12

v1.3.11

v1.3.10

v1.3.9

v1.3.8

v1.3.7

v1.3.6

v1.3.5

v1.3.4

v1.3.3

v1.3.2

v1.3.0

v1.3.1

v1.2.7

v1.2.5

克隆/下载

克隆/下载

HTTPS

SSH

SVN

SVN+SSH

下载ZIP

登录提示

该操作需登录 Gitee 帐号,请先登录后再操作。

立即登录

没有帐号,去注册

提示

下载代码请复制以下命令到终端执行

为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置

git config --global user.name userName

git config --global user.email userEmail

初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置

1

生成 RSA 密钥

2

获取 RSA 公钥内容,并配置到 SSH公钥 中

在 Gitee 上使用 SVN,请访问 使用指南

使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作

Username for 'https://gitee.com': userName

Password for 'https://userName@gitee.com':

#

私人令牌

新建文件

新建 Diagram 文件

新建子模块

上传文件

分支 2

标签 28

贡献代码

同步代码

创建 Pull Request

了解更多

对比差异

通过 Pull Request 同步

同步更新到分支

通过 Pull Request 同步

将会在向当前分支创建一个 Pull Request,合入后将完成同步

zcool321@sina.com

add set GoFrame server name

fc4352f

61 次提交

提交

取消

提示:

由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件

example

保存

取消

gtoken

保存

取消

.gitignore

保存

取消

ChangeLog.md

保存

取消

LICENSE

保存

取消

README.md

保存

取消

go.mod

保存

取消

go.sum

保存

取消

Loading...

README

Apache-2.0

gtoken

介绍

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

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

# 配置文件

# 缓存模式 1 gcache 2 gredis

cache-mode = 2

支持简单token认证

加入缓存自动续期功能

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

// 超时时间 默认10天

Timeout int

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

MaxRefresh int

支持全局拦截或者深度路径拦截,便于根据个人需求定制拦截器

// 是否是全局认证

GlobalMiddleware bool

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

github地址:https://github.com/goflyfox/gtoken

gitee地址:https://gitee.com/goflyfox/gtoken

gtoken优势

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

可以解决jwt无法作废已颁布的令牌;

用户扩展信息仍存储在服务端,可有效的减少传输空间;

gtoken支撑单点应用使用内存存储,也支持集群使用redis存储;

支持缓存自动续期,并且不需要客户端进行实现;

安装教程

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

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

使用说明

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

// 启动gtoken

gtoken := >oken.GfToken{

LoginPath: "/login",

LoginBeforeFunc: loginFunc,

LogoutPath: "/user/logout",

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

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

}

gtoken.Start()

登录方法实现

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

username := r.GetPostString("username")

passwd := r.GetPostString("passwd")

// TODO 进行登录校验

return username, ""

}

路径拦截规则

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/*

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

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

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

逻辑测试

可运行api_test.go进行测试并查看结果;验证逻辑说明:

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

登录后,携带token访问正常

登出成功

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

--- PASS: TestSystemUser (0.00s)

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

api_test.go:50: {"code":-1,"data":"","msg":"query token fail"}

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":-1,"msg":"login timeout or not login","data":""}

感谢

gf框架 https://github.com/gogf/gf

项目支持

项目的发展,离不开大家得支持~!~

【双12】主会场 低至1折;请点击这里

阿里云:ECS云服务器2折起;请点击这里

阿里云:ECS云服务器新人优惠券;请点击这里

也可以请作者喝一杯咖啡:)

Apache License

Version 2.0, January 2004

http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.

"License" shall mean the terms and conditions for use, reproduction,

and distribution as defined by Sections 1 through 9 of this document.

"Licensor" shall mean the copyright owner or entity authorized by

the copyright owner that is granting the License.

"Legal Entity" shall mean the union of the acting entity and all

other entities that control, are controlled by, or are under common

control with that entity. For the purposes of this definition,

"control" means (i) the power, direct or indirect, to cause the

direction or management of such entity, whether by contract or

otherwise, or (ii) ownership of fifty percent (50%) or more of the

outstanding shares, or (iii) beneficial ownership of such entity.

"You" (or "Your") shall mean an individual or Legal Entity

exercising permissions granted by this License.

"Source" form shall mean the preferred form for making modifications,

including but not limited to software source code, documentation

source, and configuration files.

"Object" form shall mean any form resulting from mechanical

transformation or translation of a Source form, including but

not limited to compiled object code, generated documentation,

and conversions to other media types.

"Work" shall mean the work of authorship, whether in Source or

Object form, made available under the License, as indicated by a

copyright notice that is included in or attached to the work

(an example is provided in the Appendix below).

"Derivative Works" shall mean any work, whether in Source or Object

form, that is based on (or derived from) the Work and for which the

editorial revisions, annotations, elaborations, or other modifications

represent, as a whole, an original work of authorship. For the purposes

of this License, Derivative Works shall not include works that remain

separable from, or merely link (or bind by name) to the interfaces of,

the Work and Derivative Works thereof.

"Contribution" shall mean any work of authorship, including

the original version of the Work and any modifications or additions

to that Work or Derivative Works thereof, that is intentionally

submitted to Licensor for inclusion in the Work by the copyright owner

or by an individual or Legal Entity authorized to submit on behalf of

the copyright owner. For the purposes of this definition, "submitted"

means any form of electronic, verbal, or written communication sent

to the Licensor or its representatives, including but not limited to

communication on electronic mailing lists, source code control systems,

and issue tracking systems that are managed by, or on behalf of, the

Licensor for the purpose of discussing and improving the Work, but

excluding communication that is conspicuously marked or otherwise

designated in writing by the copyright owner as "Not a Contribution."

"Contributor" shall mean Licensor and any individual or Legal Entity

on behalf of whom a Contribution has been received by Licensor and

subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of

this License, each Contributor hereby grants to You a perpetual,

worldwide, non-exclusive, no-charge, royalty-free, irrevocable

copyright license to reproduce, prepare Derivative Works of,

publicly display, publicly perform, sublicense, and distribute the

Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of

this License, each Contributor hereby grants to You a perpetual,

worldwide, non-exclusive, no-charge, royalty-free, irrevocable

(except as stated in this section) patent license to make, have made,

use, offer to sell, sell, import, and otherwise transfer the Work,

where such license applies only to those patent claims licensable

by such Contributor that are necessarily infringed by their

Contribution(s) alone or by combination of their Contribution(s)

with the Work to which such Contribution(s) was submitted. If You

institute patent litigation against any entity (including a

cross-claim or counterclaim in a lawsuit) alleging that the Work

or a Contribution incorporated within the Work constitutes direct

or contributory patent infringement, then any patent licenses

granted to You under this License for that Work shall terminate

as of the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the

Work or Derivative Works thereof in any medium, with or without

modifications, and in Source or Object form, provided that You

meet the following conditions:

(a) You must give any other recipients of the Work or

Derivative Works a copy of this License; and

(b) You must cause any modified files to carry prominent notices

stating that You changed the files; and

(c) You must retain, in the Source form of any Derivative Works

that You distribute, all copyright, patent, trademark, and

attribution notices from the Source form of the Work,

excluding those notices that do not pertain to any part of

the Derivative Works; and

(d) If the Work includes a "NOTICE" text file as part of its

distribution, then any Derivative Works that You distribute must

include a readable copy of the attribution notices contained

within such NOTICE file, excluding those notices that do not

pertain to any part of the Derivative Works, in at least one

of the following places: within a NOTICE text file distributed

as part of the Derivative Works; within the Source form or

documentation, if provided along with the Derivative Works; or,

within a display generated by the Derivative Works, if and

wherever such third-party notices normally appear. The contents

of the NOTICE file are for informational purposes only and

do not modify the License. You may add Your own attribution

notices within Derivative Works that You distribute, alongside

or as an addendum to the NOTICE text from the Work, provided

that such additional attribution notices cannot be construed

as modifying the License.

You may add Your own copyright statement to Your modifications and

may provide additional or different license terms and conditions

for use, reproduction, or distribution of Your modifications, or

for any such Derivative Works as a whole, provided Your use,

reproduction, and distribution of the Work otherwise complies with

the conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise,

any Contribution intentionally submitted for inclusion in the Work

by You to the Licensor shall be under the terms and conditions of

this License, without any additional terms or conditions.

Notwithstanding the above, nothing herein shall supersede or modify

the terms of any separate license agreement you may have executed

with Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade

names, trademarks, service marks, or product names of the Licensor,

except as required for reasonable and customary use in describing the

origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or

agreed to in writing, Licensor provides the Work (and each

Contributor provides its Contributions) on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or

implied, including, without limitation, any warranties or conditions

of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A

PARTICULAR PURPOSE. You are solely responsible for determining the

appropriateness of using or redistributing the Work and assume any

risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory,

whether in tort (including negligence), contract, or otherwise,

unless required by applicable law (such as deliberate and grossly

negligent acts) or agreed to in writing, shall any Contributor be

liable to You for damages, including any direct, indirect, special,

incidental, or consequential damages of any character arising as a

result of this License or out of the use or inability to use the

Work (including but not limited to damages for loss of goodwill,

work stoppage, computer failure or malfunction, or any and all

other commercial damages or losses), even if such Contributor

has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability. While redistributing

the Work or Derivative Works thereof, You may choose to offer,

and charge a fee for, acceptance of support, warranty, indemnity,

or other liability obligations and/or rights consistent with this

License. However, in accepting such obligations, You may act only

on Your own behalf and on Your sole responsibility, not on behalf

of any other Contributor, and only if You agree to indemnify,

defend, and hold each Contributor harmless for any liability

incurred by, or claims asserted against, such Contributor by reason

of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

To apply the Apache License to your work, attach the following

boilerplate notice, with the fields enclosed by brackets "[]"

replaced with your own identifying information. (Don't include

the brackets!) The text should be enclosed in the appropriate

comment syntax for the file format. We also recommend that a

file or class name and description of purpose be included on the

same "printed page" as the copyright notice for easier

identification within third-party archives.

Copyright [2019] [FLY的狐狸]

Licensed under the Apache License, Version 2.0 (the "License");

you may not use this file except in compliance with the License.

You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and

limitations under the License.

Starred

0

Star

0

Fork

0

捐赠

0 人次

举报

举报成功

我们将于2个工作日内通过站内信反馈结果给你!

请认真填写举报原因,尽可能描述详细。

举报类型

请选择举报类型

举报原因

取消

发送

误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消

提交

简介

基于gf框架的token插件,通过服务端验证方式实现token认证;

展开

收起

暂无标签

/tanglichong/gtoken

Go

等 3 种语言

Go

98.8%

HTML

1.1%

CSS

0.1%

Apache-2.0

使用 Apache-2.0 开源许可协议

保存更改

取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多

不能加载更多了

编辑仓库简介

简介内容

基于gf框架的token插件,通过服务端验证方式实现token认证;

主页

取消

保存更改

1

https://gitee.com/tanglichong/gtoken.git

git@gitee.com:tanglichong/gtoken.git

tanglichong

gtoken

gtoken

master

深圳市奥思网络科技有限公司版权所有

Git 大全

Git 命令学习

CopyCat 代码克隆检测

APP与插件下载

Gitee Reward

Gitee 封面人物

GVP 项目

Gitee 博客

Gitee 公益计划

Gitee 持续集成

OpenAPI

帮助文档

在线自助服务

更新日志

关于我们

加入我们

使用条款

意见建议

合作伙伴

售前咨询客服

技术交流QQ群

微信服务号

client#oschina.cn

企业版在线使用:400-606-0201

专业版私有部署:

13670252304

13352947997

开放原子开源基金会

合作代码托管平台

违法和不良信息举报中心

粤ICP备12009483号

简 体

/

繁 體

/

English

点此查找更多帮助

搜索帮助

Git 命令在线学习

如何在 Gitee 导入 GitHub 仓库

Git 仓库基础操作

企业版和社区版功能对比

SSH 公钥设置

如何处理代码冲突

仓库体积过大,如何减小?

如何找回被删除的仓库数据

Gitee 产品配额说明

GitHub仓库快速导入Gitee及同步更新

什么是 Release(发行版)

将 PHP 项目自动发布到 packagist.org

评论

仓库举报

回到顶部

登录提示

该操作需登录 Gitee 帐号,请先登录后再操作。

立即登录

没有帐号,去注册

gtoken替换jwt实现sso登录 | 排雷避坑 - 掘金

gtoken替换jwt实现sso登录 | 排雷避坑 - 掘金

首页 首页

沸点

课程

直播

活动

竞赛

商城

APP

插件 搜索历史

清空

创作者中心

写文章 发沸点 写笔记 写代码 草稿箱 创作灵感

查看更多

会员

登录

注册

gtoken替换jwt实现sso登录 | 排雷避坑

王中阳Go

VIP.5 如鱼得水

2022-05-27

11,928

前段时间整理的文章:gtoken替换jwt实现sso登录 | 带你读源码 收到了大家积极的反馈,还有幸上了【掘金一周】。

在此感谢掘友们,感谢掘金平台。

gtoken替换jwt实现sso登录的开发过程是比较稳健的,但是在我们测试联调的过程中暴露出了很多问题。

如果大家也想使用gtoken替换jwt实现sso登录,那么这篇文章可以减少很多大家debug的时间,分享一下我的踩坑之旅。

gtoken

服务端出于优化项目体验的考虑,替换了之前校验登录状态的方式,由JWT替换为 Gtoken。

gtoken替换jwt解决的问题

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

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

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

兼容JWT

gtoken替换jwt实现sso登录在前后端通信上是能做到兼容JWT的。

我们服务端的替换操作对前端同学应该是无感的,因为后端做了兼容处理,不需要前端同学修改任何东西。

gtoken实现原理

gtoken的实现原理以及如何使用建议大家读我这篇文章:

gtoken替换jwt实现sso登录 | 带你读源码。

在本篇文章中就不赘述了,下面重点介绍踩坑之旅:

踩坑之旅

当大家遇到登录问题时可以从这几个方向定位问题:

1 gtoken版本

如果我们使用的版本是gf1.x.x,只能使用gtokenv1.4.X相关版本。

而gtoken v1.5.0版本全面适配GoFrame v2.0.0。

如果遇到版本不一致的问题,比如提示这种:

可以通过指定gtoken版本解决,比如这样:

go get github.com/goflyfox/gtoken@v1.4.1

如果我们是团队多人协作,碰到需要指定依赖版本的问题,我们可以考虑把go.mod提交到git中。

在遇到这个问题之前,我的习惯是把go.mod添加的gitignore中。

大家有没有更好的办法来解决需要指定依赖版本的问题呢?大家可以在评论区留言指教。

2 gtoken存储问题

如果你们的项目是集群应用,gtoken的存储就需要使用gredis模式,而不是单机的gcache模式了。

这就需要我们生成token和获取token的各个项目连接的redis是一致的。

如果你是集群应用,千万要确保涉及到gtoken生成和验证的各个项目连接的redis是一致的。

所以,大家遇到token校验不通过时,可以首先排查一下配置文件,是不是连接redis库的问题。

3 不能跨环境使用token

正如上面提到的,如果gtoken的存储是使用redis中来实现集群项目的共享。

那我们是不能跨环境使用token的,因为我们的本机、开发、测试、预发布、生产等环境往往连接的是不同的redis。

4 测试账号不规范问题

如果测试时多个用户登录同一个账号,可能会出现奇葩问题。

究其原因是这样的:

gtoken是允许多点登录的,所以支持大家使用同一个账号登录。

但是!如果其中一个人做了退出登录的操作,那么其他人的登录态也会失效,需要重新登录。

比如设置的token有效期是2个小时,且2小时内有请求操作,会刷新token的有效期。但是如果有多人登录同一个账号,其中一个人退出,那么其他人的登录态也会失效的。

总结

gtoken版本问题

连接的redis库不一致问题

是否跨环境使用了token,导致校验不过的问题

多人登录同一个账号,有退出操作,导致登录态失效的问题

上面这些是我在开发中踩的坑,大家如果在集成gtoken时遇到登录态问题可以从这几个角度排查问题。

一起学习

公众号:程序员升级打怪之旅

微信号:wangzhongyang1993

福利:点这里-->半价买掘金小册,额外领红包

王中阳Go

掘金签约作者 @程序员升职加薪之旅

270

文章

1.1m

阅读

4.0k

粉丝 目录 收起

gtoken

gtoken替换jwt解决的问题

兼容JWT

gtoken实现原理

踩坑之旅

1 gtoken版本

2 gtoken存储问题

3 不能跨环境使用token

4 测试账号不规范问题

总结

一起学习

友情链接:

快穿之男二总得我来救

我的长安原文解析

javascript获取页面宽高

引用js文件位置

css动画实现旋转的小球

上下五千年之中国皇帝历史丨秦始皇、汉武帝、武则天丨给孩子讲的中国历史故事

gtoken documentation

gtoken documentation

gtoken documentation

node-gtoken

Node.js Google Authentication Service Account Tokens

This is a low level utility library used to interact with Google Authentication services. In most cases, you probably want to use the google-auth-library instead.

gtoken API Reference

github.com/googleapis/node-gtoken

Installation

Example :npm install gtokenUsage

Use with a .pem or .json key file:

Example :const { GoogleToken } = require('gtoken');

const gtoken = new GoogleToken({

keyFile: 'path/to/key.pem', // or path to .json key file

email: 'my_service_account_email@developer.gserviceaccount.com',

scope: ['https://scope1', 'https://scope2'], // or space-delimited string of scopes

eagerRefreshThresholdMillis: 5 * 60 * 1000

});

gtoken.getToken((err, tokens) => {

if (err) {

console.log(err);

return;

}

console.log(tokens);

// {

// access_token: 'very-secret-token',

// expires_in: 3600,

// token_type: 'Bearer'

// }

});You can also use the async/await style API:

Example :const tokens = await gtoken.getToken()

console.log(tokens);Or use promises:

Example :gtoken.getToken()

.then(tokens => {

console.log(tokens)

})

.catch(console.error);Use with a service account .json key file:

Example :const { GoogleToken } = require('gtoken');

const gtoken = new GoogleToken({

keyFile: 'path/to/key.json',

scope: ['https://scope1', 'https://scope2'], // or space-delimited string of scopes

eagerRefreshThresholdMillis: 5 * 60 * 1000

});

gtoken.getToken((err, tokens) => {

if (err) {

console.log(err);

return;

}

console.log(tokens);

});Pass the private key as a string directly:

Example :const key = '-----BEGIN RSA PRIVATE KEY-----\nXXXXXXXXXXX...';

const { GoogleToken } = require('gtoken');

const gtoken = new GoogleToken({

email: 'my_service_account_email@developer.gserviceaccount.com',

scope: ['https://scope1', 'https://scope2'], // or space-delimited string of scopes

key: key,

eagerRefreshThresholdMillis: 5 * 60 * 1000

});Options

Various options that can be set when creating initializing the gtoken object.

options.email or options.iss: The service account email address.

options.scope: An array of scope strings or space-delimited string of scopes.

options.sub: The email address of the user requesting delegated access.

options.keyFile: The filename of .json key or .pem key.

options.key: The raw RSA private key value, in place of using options.keyFile.

options.additionalClaims: Additional claims to include in the JWT when requesting a token.

options.eagerRefreshThresholdMillis: How long must a token be valid for in order to return it from the cache. Defaults to 0.

.getToken(callback)

Returns the cached tokens or requests a new one and returns it.

Example :gtoken.getToken((err, token) => {

console.log(err || token);

// gtoken.rawToken value is also set

});.getCredentials('path/to/key.json')

Given a keyfile, returns the key and (if available) the client email.

Example :const creds = await gtoken.getCredentials('path/to/key.json');Properties

Various properties set on the gtoken object after call to .getToken().

gtoken.idToken: The OIDC token returned (if any).

gtoken.accessToken: The access token.

gtoken.expiresAt: The expiry date as milliseconds since 1970/01/01

gtoken.key: The raw key value.

gtoken.rawToken: Most recent raw token data received from Google.

.hasExpired()

Returns true if the token has expired, or token does not exist.

Example :const tokens = await gtoken.getToken();

gtoken.hasExpired(); // false.revokeToken()

Revoke the token if set.

Example :await gtoken.revokeToken();

console.log('Token revoked!');Downloading your private .json key from Google

Open the Google Developer Console.

Open your project and under "APIs & auth", click Credentials.

Generate a new .json key and download it into your project.

Converting your .p12 key to a .pem key

If you'd like to convert to a .pem for use later, use OpenSSL if you have it installed.

Example :$ openssl pkcs12 -in key.p12 -nodes -nocerts > key.pemDon't forget, the passphrase when converting these files is the string 'notasecret'

License

MIT

results matching ""

No results matching ""

gtoken首页、文档和下载 - 基于 gf 框架的 token 插件 - OSCHINA - 中文开源技术交流社区

gtoken首页、文档和下载 - 基于 gf 框架的 token 插件 - OSCHINA - 中文开源技术交流社区

Gitee

资讯

专区

问答

活动

软件库

Tool

博客

培训

众包

登录

注册

开源软件库

/

国产软件

/

其他开发相关

/

gtoken

gtoken

基于 gf 框架的 token 插件

收藏18

评论0

分享

微信

QQ

微博

纠错

gtoken 正在参加 2021 年度 OSC 中国开源项目评选,请投票支持!

gtoken 在 2021 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!

2021 年度 OSC 中国开源项目评选 正在火热进行中,快来投票支持你喜欢的开源项目!

2021 年度 OSC 中国开源项目评选 >>> 中场回顾

gtoken 获得 2021 年度 OSC 中国开源项目评选「最佳人气项目」 !

授权协议

Apache 2.0

开发语言

Google Go

操作系统

跨平台

软件类型

开源软件

所属分类

程序开发、 其他开发相关

开源组织

地区

国产

投 递 者

Fly的狐狸

适用人群

未知

收录时间

2019-06-10

软件首页

软件文档

官方下载

概览

资讯

博客

问答

安全信息

软件简介

【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告

gtoken

介绍

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

github地址:https://github.com/goflyfox/gtoken

gitee地址:https://gitee.com/goflyfox/gtoken

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 := >oken.GfToken{

LoginPath:        "/login",

LoginBeforeFunc: loginFunc,

LogoutPath:       "/user/logout",

}

s.Group("/", 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()处理认证失败;

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做拦截认证放行;

严格按照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 := >oken.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

拦截认证完成后调用

支持

支持

感谢

gf框架 https://github.com/gogf/gf

展开阅读全文

代码

的 Gitee 指数为

超过 的项目

评论

点击引领话题

发布并加入讨论

给软件打分:

Fly的狐狸

发表了资讯

2021/07/05 16:11

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

gtoken v1.4.2 发布,基于 GoFrame 的 token 插件

本次更新: 此版本主要对GoFrame最新版本进行了升级测试,没有任何兼容性问题,同时对测试代码进行了完善; 欢迎大家加入GoFrame建设中:https://goframe.org/pages/viewpage.action?pageId=1114133 gtoken 介绍 基于GoFrame框架的token插件,通过服务端验证方式实现token认证;已完全可以支撑线上token认证,通过Redis支持集群模式;使用简单,大家可以放心使用; github地址:https://github.com/goflyfox/gtoken gitee地址:...

0

9

微信

QQ

微博

举报

Fly的狐狸

发表于开发技能专区

2020/11/30 09:56

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

gtoken v1.4.0 发布,基于 GoFrame 的 token 插件

本次更新: 此版本加入官方推荐的Group Middleware实现,使用官方主推的路由和中间件方式实现;推荐新老用户使用此方式;之前版本用户也不用担心升级兼容性,完美兼容历史版本用户; 升级内容如下: 加入Group Middleware实现,契合官网推荐方式; 完美兼容历史Global Middleware版本; 完善说明文档,加入参数说明及默认值; 完善单元测试代码,使用可参考example/sample目录; gtoken 介绍 基于GoFrame框架的token插件,通过服...

0

2

微信

QQ

微博

举报

Fly的狐狸

发表了资讯

2020/03/31 12:46

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

gtoken v1.3.15 发布,基于 GoFrame 的 token 插件

本次更新: 1. gf升级为V1.12.1 2. 加入全局拦截支持,方便调整认证和其他中间件执行顺序

  // 启动gtoken

  gtoken := >oken.GfToken{

    LoginPath: "/login",

    LoginBeforeFunc: loginFunc,

    LogoutPath: "/user/logout",

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

    GlobalMiddleware: true, // 开启...

1

7

微信

QQ

微博

举报

Fly的狐狸

发表了资讯

2019/12/20 13:18

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

gtoken v1.3.9 发布,基于GF框架的toke插件

本次更新: 1. gf升级为V1.10.1,适配时间格式兼容性修改 上次更新: 加入多端登录支持,可配置剔除登录用户还是同时登录 介绍 基于gf框架的token插件,通过服务端验证方式实现token认证;已完全可以支撑线上token认证,并支持集群模式;使用简单,大家可以放心使用; 支持单机gcache和集群gredis模式;

# 配置文件

[gtoken]

# 缓存模式 1 gcache 2 gredis

cache-mode = 1

# 是否支持多端登录

multi-log...

1

3

微信

QQ

微博

举报

Fly的狐狸

发表了资讯

2019/12/17 18:54

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

gtoken v1.3.8 发布,支持多端登录配置

本次更新: 1. 加入多端登录支持,可配置剔除登录用户还是同时登录 介绍 基于gf框架的token插件,通过服务端验证方式实现token认证;已完全可以支撑线上token认证,并支持集群模式;使用简单,大家可以放心使用; 支持单机gcache和集群gredis模式;

# 配置文件

[gtoken]

# 缓存模式 1 gcache 2 gredis

cache-mode = 1

# 是否支持多端登录

multi-login = true

支持简单token认证 加入缓存自动续期功能 ...

1

24

微信

QQ

微博

举报

Fly的狐狸

发表了资讯

2019/12/06 15:22

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

gtoken v1.3.7 发布,支持 GF 最新版本 v1.10.0

本次更新: 1. gf升级为V1.10.0 2. 修改版本兼容性相关代码 介绍 基于gf框架的token插件,通过服务端验证方式实现token认证;已完全可以支撑线上token认证,并支持集群模式;使用简单,大家可以放心使用; 支持单机gcache和集群gredis模式;

# 配置文件

# 缓存模式 1 gcache 2 gredis

cache-mode = 2

支持简单token认证 加入缓存自动续期功能

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

// ...

1

7

微信

QQ

微博

举报

Fly的狐狸

发表了资讯

2019/09/27 17:25

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

gtoken v1.3.5 发布,使用 gf 版本中间件

本次更新: 1. gf升级为V1.9.6 2. 使用gf新特性中间件实现认证 3. 优化认证处理逻辑,加入认证失败日志 介绍 基于gf框架的token插件,通过服务端验证方式实现token认证;已完全可以支撑线上token认证,并支持集群模式;使用简单,大家可以放心使用; 支持单机gcache和集群gredis模式;

# 配置文件

# 缓存模式 1 gcache 2 gredis

cache-mode = 2

支持简单token认证 加入缓存自动续期功能

// 注:通过MaxRefresh,默认当用...

0

7

微信

QQ

微博

举报

Fly的狐狸

发表了资讯

2019/09/17 00:40

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

gtoken v1.3.1 发布,gf 升级为最新 v1.9.1

gtoken 本次主要针对gf最新版本v1.9.1进行了适配,预祝gf v1.9.1能够得到更多关注和认可; 本次更新: gf升级为V1.9.1; 优化resp结构体目录; 优化example目录结构; 介绍 基于gf框架的token插件,通过服务端验证方式实现token认证;已完全可以支撑线上token认证,并支持集群模式;使用简单,大家可以放心使用; 支持单机gcache和集群gredis模式;

# 配置文件

# 缓存模式 1 gcache 2 gredis

cache-mode = 2

支持简单tok...

0

4

微信

QQ

微博

举报

Fly的狐狸

发表了资讯

2019/06/16 22:13

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

gtoken v1.2.0 发布,gf 的 token 插件,支持 token 续约

gtoken 此版本主要加入了token续约功能并对缓存进行了优化,自此gtoken已完全可以支撑线上token认证,并支持集群模式; 介绍 基于gf框架的token插件,通过服务端验证方式实现token认证; 支持单机gcache和集群gredis模式;

# 配置文件

# 缓存模式 1 gcache 2 gredis

cache-mode = 2

支持简单token认证 加入缓存自动续期功能

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

// 超时时间 默认10天 ...

1

4

微信

QQ

微博

举报

Fly的狐狸

发表了资讯

2019/06/12 00:46

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

gtoken v1.1.0 发布,gf 的 token 插件,加入 Redis 缓存支持

gtoken 此版本主要加入了缓存redis支持,便于项目集群部署 介绍 基于gf框架的token插件,通过服务端验证方式实现token认证; 支持单机gcache和集群gredis模式;

# 配置文件

# 缓存模式 1 gcache 2 gredis

cache-mode = 2

支持简单token认证 框架使用简单,只需要设置登录验证方法以及登录、登出、拦截路径即可; 安装教程 gopath模式: go get https://github.comgoflyfox/gtoken 或者 使用go.mod添加 :require github.co...

2

3

微信

QQ

微博

举报

Fly的狐狸

发表了资讯

2019/06/10 13:44

选择理由,精准屏蔽

不看该作者

不感兴趣

内容质量不好

广告

内容已过时

取消

确定

gtoken v1.0.0 发布,基于 goframe 框架的 token 插件

gtoken 此版本为gtoken v1.0.0,功能比较简陋,但可快速稳定实现接口token认证需求; 代码: https://github.com/goflyfox/gtoken 介绍 基于 gf 框架的 token 插件,通过服务端验证方式实现 token 认证: 支持单机 gcache 模式 支持简单 token 认证 框架使用简单,只需要设置登录验证方法以及登录、登出、拦截路径即可; 安装教程 gopath 模式: go get https://github.com/goflyfox/gtoken 或者 使用 go.mod 添加 :require git...

1

6

微信

QQ

微博

举报

没有更多内容

加载失败,请刷新页面

点击加载更多

加载中

下一页

{{o.author.name}}

发表了博客

{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}

{{parseInt(o.viewCount) | bigNumberTransform}}

微信

QQ

微博

举报

没有更多内容

暂无内容

{{o.author.name}}

发表了问答

{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}

{{parseInt(o.viewCount) | bigNumberTransform}}

微信

QQ

微博

举报

没有更多内容

暂无内容

暂无内容

Awesome 软件

换一换

JS-Flappy-Bird - Flappy Bird 的 JS 开源汉化版

mikutap - 休闲音乐类游戏(汉化版)

DataV-React - React 大屏数据展示组件库

MonitoRSS - 支持 RSS 的 Discord 机器人

不朽放置 - 时间管理增量游戏

Lastpass - Chrome 密码扩展

SylixOS - 嵌入式硬实时操作系统

GPT Neo - 开源 GPT 模型

Linux Mint - 基于 Ubuntu 的发行版

Vicuna - 达到 ChatGPT/Bard 90% 水平的聊天机器人

OpenLLaMA - LLaMA 大语言模型的开源复现版本

Beeftext - 适用于 Windows 的文本片段工具

蚂蚁放置2 - 关于蚂蚁的放置型经营游戏

GitDataV - GitHub 数据可视化平台

Password Safe - 加密软件

webOS - 基于 Linux 内核的智能电视操作系统

Stylus Extension - 网页外观样式管理器

.NET MAUI - .NET 跨平台 UI 框架

Skim - 轻量级高性能 PDF 阅读器

wachy - 用于 Linux 的动态跟踪分析器

react-big-screen - 基于 React 的数据大屏项目

Atlanta - 使用 JS 编写的开源 Discord 机器人

Datav.js - 可视化 JavaScript 库

DocsGPT - 开源 AI 文档助手

Katran - 高性能第 4 层负载均衡器

MiniRBT - 中文小型预训练模型

Freeplane - 思维导图软件

Unilang - 现代通用目的编程语言

Restful Fast Request - IDEA Postman 插件

Tabby - 基于 TypeScript 的现代化终端

热门内容

更多精彩内容

LFOSSA 祝大家女神节快乐!助力女性开源职业发展!

我的历时一年的独立开发故事

GreptimeDB v0.7 发布 — 全面支持云原生监控场景

野火IM 1.2.3 已经发布,即时通讯系统

一个使用 Java 开发的 LLM 应用开发框架,Agents-Flex alpha.2 发布

EmbedXrpc V5.0.0 已经发布,用于单片机场景的“gRPC”

2023 年 DevOps 报告:文化、用户中心性和技术能力驱动组织成功

AI 加速引擎 PAI-TorchAcc:整体介绍与性能概述

KCL v0.8.0 重磅发布 - 融汇社区生态,助力配置体验!

快手启动鸿蒙原生应用开发

"Java 将继续存在",60% 的公司计划扩招 Java 开发人员

如果企图在人工智能上搞“小院高墙”,将会犯下新历史错误

星动纪元开源人形机器人训练框架 Humanoid-Gym

微信即将推出原生 Linux 版本

开源日报 | Google=开源,好评;Microsoft=闭源收入还低,差评

WFS 文件存储系统 v1.0.1 发布

Syncthing 1.27.4 发布,连续文件同步工具

【比较 ORM 操作数据】总结

Node.js 新版官网开启 Beta 测试:全新现代化 UI、优化交互

零一万物开源 Yi-9B,代码数学综合能力全面增强

如何能够高效实现表格中的分权限编辑功能

3天上手Ascend C编程丨带你认识Ascend C基本概念及常用接口

从 ByteHouse 网关,看如何进一步提升 OLAP 引擎性能

分享两种Pulsar消息积压topic级别策略老化办法

华为云发布CodeArts APIMock服务,精准Mock,并行开发零等待!

ICCV 2023 | 当尺度感知调制遇上Transformer,会碰撞出怎样的火花?

从0到1实现 OpenTiny 组件库跨框架技术

云图说|新一代Serverless应用托管引擎——CAE

平凯数据库亮相 2023 信息技术应用创新论坛

如何用华为云ModelArts平台玩转Llama2

PostgreSQL采用MD5密码认证时密码和pg_authid里rolpassword的关系

4种Python中基于字段的不使用元类的ORM实现方法

从 AutoMQ Kafka 导出数据到 Databend

Runaway Queries 管理:提升 TiDB 稳定性的智能引擎

OceanBase安全审计之传输加密

PPT下载来了 | 回顾「2023中国PostgreSQL生态大会」主题要点

四问复合索引,让你的数据查询速度飞起

阿里云人工智能平台PAI多篇论文入选EMNLP 2023

亚信安慧AntDB:不只存储,更懂智能处理

WasmEdge 邀请你参加 WasmCon: 主题演讲、技术讲座和工作坊

得物大模型平台,业务效果提升实践

Rust std fs 比 Python 慢!真的吗!?

JavaScript中的浅拷贝与深拷贝

Firefox在2023年为真实用户提供了更快的体验

拓展知识 启望未来 | 记内蒙古移动《AntDB ACA初级认证培训》活动

红色警报:PG或基于PG的国产库注意了!

K8s集群CoreDNS监控告警最佳实践

大模型,新小布

Marketplace 新闻 | 年度热门插件、针对插件作者和用户的改进

同事突然问我:异步网络请求编码的方法

多模态 多引擎 超融合 新生态!2023亚信科技AntDB数据库8.0产品发布

在 Excel 里研发俄罗斯方块;全国首例「AI 声音侵权案」审理丨 RTE 开发者日报 Vol.106

「MySQL 5.7 停服讨论区」上线,来这里畅所欲言~

【云栖2023】林伟:大数据AI一体化的解读

巨折空降!JetBrains Rider 3.5 折优惠启动,仅限 65 小时!

百度曾出价 8500 万挖“AI 教父”被拒;GPT-3.5 图灵测试中败给上世纪 AI丨 RTE 开发者日报 Vol.99

有哪些好用的甘特图插件?

LLVM之父Chris Lattner:我的AI基础设施软件构建理念

亚信安慧AntDB-M的扩展功能(三)

AP引擎助力加速生产SQL运行

云图说丨初识华为云DDoS防护AAD——DDoS攻击防护平台

Xline v0.6.0: 一个用于元数据管理的分布式KV存储

精彩回顾|从架构到实践,AntDB融合型数据库揭秘

Kotlin 路线图更新了!今年还有哪些亮点值得期待?

异常检测、自动告警,业务问题分钟级识别

科大讯飞刘庆峰:华为GPU能力可对标英伟达A100;科技五巨头入门工程师平均年薪报告;戴尔PC中国出货量暴跌52% | EA周报

AntDB-M高性能设计之hash索引动态rehash

企业诊断屋:在线小说企业如何用A/B测试赋能业务

【玩转鲲鹏DevKit系列】何如快速迁移有源码应用

数仓如何递归查询视图依赖

数据库性能优化必读,AntDB-M全局统计信息

探索AntDB:数据驱动时代的引擎

GreatSQL社区月报 | 2023.10

KubeCon China 2023 | 拥抱开源,华为云原生华彩绽放

时序数据库入门 | 时序数据库的特点及与传统数据库的区别详解

新一轮智能制造相关产业政策猜想

Sermant重磅更新,1.3.0 release版本发布

安全情报 | Pypi再现窃密攻击投毒

华为云盘古大模型加码生物医药,为行业插上“数字翅膀”

TiDB Bot:用 Generative AI 构建企业专属的用户助手机器人

展会 | 探寻软件发展新动向 GreatSQL出席Qcon全球软件开发大会

做服务的架构陷阱,你掌握了多少

紧急提醒!MySQL5.7即将停服…

云小课|MRS基础操作之集群健康检查

带你快速上手HetuEngine

Istio 网格的出口定义者:深入了解 Egress Gateway

华为云帕鲁服务器-云耀云容器版,到底强在哪?

mysqldump 搭建复制报错,竟然是因为这个!

从4个特点为你解密华为云媒体网络底座AND

深入MaxCompute -第十二弹 -PIVOT/UNPIVOT

StarRocks & Friends 广州站精彩回顾

实用技巧 | 使用 CLion 解决 C++ 的 7 大痛点

AI 遇见PostgreSQL: pgvector在文本搜索中的革命

释放创造力:可视化页面渲染引擎在低代码开发平台的应用

PostgreSQL 每周新闻 2023-7-19

亚信安慧AntDB:数智化转型的可持续动能

3步带你搞定华为云编译构建CodeArts Build “新手村任务”

第五届宁波市卫生健康系统信息化技能竞赛暨赛前培训成功举办 平凯星辰受邀授课

全站热门评论

大星星 2024-03-07 15:29

有没可能是故意的

CheckStyle 2024-02-21 18:45

关键是什么业务?10个人,2023年,一年,赚2000多万,泼天的富贵啊

屮殖 2024-03-07 15:38

我人品咋了?就事论事就是人品有问题?对我简介都这么关心?我都忘了自己写了什么了。是不是爱一点点国,就是眼中钉了?是不是爱国必须表现装给你们看才行?评论一个社会事件怎么搞到爱国程度了?我就事论事,让某些人不要总是用嫉妒心看待别人,只能害了自己,难道不对?

有你何须仰望 2024-03-07 15:46

越看越像新版QQ NT

高排量低炭烧 2024-02-26 21:29

鸿蒙只是人家现学的,人家本来薪水就这么高,而不是新手培训完就值这个数

小xu中年 2024-03-07 16:27

朋克 2024-02-28 11:36

这才是正常的盈利模式

monkey_cici 2024-02-26 11:39

开源系统还是要看民企的深度统信和华为欧拉...

RobotPainter 2024-03-07 17:40

我感觉挺好的,这就是没有小院高墙的体现

yl-yue 2024-02-18 13:49

操作也是相当炸裂,原来还可以这样玩,字太多了没读透,我的理解,就算是鸡肋专利也够他们吹嘘了,要是限制性专利,那是相当牛逼,开源行业要炸。

屮殖 2024-03-07 15:41

小米的新闻,主角却是华为,这说明谁更重要,以至于敌人想除之而后快呢?

u

unameuname 2024-02-19 14:02

第一次钓鱼,别TM给我鱼竿,我只要鱼。

neou 2024-03-07 16:32

不要什么都让国家管,支不支持Linux要让企业说了算,让市场说了算。

luwenhua 2024-03-05 18:18

其实用用惯了,比windows省心多了

m

moon_red 2024-03-07 18:09

第一个Warning是在Wayland环境下用X11的qt出现的,不影响使用。libva和iHD_drv_video.so都是视频硬件加速,可能是你libva没配好

记得小蘋初见123 2024-02-29 16:53

百小僧,出列

y

yfxuwork 2024-03-07 16:42

linuxmint下打开后扫码登录失败, 不过希望之后能像qq一样出个appimage的包。 多方便。

屮殖 2024-03-07 15:42

啥意思?你看看大毛那样不就知道了?我们还有个任务没完成呢,毛子那种待遇我们几乎是必然的事,不要早做准备?

osc_56137622 2024-03-07 17:34

赞:+1:

屮殖 2024-03-07 15:26

汉代盐铁论就论断和实践的产业政策问题,往往被庸人自以为是的小聪明批判。程序员很多人是理科生,很多人从来不看历史。

skykainls 2024-03-07 16:13

还是逃不过东半球最强法务部的子弹

Yoona520 2024-02-24 17:44

国外那个P站的技术水准可不低,毕竟服务全世界除CN之外的人

魔力猫 2024-02-01 09:35

这篇说的好听,但你心里,公有制就是白嫖,你之前公告写着“ioGame21 在线文档依旧采用自愿付费模式策略。简单的说,我们提供了最新在线文档的白嫖方式,如果你打算跟进框架最新版本的,依旧可以选择白嫖在线文档。”,“综上,想继续白嫖的,请跟进最新版本。”不是吗?这是什么理念?我看更像精神分裂的理念,伪君子和真小人之间来回切换,嘴上都不一致。

Yokesily 2024-03-07 18:43

看这截图,很多杀毒防火墙软件都很缺乏用户体验设计!又红色感叹号告诉危险,又绿色告诉已验证,所以这弹窗到底想告诉用户什么??从用户角度看,用户想知道的是~谁发起什么操作,就比如xx软件创建了test服务,或者用户主动创建了test服务,提示内容要关键到位啊

RobotPainter 2024-03-07 17:21

下意识navbar里找Pricing。。。

小xu中年 2024-03-07 16:29

拥抱信创

老盖 2024-02-01 14:11

windows没希望了,一群阿三,越做越差

c

cassan 2024-03-01 22:19

开源了,我们国内的公司又可以申请知识产权了

zhangjinsongok 2024-02-01 16:29

开源世界的孤胆英雄。

小xu中年 2024-03-07 16:31

……

dantezhu 2024-02-28 11:20

那,这就叫专业。

gmg 2024-02-26 22:23

有点好奇为什么发布这种表面看起来吸引眼球的标题。

o

osc_91229770 2024-02-18 12:03

这也申请专利,这个不是正常crud,常规操作吗

魔力猫 2024-02-01 14:19

最近这些事件的主角,初心绝对不是什么为了创造啥,为的只是赚钱。开源只是赚钱手段,而且是觉得自己为了钱放弃很多的那种心态,心理先把自己当成了牺牲者,然后认为所有人都应该补偿自己。不拿钱补偿就是忘恩负义的白眼狼!

J

JK_STAR 2024-03-07 16:08

QT写的

gitlinux 2024-03-07 16:12

postrm脚本,if语句忘写 fi 啦,手动修正一下即可

2

2cong 2024-02-26 11:21

如果让我抄,我就会!

魔力猫 2024-02-01 09:48

开源不是不可以收费,基本上也没人认为开源项目里有收费项目是什么十恶不赦的罪过。问题在于,你要合理合法,要符合开源的道德。最近的事件,要么是某和尚绑票,不合理不合法更没道德,绑票拿赎金。要么就是这位,明明合法的事情,偏偏发个歧视公告,张嘴白嫖闭嘴白嫖,过嘴瘾有意思吗?开源生意,哪怕你心理一万个不愿意,但是既然你做了这个生意,伪君子人设好歹你不干的时候再扔呀,一会儿伪君子一会儿真小人,觉得不找骂才怪。

J

Jason909 2024-03-07 15:43

“还有 84% 的 IntelliJ IDEA 用户表示,他们在 Java 开发实践中还使用过其他 IDE,其中 VSCode 是最常见的选择。”Eclipse的第二还能保多久?

大风起兮9527 2024-02-06 08:57

这事没啥好讨论的啊,代码如果开始的时候是开源,那么你有闭源的权利,但是要从声明之后的版本开始,不能回溯。文档也是如此,但是有一点,如果文档虽然没有声明开源,但是自己在公开场合发布过,你可以建议请求不要随意传播,但是不能强硬的禁止。关于白嫖,这个说法过分了,对于这些想要商业化的项目,开源伊始的初心,无非是面推广费、免费测试。各有所图,不要互相指责。

小xu中年 2024-03-07 16:31

优秀

小肥侠 2024-02-19 17:51

所以将开源软件打包到应用商店,是真的有市场。

Z生生不息 2024-01-31 18:33

没有人要求你必须要维护必须开源。但是你有权力要求用户“不得以任何形式传播及公开”吗?这是 AGPL 开源协议所允许的吗?如果你连开源协议都搞不清楚,早点把仓库归档吧。整得跟小学生耍流氓一样。

91winter 2024-03-07 17:03

可能是钓鱼的吧~

闲大赋 2024-02-18 20:49

我对此专利的解读『 https://my.oschina.net/xiandafu/blog/11043929』

osc_94406955 2024-03-01 09:29

预计该问题会在 24 小时内彻底解决............. 今天3月1日了,bug神奇的消失

风一样的Man 2024-03-06 10:50

我还没开始用, 你就砍掉了

jobell 2024-03-07 17:02

微信开发工具赶紧推出linux版本吧

simba_sailor 2024-03-07 17:03

有安装了今天更新的修复登陆问题的版本,可能 登陆,可以有聊天历史同步。现在主要的问题是中文输入不了。

天朝八阿哥 2024-02-29 10:32

虽然不懂,但表示很赞,比随便就冠以“国产”“自主研发”之类的让人舒心太多了

d

dwcz 2024-02-18 22:12

中国法治的水平:二创可以演绎原创,三创不能演绎二创。

爱吃生梨 2024-01-31 15:35

百小僧果然是刷新中国开源底线里程碑式的人物,这不追随者来了。而且从.net扩散到java

redblueme 2024-03-07 16:07

牛逼,有空试一下

小呆呆的星空 2024-03-07 17:19

有钱人当然不要做程序员,草根出身做程序员待遇是不错的

fyf187 2024-03-07 16:00

内容可能含有违规信息

姜鹏飞 2024-03-07 17:15

漂亮

屮殖 2024-03-07 15:47

你说的很对,能源的确是另一个很重要的方面。但是AI和挖矿不一样,他的使用是要比训练少数量级差别的算力的。而AI能达到的功能是由训练实现的。目前情况下,电力很多国家都够支撑,但是芯片实现的算力全世界只有为数不多的AI公司才能有条件训练大模型了。对比小模型就能看出来,小模型是个人能训练的。

t

tedx53 2024-02-27 09:42

高考状元的试卷给我抄,我也能轻松上清华

我的ID是jmjoy 2024-03-07 17:45

让市场说了算明显不行,某些企业利用资本先发优势大搞垄断,霸占生态位不干人事,店大欺客,早就应该治治了。

k

kylexy 2024-02-26 10:38

大实话。。。。

软件作者

本软件还没有认证的作者

认证为作者

邀请作者认证

此软件还没有被作者认证,快来邀请作者认证吧!

成功邀请奖励:

开源伯乐勋章

专属邀请文案:

你的软件 “gtoken” 被开源中国社区收录啦,快点击 https://www.oschina.net/p/gtoken 认证为软件作者吧!

复制邀请文案

同类软件推荐

更多

ExtismWebAssembly 插件实现框架

Extism 是一个 WebAssembly 插件实现框架,它可以给你的应用开发出各种各样的 WebAssembly 插件,支持多种编程语言。 Exism 团队称他们致力于构建一个可嵌入的、安全...

libnopC++ 本机对象协议

libnop是一个仅用于序列化和反序列化C++数据类型的头库,无需外部代码生成器或运行时支持库。唯一的强制性要求是一个支持C++14标准的编译器。 libnop有以下目标: 使简单的序列化任务变...

rsedis用 Rust 重新实现 Redis

rsedis 是一个使用 Rust 重新实现一遍 Redis 的项目,旨在学习 Rust。 用例 rsedis 不依赖于 UNIX 特定的功能。Windows 用户可以运行它作为 Redis 的...

Spezi数字健康应用开发框架

Spezi 是一个用于快速开发现代、可互操作的数字健康应用程序的开源框架。 有关详细信息,请参阅 API documentation 。 架构 Spezi 引入了一种基于标准的模块化方法来构建数...

隐语可信隐私计算框架

隐语 (SecretFlow) 是蚂蚁集团开源的可信隐私计算技术框架,涵盖了当前几乎所有主流隐私计算技术。 隐语内置 MPC、TEE、同态等多种密态计算虚拟设备,提供多类联邦学习算法和差分隐私机...

热门资讯

1

黄仁勋:别让你的孩子长大后成为程序员

2

Visual Studio Code 1.87 发布,语音听写

3

开源中国 APP 全新上线:“动弹”回归、集成大模型对话、畅读技术报告

4

马斯克起诉 OpenAI 及其 CEO 奥特曼,要求公司恢复开源状态

5

倒了一个 Yuzu,还有千千万万个“转世”开源模拟器

6

向使当时真开源,小人/君子有谁知?某开源账号引发众怒

7

微信即将推出原生 Linux 版本

8

全球最流行开源 Switch 模拟器 Yuzu 删除代码仓库、向任天堂支付 240 万美元

9

新款 MacBook Air:搭载 M3 芯片、可外接 2 台显示器、全球最好的 AI 消费级笔记本电脑

10

织梦 CMS “混沌”往事二十年

0 评论

18 收藏

微信

QQ

微博

分享

登录后可查看更多优质内容

使用微信快捷登录

OSCHINA 社区

关于我们

联系我们

加入我们

合作伙伴

Open API

在线工具

Gitee.com

企业研发管理

CopyCat-代码克隆检测

实用在线工具

国家反诈中心APP下载

攻略

项目运营

Awesome 软件(持续更新中)

QQ群

229767317

公众号

视频号

©OSCHINA(OSChina.NET)

工信部

开源软件推进联盟

指定官方社区

社区规范

深圳市奥思网络科技有限公司版权所有

粤ICP备12009483号

顶部

gtoken - npm

gtoken - npm

skip to:contentpackage searchsign in❤Notoriously Pedantic MagistrateProTeamsPricingDocumentationnpmSearchSign UpSign In gtoken7.1.0 • Public • Published a month ago ReadmeCode Beta2 Dependencies42 Dependents47 Versions

node-gtoken

Node.js Google Authentication Service Account Tokens

This is a low level utility library used to interact with Google Authentication services. In most cases, you probably want to use the google-auth-library instead.

gtoken API Reference

github.com/googleapis/node-gtoken

Installation

npm install gtoken

Usage

Use with a .pem or .json key file:

const { GoogleToken } = require('gtoken');

const gtoken = new GoogleToken({

keyFile: 'path/to/key.pem', // or path to .json key file

email: 'my_service_account_email@developer.gserviceaccount.com',

scope: ['https://scope1', 'https://scope2'], // or space-delimited string of scopes

eagerRefreshThresholdMillis: 5 * 60 * 1000

});

gtoken.getToken((err, tokens) => {

if (err) {

console.log(err);

return;

}

console.log(tokens);

// {

// access_token: 'very-secret-token',

// expires_in: 3600,

// token_type: 'Bearer'

// }

});

You can also use the async/await style API:

const tokens = await gtoken.getToken()

console.log(tokens);

Or use promises:

gtoken.getToken()

.then(tokens => {

console.log(tokens)

})

.catch(console.error);

Use with a service account .json key file:

const { GoogleToken } = require('gtoken');

const gtoken = new GoogleToken({

keyFile: 'path/to/key.json',

scope: ['https://scope1', 'https://scope2'], // or space-delimited string of scopes

eagerRefreshThresholdMillis: 5 * 60 * 1000

});

gtoken.getToken((err, tokens) => {

if (err) {

console.log(err);

return;

}

console.log(tokens);

});

Pass the private key as a string directly:

const key = '-----BEGIN RSA PRIVATE KEY-----\nXXXXXXXXXXX...';

const { GoogleToken } = require('gtoken');

const gtoken = new GoogleToken({

email: 'my_service_account_email@developer.gserviceaccount.com',

scope: ['https://scope1', 'https://scope2'], // or space-delimited string of scopes

key: key,

eagerRefreshThresholdMillis: 5 * 60 * 1000

});

Options

Various options that can be set when creating initializing the gtoken object.

options.email or options.iss: The service account email address.

options.scope: An array of scope strings or space-delimited string of scopes.

options.sub: The email address of the user requesting delegated access.

options.keyFile: The filename of .json key or .pem key.

options.key: The raw RSA private key value, in place of using options.keyFile.

options.additionalClaims: Additional claims to include in the JWT when requesting a token.

options.eagerRefreshThresholdMillis: How long must a token be valid for in order to return it from the cache. Defaults to 0.

.getToken(callback)

Returns the cached tokens or requests a new one and returns it.

gtoken.getToken((err, token) => {

console.log(err || token);

// gtoken.rawToken value is also set

});

.getCredentials('path/to/key.json')

Given a keyfile, returns the key and (if available) the client email.

const creds = await gtoken.getCredentials('path/to/key.json');

Properties

Various properties set on the gtoken object after call to .getToken().

gtoken.idToken: The OIDC token returned (if any).

gtoken.accessToken: The access token.

gtoken.expiresAt: The expiry date as milliseconds since 1970/01/01

gtoken.key: The raw key value.

gtoken.rawToken: Most recent raw token data received from Google.

.hasExpired()

Returns true if the token has expired, or token does not exist.

const tokens = await gtoken.getToken();

gtoken.hasExpired(); // false

.revokeToken()

Revoke the token if set.

await gtoken.revokeToken();

console.log('Token revoked!');

Downloading your private .json key from Google

Open the Google Developer Console.

Open your project and under "APIs & auth", click Credentials.

Generate a new .json key and download it into your project.

Converting your .p12 key to a .pem key

If you'd like to convert to a .pem for use later, use OpenSSL if you have it installed.

$ openssl pkcs12 -in key.p12 -nodes -nocerts > key.pem

Don't forget, the passphrase when converting these files is the string 'notasecret'

License

MIT

ReadmeKeywordsgoogleserviceaccountapitokenapiauthPackage SidebarInstallnpm i gtokenRepositoryGitgithub.com/google/node-gtokenHomepagegithub.com/google/node-gtoken#readmeDownloadsWeekly Downloads10,541,200Version7.1.0LicenseMITUnpacked Size41.4 kBTotal Files6Last publisha month agoCollaboratorsTry on RunKitReport malware FooterSupportHelpAdvisoriesStatusContact npmCompanyAboutBlogPressTerms & PoliciesPoliciesTerms of UseCode of ConductPrivacy