Json Web Token身份认证
2016-05-17 00:00
791 查看
用户身份认证一般有5种方式
HTTP Basic authentication
在发送请求时在HTTP头中加入
Cookies
向后台发送用户名和密码,在用户名和密码通过验证后,保存返回的
Signatures
用户拿到服务器给的私钥,在发送请求前,将整个请求使用私钥来加密,发送的将是一串加密信息,此方式只适用于API
One-Time Passwords
一次一密,每次登录时使用不同的密码,一般由服务端通过邮件将密码发给用户,这种登录方式比较繁琐
JSON Web Token
用户发送按照约定,向服务端发送
因为前后端分离的缘故,现在的后台多数只提供数据部分,一般使用
信息可用HMAC或RSA加密,信息安全性较高
生成的密文短,密文可以包含所有用户信息,认证过期时间或用户权限等自定义信息
适合用于手机应用和单页面应用的身份认证
使用灵活,一旦取得了
Header (头部)
Payload (负载)
Signature (签名)
负载部分就是具体的认证信息,通过修改这部分的内容来控制认证信息如用户权限等。除了一些保留字段
以上3部分都经过Base64Url处理后用下载地址
jwt diagram
客户端POST用户名和密码到服务端,若对安全要求较高可以是加密后的用户名或密码,服务端把拿到的用户名和密码与数据库中的对比,若相同则按照上面的流程生成
HTTP Basic authentication
在发送请求时在HTTP头中加入
authentication字段,将用
Base64编码的用户名和密码作为值,每次发送请求的时候都要发送用户名和密码,实现比较简单。
Cookies
向后台发送用户名和密码,在用户名和密码通过验证后,保存返回的
Cookie作为用户已经登录的凭证,每次请求时附带这个
Cookie
Signatures
用户拿到服务器给的私钥,在发送请求前,将整个请求使用私钥来加密,发送的将是一串加密信息,此方式只适用于API
One-Time Passwords
一次一密,每次登录时使用不同的密码,一般由服务端通过邮件将密码发给用户,这种登录方式比较繁琐
JSON Web Token
用户发送按照约定,向服务端发送
Header、
Payload和
Signature,并包含认证信息(密码),验证通过后服务端返回一个
token,之后用户使用该
token作为登录凭证,适合于移动端和api
因为前后端分离的缘故,现在的后台多数只提供数据部分,一般使用
JSON格式,所以
JSON Web Token是比较流行的认证方式。
JWT的认证方式相比其他的认证方式有一下优点:
信息可用HMAC或RSA加密,信息安全性较高
生成的密文短,密文可以包含所有用户信息,认证过期时间或用户权限等自定义信息
适合用于手机应用和单页面应用的身份认证
使用灵活,一旦取得了
JWT,可以通过POST方式或添加入HTTP头中发送
JWT结构
JWT包含3个部分
Header (头部)
Payload (负载)
Signature (签名)
Header
1 2 3 4 | { "alg": "HS256", "typ": "JWT" } |
JWT的头部是固定的,
alg是算法的意思表示该
JWT使用的是何种算法加密。
typ字段值是固定的
JWT
Payload
1 2 3 4 | { "sub": "1234567890", "name": "John Doe", "admin": true } |
exp(过期时间)、
aud、
iss等外,使用方法跟普通Json一样。
Signature
签名,也就是密钥,用来保证密文的安全强度以上3部分都经过Base64Url处理后用下载地址
.分隔再使用
HMAC SHA256或
RSA加密为一段字符串
1 2 3 4 | HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret) |
JWT使用流程
jwt diagram
客户端POST用户名和密码到服务端,若对安全要求较高可以是加密后的用户名或密码,服务端把拿到的用户名和密码与数据库中的对比,若相同则按照上面的流程生成
JWT,然后返回客户端。在此之后客户端的所有请求,可以在Authorization HTTP头或POST数据中附带得到的
JWT。服务端验证
JWT并解析出Payload下载地址 部分,以此来判断用户的权限。
JWT的使用方法很简单,就拿node.js的包
node-jsonwebtoken来说加密和验证就两个函数
jwt.sign,
jwt.verify并且jwt.io中提供了很多语言的
JWT包。
相关文章推荐
- java-WEB中的监听器Lisener
- GUI - Web前端开发框架
- Extjs4.0 最新最全视频教程
- MyEclipse Web Project转Eclipse Dynamic Web Project
- axis备忘
- 使用 Python 处理 JSON 格式的数据
- XML 与 JSON 优劣对比
- 创业如何选择WEB开发语言
- VBA将excel数据表生成JSON文件
- Erlang实现的一个Web服务器代码实例
- 防止网页脚本病毒执行的方法-from web
- 自学成才的秘密:115个 web Develop 资源
- newtonsoft.json解析天气数据出错解决方法
- 使用批处理修改web打印设置笔记 适用于IE
- Apache Web让JSP“动”起来
- web下载的ActiveX控件自动更新
- 推荐六款WEB上传组件性能测试与比较第1/10页
- 关于三种主流WEB架构的思考
- 使用 Iisext.vbs 列出 Web 服务扩展文件的方法
- 使用 Iisext.vbs 删除 Web 服务扩展文件的方法