基于JWT实现的API网关
2017-06-26 15:50
274 查看
git仓库地址:
缺点:用户信息都保存在cookie中,容易被cokkie劫持
缺点:系统一旦断电或重启,所有的会话数据都会丢失。特别是后台部署新版本,每次重启tomcat,用户都需要重新登录。
基于Token的认证,除了能避免传统身份验证的问题外,还有许多额外的优点:
无状态:由于Token已经包含了用户的所有信息,所以无需再存储Session
解耦:无需被绑定在一个特定的验证方案。作为独立的会话系统,利于实现分布式
基于标准:JWT作为Token的标准已经被广泛地接受。主流语言都有相应支持JWT标准的工具包
一旦用户完成了登录,在接下来的每个请求中都会包含JWT,可以用来验证用户身份以及对路由,服务和资源的访问权限进行验证。目前的单点登录(SSO)比较广泛地使用了该技术。
信息交换
在通信的双方之间使用JWT对数据进行编码是一种非常安全的方式,由于它的信息是经过签名的,所以可以确保发送者发送的信息是没有经过伪造的。
其结构看起来是这样的:
Header
在header中通常包含了两部分:token类型和采用的加密算法:
Payload
Payload部分包含了一些跟这个token有关的重要信息。常用的有:
iss:The issuer of the token,token发行人
exp:Expiration Time,过期时间戳
sub:The subject of the token,面向的用户
aud:to whom the token is intended to be sent,接收方
iat:签发时间
Payload示例:
Signature
签名主要用于验证token是否有效,是否被篡改。签名时可以使用加密算法进行签名,例如希望使用HMACSHA256算法进行签名:
参考
jwt.io
基于Token的认证和基于声明的标识
JSON Web Token (JWT) 简介
八幅漫画理解使用JSON Web Token设计单点登录系统
jpadilla/pyjwt
1 身份验证
1.1 传统的身份验证
HTTP是一种无状态的协议,服务器接收一个来自客户端的request,处理完以后返回一个response。但是这个过程中,服务器几乎没有什么信息可以用来判断是哪个客户端(用户)发来的request。此时如果用户使用账户和密码登录,下回再发送请求时,还得再登录一遍。1.1.1 方案一(cookie)
当用户登录成功后,我们直接把用户信息保存到cookie中,此后客户端的每一次请求都会带上这个cookie。缺点:用户信息都保存在cookie中,容易被cokkie劫持
1.1.2 方案二(session)
当用户登录成功后,我们在服务端创建一个session对象,session会生成全局唯一标识符(JSESSIONID),把登录后的用户信息都保存在这个session对象中。然后服务端只要把JSESSIONID设置到cookie,此后客户端的每一次请求都会带上这个JSESSIONID。缺点:系统一旦断电或重启,所有的会话数据都会丢失。特别是后台部署新版本,每次重启tomcat,用户都需要重新登录。
1.2 基于TOKEN的身份验证
使用基于Token的身份验证流程如下:基于Token的认证,除了能避免传统身份验证的问题外,还有许多额外的优点:
无状态:由于Token已经包含了用户的所有信息,所以无需再存储Session
解耦:无需被绑定在一个特定的验证方案。作为独立的会话系统,利于实现分布式
基于标准:JWT作为Token的标准已经被广泛地接受。主流语言都有相应支持JWT标准的工具包
1.3 JWT
1.3.1 JWT的主要使用场景
身份验证一旦用户完成了登录,在接下来的每个请求中都会包含JWT,可以用来验证用户身份以及对路由,服务和资源的访问权限进行验证。目前的单点登录(SSO)比较广泛地使用了该技术。
信息交换
在通信的双方之间使用JWT对数据进行编码是一种非常安全的方式,由于它的信息是经过签名的,所以可以确保发送者发送的信息是没有经过伪造的。
1.3.2 JWT的结构
JWT包含了使用 . 分隔的三部分:头部(Header)、载荷(Payload)与签名(Signature)其结构看起来是这样的:
eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE0OTI3NTgxNDksInN1YiI6IkpXVFRva2VuIiwiYXVkIjoia2xkIiwiaXNzIjo.8izVDNnjr8qA-3twii6O0U3FCt0-tdtNHG6eT3LMiBY |
在header中通常包含了两部分:token类型和采用的加密算法:
{ "typ" : "JWT", "alg" : "HS256" } |
Payload部分包含了一些跟这个token有关的重要信息。常用的有:
iss:The issuer of the token,token发行人
exp:Expiration Time,过期时间戳
sub:The subject of the token,面向的用户
aud:to whom the token is intended to be sent,接收方
iat:签发时间
Payload示例:
{exp=1492771410, sub=org-gateway, aud=kld, iss=dahai, jti=v1, iat=1492767810} |
签名主要用于验证token是否有效,是否被篡改。签名时可以使用加密算法进行签名,例如希望使用HMACSHA256算法进行签名:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret) |
1.3.3 JWT的安全设置
JWT字符串设置到Cookie时必须使用HttpOnly属性来防止Cookie被JavaScript读取,从而避免跨站脚本攻击(XSS攻击)。参考
jwt.io
基于Token的认证和基于声明的标识
JSON Web Token (JWT) 简介
八幅漫画理解使用JSON Web Token设计单点登录系统
jpadilla/pyjwt
相关文章推荐
- Laravel 5 中使用 JWT(Json Web Token) 实现基于API的用户认证
- 基于CMPP3.0的企业短信网关API设计
- 详解基于Sbo DI API独立程序系统登录的实现 推荐
- 基于Google API的全文翻译Web Service实现
- Android 基于googleAPI 实现gps定位
- 基于PhoneGap+JQuery Mobile+ArcGISJavascript API实现
- 基于短信网关WAP推送的实现
- 本应用是基于淘宝开放平台(TOP)API以及Google Map JavaScript API的基础上实现的一个自用型淘宝买家应用。
- 基于短信网关WAP推送的实现
- 基于CMPP3.0的企业短信网关API
- 用MFC实现串口通信(基于Win32 API)
- 基于CMPP3.0的企业短信网关API设计
- 基于短信网关WAP推送的实现
- WIN32汇编实现基于API的ODBC编程
- 基于Google AJAX Language API的全文翻译Web Service实现
- 基于短信网关wap推送的实现
- 基于Google API的全文翻译Web Service实现
- 基于各类地图 Api接口的Jquery插件的通用实现(含源代码下载)
- JPA核心API-基于Hibernate实现
- 【技术直通车】旅游日记——基于PhoneGap+JQuery Mobile+ArcGISJavascript API实现