Go语言入门篇-jwt(json web token)权限验证
一。token、cookie、session的区别
1。cookie
Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie。 内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。 硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。 所以,按存在时间,可分为非持久Cookie和持久Cookie。 cookie 是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。 cookie由服务器生成,发送给浏览器,浏览器把cookie以key-value形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。 由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。
2。session
session 从字面上讲,就是会话。这个就类似于你和一个人交谈,你怎么知道当前和你交谈的是张三而不是李四呢?对方肯定有某种特征(长相等)表明他就是张三。 session 也是类似的道理,服务器要知道当前发请求给自己的是谁。为了做这种区分,服务器就要给每个客户端分配不同的“身份标识”, 然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了。至于客户端怎么保存这个“身份标识”, 可以有很多种方式,对于浏览器客户端,大家都默认采用 cookie 的方式。 服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这种用户信息存储方式相对cookie来说更安全, 可是session有一个缺陷:如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。
3。token
token的意思是“令牌”,是用户身份的验证方式. 最简单的token组成: 【1】uid(用户唯一的身份标识)
【2】time(当前时间的时间戳)
【3】sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,
可以防止恶意第三方拼接token请求服务器)。还可以把不变的参数也放进token,避免多次查库 这里的token是指SON Web Token
用户注册之后, 服务器生成一个 JWT token返回给浏览器, 浏览器向服务器请求数据时将 JWT token 发给服务器,
服务器用 signature 中定义的方式解码
WT 获取用户信息.
一个 JWT token包含3部分:
【1】header: 告诉我们使用的算法和 token 类型
【2】Payload: 必须使用 sub key 来指定用户 ID, 还可以包括其他信息比如 email, username 等.
【3】Signature: 用来保证 JWT 的真实性. 可以使用不同算法
二。jwt(json web token)权限验证
完整代码:
package main import (
"log"
"net/http"
"github.com/codegangsta/negroni"
"encoding/json"
"fmt"
"strings"
"github.com/dgrijalva/jwt-go"
"time"
"github.com/dgrijalva/jwt-go/request"
) /**
说明:
客户端通过在request对象header里添加token参数,发送到服务端。
服务端再拿出token进行比对。
token的第一次产生是发生在login检查账户存在并且正确之后,为该用户赋予一块令牌(加密字符串)
并将token放入response的header里。客户端登陆成功后,从response里取出token。并在以后操作request请求。
都保持在header里添加该段令牌,令牌有效期失效后,只有重新login,才能获取新的令牌。
*/
const (
//SecretKey = "welcome to wangshubo's blog"
SecretKey = "I have login"
) func fatal(err error) {
if err != nil {
log.Fatal(err)
}
} type UserCredentials struct {
Username string `json:"username"`
Password string `json:"password"`
} type User struct {
ID int `json:"id"`
Name string `json:"name"`
Username string `json:"username"`
Password string `json:"password"`
} type Response struct {
Data string `json:"data"`
} type Token struct {
Token string `json:"token"`
} func StartServer() { http.HandleFunc("/login", LoginHandler) http.Handle("/resource", negroni.New(
negroni.HandlerFunc(ValidateTokenMiddleware),
negroni.Wrap(http.HandlerFunc(ProtectedHandler)),
)) log.Println("Now listening...")
http.ListenAndServe(":8080", nil)
} func main() {
StartServer()
} func ProtectedHandler(w http.ResponseWriter, r *http.Request) { response := Response{"Gained access to protected resource !"}
JsonResponse(response, w) } //服务端生成token,并放入到response的header
/**
JWT由三部份组成:
* Header:头部 (对应:Header)
* Claims:声明 (对应:Payload)
* Signature:签名 (对应:Signature)
*/
func LoginHandler(w http.ResponseWriter, r *http.Request) { var u *User=new(User) var user UserCredentials err := json.NewDecoder(r.Body).Decode(&user) if err != nil {
w.WriteHeader(http.StatusForbidden)
fmt.Fprint(w, "Error in request")
return
} //验证是身份:若用户是someone,则生成token
if strings.ToLower(user.Username) != "someone" {
if user.Password != "p@ssword" {
w.WriteHeader(http.StatusForbidden)
fmt.Println("Error logging in")
fmt.Fprint(w, "Invalid credentials")
return
}
} //1。生成token
token := jwt.New(jwt.SigningMethodHS256)
claims := make(jwt.MapClaims)
//2。添加令牌关键信息
//添加令牌期限
claims["exp"] = time.Now().Add(time.Hour * time.Duration()).Unix()
claims["iat"] = time.Now().Unix()
claims["id"]=u.ID
claims["userName"]=u.Username
claims["password"]=u.Password
token.Claims = claims fmt.Println(claims) if err != nil {
w.WriteHeader(http.StatusInternalServerError)
fmt.Fprintln(w, "Error extracting the key")
fatal(err)
} //获取令牌
tokenString, err := token.SignedString([]byte(SecretKey))
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
fmt.Fprintln(w, "Error while signing the token")
fatal(err)
} //2。将生成的token放入到header
response := Token{tokenString}
JsonResponse(response, w) } //验证Token
func ValidateTokenMiddleware(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
token, err := request.ParseFromRequest(r, request.AuthorizationHeaderExtractor,
func(token *jwt.Token) (interface{}, error) {
return []byte(SecretKey), nil
}) if err == nil {
if token.Valid {
next(w, r)
} else {
w.WriteHeader(http.StatusUnauthorized)
fmt.Fprint(w, "Token is not valid")
}
} else {
w.WriteHeader(http.StatusUnauthorized)
fmt.Fprint(w, "Unauthorized access to this resource")
} } func JsonResponse(response interface{}, w http.ResponseWriter) {
json, err := json.Marshal(response)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
w.Write(json)
}
通过postman进行验证:
Step1:发送登录请求
Step2:使用服务端返回客户端的token去验证有效性(根据获得的token进行get请求)
参考博客:https://blog.csdn.net/wangshubo1989/article/details/74529333
Go语言入门篇-jwt(json web token)权限验证的更多相关文章
- Java JWT: JSON Web Token
Java JWT: JSON Web Token for Java and Android JJWT aims to be the easiest to use and understand libr ...
- 如何在SpringBoot中集成JWT(JSON Web Token)鉴权
这篇博客主要是简单介绍了一下什么是JWT,以及如何在Spring Boot项目中使用JWT(JSON Web Token). 1.关于JWT 1.1 什么是JWT 老生常谈的开头,我们要用这样一种工具 ...
- ( 转 ) 什么是 JWT -- JSON WEB TOKEN
什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点 ...
- 关于JWT(Json Web Token)的思考及使用心得
什么是JWT? JWT(Json Web Token)是一个开放的数据交换验证标准rfc7519(php 后端实现JWT认证方法一般用来做轻量级的API鉴权.由于许多API接口设计是遵循无状态的(比如 ...
- JWT(JSON Web Token) 【转载】
JWT(JSON Web Token) 什么叫JWTJSON Web Token(JWT)是目前最流行的跨域身份验证解决方案. 一般来说,互联网用户认证是这样子的. 1.用户向服务器发送用户名和密码. ...
- [更新]一份包含: 采用RSA JWT(Json Web Token, RSA加密)的OAUTH2.0,HTTP BASIC,本地数据库验证,Windows域验证,单点登录的Spring Security配置文件
没有任何注释,表怪我(¬_¬) 更新: 2016.05.29: 将AuthorizationServer和ResourceServer分开配置 2016.05.29: Token获取采用Http Ba ...
- 什么是JWT(Json Web Token)
什么是 JWT (Json Web Token) 用户认证是计算机安全领域一个永恒的热点话题. JWT 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519). 该to ...
- API安全验证之JWT(JSON WEB TOKEN) OLCMS
假如www.olcms.com/getUserInfo获取用户信息,你怎么知道当前用户是谁?有人说登陆时候我把他UID写入session了,如果是API接口,没有session怎么办,那么就需要把UI ...
- 5分钟搞懂:JWT(Json Web Token)
https://www.qikegu.com/easy-understanding/892 JWT 基于token的用户认证原理:让用户输入账号和密码,认证通过后获得一个token(令牌),在toke ...
- JWT(Json Web Token)认证
目录 JWT(Json Web Token) JWT的数据结构 JWT的用法 JWT验证流程
随机推荐
- Kendo UI使用教程:入门指南
[Kendo UI最新试用版下载] Kendo UI目前最新提供Kendo UI for jQuery.Kendo UI for Angular.Kendo UI Support for React和 ...
- html中自定义上传文件的样式
<script> $(function(){ $("#avatsel1").click(function(){ $("input[type='file']&q ...
- windows下查看C语言字符数组(俗称:字符串)在内存中地址信息的操作过程
#include <stdio.h> #pragma warning(disable:4996) int power10(int n) { ) { ; } ; ; i < n; ...
- hdu 3376 : Matrix Again【MCMF】
题目链接 题意:给定一个n*n的矩阵,找一条路,从左上角到右下角再到左上角,每个点最多经过一次,求路径上的点的权值的最大和. 将矩阵中每个点拆点,点容量为1,费用为点权值的相反数.每个点向自己右侧和下 ...
- form表单细节
一.表单 表单<form> 标签用于为用户输入创建 HTML 表单 表单能够包含 input 元素,比如文本字段.复选框.单选框.提交按钮等等. 表单还可以包含 menus.textare ...
- 【模板】【数论】二次剩余Cipolla算法,离散对数BSGS 算法
Cipolla LL ksm(LL k,LL n) { LL s=1; for(;n;n>>=1,k=k*k%mo) if(n&1) s=s*k%mo; return s; } n ...
- Javascript高级程序设计第三版-笔记
1.JS数值最大值最小值: >Number.MIN_VALUE <5e-324 >Number.MAX_VALUE <1.7976931348623157e+308 判断数值是 ...
- onload,domcontentload区别+onload详解
todo onLoad是的在页面所有文件加载完成后执行 DomContentLoad是Dom加载完成后执行,不必等待样式脚本和图片加载 domContentLoad更为合理, 原理: 如果是webki ...
- wannalfy 挑战赛7 F Masha与老鼠(贪心+dp)
链接:https://www.nowcoder.net/acm/contest/56/F 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 6 ...
- [CSP-S模拟测试]:取石子(博弈论+DP)
题目描述 有三堆石子,它们的石子个数分别为$x,y,z$.$A$和$B$正在博弈,由$A$先手,双方轮流操作.每次操作是指,选择若干堆($1-3$堆)石子,从中各取出相同数量的石子(不能$1$个都不取 ...