【REST2SQL】01RDB关系型数据库REST初设计
【REST2SQL】02 GO连接Oracle数据库
【REST2SQL】03 GO读取JSON文件
【REST2SQL】04 REST2SQL第一版Oracle版实现
【REST2SQL】05 GO 操作 达梦 数据库
【REST2SQL】06 GO 跨包接口重构代码
【REST2SQL】07 GO 操作 Mysql 数据库
【REST2SQL】08 日志重构增加输出到文件log.txt
【REST2SQL】09 给Go的可执行文件exe加图标和版本信息等
【REST2SQL】10 REST2SQL操作指南
0 token 与 jwt 简介
0.1 token简介
Token 本质是字符串,用于请求时附带在请求头中,校验请求是否合法及判断用户身份。
Token 请求时提供,用于校验用户是否具备访问接口的权限。
Token 的用途主要有三点:
- 拦截无效请求,降低服务器处理压力;
- 实现第三方 API授权,无需每次都输入用户名密码鉴权;
- 身份校验,防止 CSRF 攻击。
0.2 jwt简介
JWT(JSON Web Token)是一种用于身份验证和授权的开放标准(RFC 7519),它是一种安全的、轻量级的身份验证方式。
JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。
头部(Header):JWT 的头部通常由两部分信息组成:令牌的类型(即JWT)和所使用的签名算法,例如:
{
"alg": "HS256", "typ": "JWT"}
载荷(Payload):JWT的载荷包含了一些声明(Claim),用于描述用户信息、权限、过期时间等等,例如:
{
"sub": "1234567890", "name": "John Doe", "iat": 1516239022}
签名(Signature):JWT的签名由头部和载荷组成,并使用密钥进行加密生成,例如:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
0.2.1 JWT 的使用流程如下:
用户使用用户名和密码进行登录,服务器验证用户信息是否正确。
服务器生成一个JWT,将用户信息、权限等信息写入载荷中,并使用密钥对头部和载荷进行签名。
服务器将生成的JWT返回给客户端,客户端将其存储在本地,通常是在浏览器的cookie或本地存储中。
客户端在后续的请求中,将JWT作为请求头部或请求参数传递给服务器。
服务器收到请求后,验证JWT的签名是否正确,如果正确则解析出用户信息、权限等信息,进行后续操作。
0.2.2 JWT 的优点:
无状态:JWT是无状态的,服务器不需要保存任何会话信息,可以轻松扩展和分布式环境下使用。
安全:JWT通过密钥对头部和载荷进行签名,保证了数据的完整性和安全性。
跨域支持:JWT可以跨域使用,可以在不同的域名和服务器之间使用。
简单易用:JWT使用简单,易于实现和维护。
0.2.3 JWT 的缺点:
载荷信息不能太多:JWT的载荷信息不能太多,否则会导致JWT的长度过长,增加网络传输的负担。
安全性依赖于密钥:JWT的安全性依赖于密钥的保护,如果密钥泄露,则JWT的安全性将受到威胁。
无法撤销:一旦JWT生成后,无法撤销,除非修改密钥或者设置短期的过期时间
1 基于jwt-go实现token服务端
JWT-Go是一个使用Go语言实现的JSON Web Token(JWT)库1。
JWT是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下。JWT-Go库提供了创建和验证JWT的方法,包括使用默认Claims和自定义Claims来创建Token对象,以及解析和验证Token的有效性等。JWT-Go库在Go语言社区中广泛使用,并且有许多配置选项可供选择,可以满足不同的业务需求。
1.1 安装jwt-go库
go get github.com/dgrijalva/jwt-go
1.2 创建mytoken项目
全部代码如下:
package main
import (
"crypto/rand"
"encoding/json"
"fmt"
"log"
"net/http"
"time"
jwt "github.com/dgrijalva/jwt-go"
)
// 定义Token的Claims
type CustomClaims struct {
Userid string `json:"userid"`
Passwd string `json:"passwd"`
jwt.StandardClaims
}
// 定义Token相关变量
var