Cookie Auth

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

Token Auth的优点

Token机制相对于Cookie机制相比有以下优势:

支持跨域访问: Cookie是不允许垮域访问的,这一点对Token机制是不存在的,前提是传输的用户认证信息通过HTTP头传输;

无状态(也称:服务端可扩展行):Token机制在服务端不需要存储session信息,因为Token 自身包含了所有登录用户的信息,只需要在客户端的cookie或本地介质存储状态信息;

更适用CDN: 可以通过内容分发网络请求你服务端的所有资料(如:javascript,HTML,图片等),而你的服务端只要提供API即可.

去耦: 不需要绑定到一个特定的身份验证方案。Token可以在任何地方生成,只要在你的API被调用的时候,你可以进行Token生成调用即可;

更适用于移动应用: 当你的客户端是一个原生平台(iOS, Android,Windows 8等)时,Cookie是不被支持的(你需要通过Cookie容器进行处理),这时采用Token认证机制就会简单得多;

CSRF:因为不再依赖于Cookie,所以你就不需要考虑对CSRF(跨站请求伪造)的防范。

认证过程

下面我们从一个实例来看如何运用JWT机制实现认证:

登录授权

第一次登录,用户从浏览器输入用户名/密码,提交后台服务器的登录处理的Action层(Login Action);

Login Action调用认证服务进行用户名密码认证,如果认证通过,Login Action层调用用户信息服务获取用户信息(包括完整的用户信息及对应权限信息);

验证用户信息合法后,Login Action从配置文件中获取Token签名生成的秘钥信息,进行Token的生成(可以调用第三方的JWT Lib生成签名后的JWT Token);

完成JWT数据签名后,将其设置到COOKIE/HEADER 对象中,并重定向到首页,完成登录过程;

请求认证

基于Token的认证机制会在每一次请求中都带上完成签名的Token信息,这个Token信息可能在COOKIE

中,也可能在HTTP的Authorization头中。

过程如下:

客户端(APP客户端或浏览器)通过GET或POST请求访问资源(页面或调用API);

通过统一的Filter或者Interceptor 对请求进行拦截,首先在cookie中查找Token信息,如果没有找到,则在HTTP Authorization Head中查找;

如果找到Token信息,则根据配置文件中的签名加密秘钥,调用JWT Lib对Token信息进行解密和解码;

完成解码并验证签名通过后,对Token中的exp、nbf、aud等信息进行验证;

全部通过后,根据获取的用户的角色权限信息,进行对请求的资源的权限逻辑判断;

如果权限逻辑判断通过则通过Response对象返回;否则则返回HTTP 401;

基于JWT的Token认证机制实现

Java中对JWT的支持可以考虑使用JJWT开源库。

maven依赖:

io.jsonwebtoken

jjwt

0.7.0

JWT Token生成&验证代码:

import io.jsonwebtoken.*;

import io.jsonwebtoken.impl.crypto.MacProvider;

import org.apache.commons.codec.Charsets;

import org.junit.Before;

import org.junit.Test;

import javax.crypto.spec.SecretKeySpec;

import java.security.Key;

import java.util.Date;

/**

* ${DESCRIPTION}

*

* @author Ricky Fung

*/

public class JwtTokenTest {

private Key key;

private SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

@Before

public void init() {

String secret = "ricky";

//We will sign our JWT with our ApiKey secret

byte[] apiKeySecretBytes = secret.getBytes(Charsets.UTF_8);

key = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());

}

@Test

public void testEncode() {

long ttl = 7200 * 1000;

Date now = new Date();

Date exp = new Date(now.getTime() + ttl);

//Let's set the JWT Claims

JwtBuilder builder = Jwts.builder().setId("ucode")

.setIssuedAt(now)

.setExpiration(exp)

.setSubject("sub")

.setIssuer("iss")

.setAudience("aud")

.setHeaderParam(Header.TYPE, Header.JWT_TYPE)

.signWith(signatureAlgorithm, key);

String compactJws = builder.compact();

System.out.println(compactJws);

}

@Test

public void testDecode() {

String compactJws = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJ1Y29kZSIsImlhdCI6MTQ5NzIzOTE2NiwiZXhwIjoxNDk3MjQ2MzY2LCJzdWIiOiJzdWIiLCJpc3MiOiJpc3MiLCJhdWQiOiJhdWQifQ.gc0OcIlBQND8TlPN6q1nUQf852aIxK4mgkHBBrYMLZ4";

try {

Claims claims = Jwts.parser().setSigningKey(key).parseClaimsJws(compactJws).getBody();

//OK, we can trust this JWT

System.out.println("ID: " + claims.getId());

System.out.println("Subject: " + claims.getSubject());

System.out.println("Issuer: " + claims.getIssuer());

System.out.println("Audience: " + claims.getAudience());

System.out.println("Expiration: " + claims.getExpiration());

} catch (SignatureException e) {

//don't trust the JWT!

}

}

@Test

