java实现api接口的token,基于Token的API接口认证机制
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接口认证机制相关推荐
- 基于AKA的IMS接入认证机制
基于AKA的IMS接入认证机制 IP多媒体子系统(IMS)作为3G网络的核心控制平台,其安全问题正面临着严峻的挑战.IMS的接入认证机制的实现作为整个IMS安全方案实施的第一步,是保证IMS系统安全的 ...
- 基于php汇率接口调用实例,基于C#的汇率接口调用代码实例
基于C#的汇率接口调用代码实例 代码描述:基于C#的汇率接口调用代码实例 代码平台:聚合数据 using System; using System.Collections.Generic; using ...
- java oauth2 severlet_【Servlet】基于Jsp的微信Oauth2认证 | 学步园
挂载到微信服务器上的应用程序,能够通过微信Oauth2认证,能够抓取到用户的微信信息,当然,你首先要通过微信的帐号资质审核. 一.基本思想 二.基本过程 1.登陆微信的公众平台(点击打开链接),在左侧 ...
- 后端架构token授权认证机制:spring security JSON Web Token(JWT)简例
后端架构token授权认证机制:spring security JSON Web Token(JWT)简例 在基于token的客户端-服务器端认证授权以前,前端到服务器端的认证-授权通常是基于sess ...
- 新华字典php版,基于php的新华字典接口调用代码实例
基于php的新华字典接口调用代码实例 接口描述:基于php的新华字典接口调用代码实例 接口平台:聚合数据 // +------------------------------------------- ...
- springboot token_Springboot接口幂等性基于token实现方案
什么是接口幂等 幂等(idempotent.idempotence)是一个数学与计算机学概念,常见于抽象代数中,即f(f(x)) = f(x).简单的来说就是一个操作多次执行产生的结果与一次执行产生的 ...
- java token_Java实现基于token认证的方法示例
随着互联网的不断发展,技术的迭代也非常之快.我们的用户认证也从刚开始的用户名密码转变到基于cookie的session认证,然而到了今天,这种认证已经不能满足与我们的业务需求了(分布式,微服务).我们 ...
- java基于token的认证,Java实现基于token认证
随着互联网的不断发展,技术的迭代也非常之快.我们的用户认证也从刚开始的用户名密码转变到基于cookie的session认证,然而到了今天,这种认证已经不能满足与我们的业务需求了(分布式,微服务).我们 ...
- API接口之JWT设置token过期时间(二)
目录 1.什么是Jwt 2.token是什么 3.为什么要使用token 4.如何实现token 5.JWT的简单案例 6.API接口token案例 6.1 token的创建 6.2 用户验证流程 7 ...
最新文章
- 第6章-MapReduce的工作机制-笔记
- 禁用Chrome缓存进行网站开发
- python采用函数式编程模式吗_Python函数与函数式编程
- Java基础知识强化之IO流笔记42:IO流总结(图解)
- Linux vim的w,q,!,/
- 毕业典礼校长致辞金句频出:搬砖也要元气满满
- 考勤系统 服务器管理,考勤管理系统ZKNet Web Server管理
- php社工库搭建,如何快速3分钟本地搭建社工裤子
- 天线知识详解:天线原理、天线指标测试
- mysql 5.6服务端安装_MySQL5.6安装详细图解
- pandas强大的Python数据分析工具
- 2020中兴软件测试面经
- “NING咖啡”来袭,李宁的流量把戏还是真未来?
- 上市前夕离场,阿里巴巴合伙人胡喜6月卸任CTO,近日正式离职
- mysql排名第一_SQL查询排名第二名的信息
- 计算机开头,计算机论文开头
- java如何连接Sublime_第一节:使用Sublime 搭建Java学习环境
- 企业如何选择合适的SaaS软件?
- P2534 [AHOI2012]铁盘整理(IDA*)
- MySQL多表查询(通俗易懂)--持续更新
热门文章
- java客服im_Java IM 即时通讯 | 盘古歌技术 | uni-app 即时通讯 源码出售 chat
- mysql查询最小时间的一条数据_SQL 获取时间最小的一条数据
- Android获取本地相册图片
- 添加achartengine.jar包到AS
- 区块链码农飙车 | FISCO BCOS的性能优化方案最全解密
- vueX 自动匹配modules,vueX插件vuex-persistedstate自动存储本地
- 什么是FPGA,PAL,EPLD?
- 把onnx模型转TensorRT模型的trt模型报错:Your ONNX model has been generated with INT64 weights. while TensorRT
- linux ntp时间源服务器,NTP时间服务器
- 从项目采购管理人员角度,浅谈工程总承包项目采购风险管理