常见认证机制

Cookie Auth

Cookie认证机制就是为一次请求认证在服务端创建一个Session对象,同时在客户端的浏览器创建了一个Cookie对象;通过客户端上带来的Cookie对象来与服务器端的session对象匹配来实现状态管理的。默认情况下,当我们关闭浏览器的时候,cookie会被删除。但可以通过修改cookie的expire time使cookie在一定时间内有效。

OAuth

OAuth (开放授权)是一个开放的授权标准,允许用户让第三方应用访问该用户在某一web服务上存储的私密资源(如照片、视频、联系人列表),而无需将用户名和密码提供给第三方应用。OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的第三方系统(例如,视频编辑网站)在特定时段(例如,接下来2个小时内)访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容。

Token Auth

使用基于Token的身份验证方法,在服务端不需要存储用户的登录记录,大概流程如下:
1.客户端使用用户名密码请求登录
2.服务端接收到请求,去验证用户名和密码
3.验证成功后,服务端会签发一个Token,再把这个Token发送给客户端
4.客户端收到Token以后可以把他存储起来,比如放在Cookie里
5.客户端每次向服务端请求资源的时候都需要带着服务端签发的Token
6.服务端收到请求,然后去验证客户端请求里面带着的Token,如果验证成功,就向客户端返回请求的数据

Token Auth的优点
  • 支持跨域访问:Cookie是不允许跨越访问的,这一点对Token机制是不存在的,前提是传输的用户认证信息通过HTTP头传输
  • 无状态(也称:服务端可扩展行):Token机制在服务端不需要存储session信息,因为Token自身包含了所有登录用户的信息,只需要在客户端的cookie或本地介质存储状态信息
  • 更适用CDN:可以通过内容分发网络请求你服务端的所有资料(如:javascript,html,图片等),而你的服务端只需要提供API即可
  • 解耦:不需要绑定到一个特定的身份验证方案。Token可以在任何地方生成,只要在你API被调用的时候,你可以进行Token生成调用即可
  • 更适用于移动应用:当你的客户端是一个原生平台(IOS,Android,Windows8等)时,Cookie是不被支持的(你需要通过Cookie容器进行处理),这时采用Token认证机制就会简单的多
  • CSRF:因为不再依赖于Cookie,所以你就不需要考虑对CSRF(跨域请求伪造)的防范
  • 性能:一次网络往返时间(通过数据库查询session信息)总比做一次HMACSHA256计算的Token验证和解析要费时的多。
  • 不需要为登录页面坐特殊处理:如果你使用Protractor做功能测试的时候,不再需要对页面做特殊处理
  • 基于标准化:你的API可以采用标准化的JSON Web Token(JWT)。这个标准已经存在多个后端库(.NET,Ruby,Java,Python,PHP)和多家公司的支持(如:Google,Microsoft)

TOKEN签发与验证

什么是JWT

JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。在Java世界中通过JJWT实现JWT创建和验证。

JJWT的快速入门
  • token的创建
    (1).引入依赖
<dependency>
	<groupId>io.jsonwebtoken</groupId>
	<artifactId>jjwt</artifactId>
	<version>0.6.0</version>
</dependency>

(2).创建类CreateJwtTest,用于生成token

public class CreateJwtTest{
	public static void main(String[] args){
		JwtBuilder builder = Jwts.builder().setId("888")
				.setSubject("小白")//用户信息
				.setIssuedAt(new Date())//签名创建时间
				.signWith(SignatureAlgorithm.HS256,"itcast");//加密签名 指定私钥
		System.out.println(builder.compact());
	}
}
解析token
public class ParseJwtTest{
	public static void main(String[] args){
		String token = "afvbkaJsdIbhgHnksO.............";
		Claims claims = Jwts.parser().setSigningKey("itcast").parseClaimsJws(token).getBody();
		System.out.println("id:"+claims.getId());
		System.out.println("subject:"+claims.getSubject());
		System.out.println("IssuedAt:"+claims.getIssuedAt());
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值