public void testSimple() {

Key key = MacProvider.generateKey();

String compactJws = Jwts.builder()

.setSubject("Joe")

.signWith(SignatureAlgorithm.HS512, key)

.compact();

System.out.println(compactJws);

}

}

java实现api接口的token,基于Token的API接口认证机制相关推荐

  1. 基于AKA的IMS接入认证机制

    基于AKA的IMS接入认证机制 IP多媒体子系统(IMS)作为3G网络的核心控制平台,其安全问题正面临着严峻的挑战.IMS的接入认证机制的实现作为整个IMS安全方案实施的第一步,是保证IMS系统安全的 ...

  2. 基于php汇率接口调用实例,基于C#的汇率接口调用代码实例

    基于C#的汇率接口调用代码实例 代码描述:基于C#的汇率接口调用代码实例 代码平台:聚合数据 using System; using System.Collections.Generic; using ...

  3. java oauth2 severlet_【Servlet】基于Jsp的微信Oauth2认证 | 学步园

    挂载到微信服务器上的应用程序,能够通过微信Oauth2认证,能够抓取到用户的微信信息,当然,你首先要通过微信的帐号资质审核. 一.基本思想 二.基本过程 1.登陆微信的公众平台(点击打开链接),在左侧 ...

  4. 后端架构token授权认证机制:spring security JSON Web Token(JWT)简例

    后端架构token授权认证机制:spring security JSON Web Token(JWT)简例 在基于token的客户端-服务器端认证授权以前,前端到服务器端的认证-授权通常是基于sess ...

  5. 新华字典php版,基于php的新华字典接口调用代码实例

    基于php的新华字典接口调用代码实例 接口描述:基于php的新华字典接口调用代码实例 接口平台:聚合数据 // +------------------------------------------- ...

  6. springboot token_Springboot接口幂等性基于token实现方案

    什么是接口幂等 幂等(idempotent.idempotence)是一个数学与计算机学概念,常见于抽象代数中,即f(f(x)) = f(x).简单的来说就是一个操作多次执行产生的结果与一次执行产生的 ...

  7. java token_Java实现基于token认证的方法示例

    随着互联网的不断发展,技术的迭代也非常之快.我们的用户认证也从刚开始的用户名密码转变到基于cookie的session认证,然而到了今天,这种认证已经不能满足与我们的业务需求了(分布式,微服务).我们 ...

  8. java基于token的认证,Java实现基于token认证

    随着互联网的不断发展,技术的迭代也非常之快.我们的用户认证也从刚开始的用户名密码转变到基于cookie的session认证,然而到了今天,这种认证已经不能满足与我们的业务需求了(分布式,微服务).我们 ...

  9. API接口之JWT设置token过期时间(二)

    目录 1.什么是Jwt 2.token是什么 3.为什么要使用token 4.如何实现token 5.JWT的简单案例 6.API接口token案例 6.1 token的创建 6.2 用户验证流程 7 ...

最新文章

  1. 第6章-MapReduce的工作机制-笔记
  2. 禁用Chrome缓存进行网站开发
  3. python采用函数式编程模式吗_Python函数与函数式编程
  4. Java基础知识强化之IO流笔记42:IO流总结(图解)
  5. Linux vim的w,q,!,/
  6. 毕业典礼校长致辞金句频出:搬砖也要元气满满
  7. 考勤系统 服务器管理,考勤管理系统ZKNet Web Server管理
  8. php社工库搭建,如何快速3分钟本地搭建社工裤子
  9. 天线知识详解:天线原理、天线指标测试
  10. mysql 5.6服务端安装_MySQL5.6安装详细图解
  11. pandas强大的Python数据分析工具
  12. 2020中兴软件测试面经
  13. “NING咖啡”来袭,李宁的流量把戏还是真未来?
  14. 上市前夕离场,阿里巴巴合伙人胡喜6月卸任CTO,近日正式离职
  15. mysql排名第一_SQL查询排名第二名的信息
  16. 计算机开头,计算机论文开头
  17. java如何连接Sublime_第一节:使用Sublime 搭建Java学习环境
  18. 企业如何选择合适的SaaS软件?
  19. P2534 [AHOI2012]铁盘整理(IDA*)
  20. MySQL多表查询(通俗易懂)--持续更新

热门文章

  1. java客服im_Java IM 即时通讯 | 盘古歌技术 | uni-app 即时通讯 源码出售 chat
  2. mysql查询最小时间的一条数据_SQL 获取时间最小的一条数据
  3. Android获取本地相册图片
  4. 添加achartengine.jar包到AS
  5. 区块链码农飙车 | FISCO BCOS的性能优化方案最全解密
  6. vueX 自动匹配modules,vueX插件vuex-persistedstate自动存储本地
  7. 什么是FPGA,PAL,EPLD?
  8. 把onnx模型转TensorRT模型的trt模型报错:Your ONNX model has been generated with INT64 weights. while TensorRT
  9. linux ntp时间源服务器,NTP时间服务器
  10. 从项目采购管理人员角度,浅谈工程总承包项目采购风险管理