JWT,oAuth和SSO的讨论

背景

Single Sign On有很多成熟的方案。基于Session的服务常使用缓存Session信息在一个缓存服务上(例如redis)以实现SSO,每个微服务使用sessionId去缓存服务上取到对应的Session信息。

除此以外还有不基于Session的方案,类似于SAML和JWT。

SAML我不了解具体,这里讨论一下JWT。

oAuth和SSO

开始我把这俩搞混,以为是一个东西。实际上oAuth是一个标准,服务方用来给第三方认证用的,比如在王者荣耀里使用微信登陆,王者荣耀需要从微信获取用户的用户名、头像、性别等信息,使用微信登陆时,会跳转到微信的应用/页面中登陆,因此第三方并不知道微信的用户名密码。SSO是一种技术,可以允许用户登陆一次就可以访问其他服务,常用户多服务/微服务架构中,实现这种功能的技术有很多,而oAuth协议可以用来实现SSO(把多服务中的其他服务看做第三方)。

JWT

详细的JWT介绍参见这里

一个生成的JWT 如下构成:

Header.Payload.Signature

Header = base64UrlEncode(header)

header = {"alg": "HS256", "typ": "JWT"}

Payload = base64UrlEncode( 任何需要携带的非敏感数据 )

Signature = 加密算法( base64UrlEncode( header ) + "." + base64UrlEncode( payload ), 秘钥 )

可以这么说: 他们都是明文(仅仅经过base64编码),因此不应该把敏感数据放置到JWT的Payload中。一般只放一个UserName或UserId就可以。

如何使用JWT进行SSO

在用户第一次登录的时候利用类似JWTProducer.createToken生成token写入cookie(或Http Authorization Header)。之后每次请求在一个javax.servlet.Filter中去验证token,类似JWTConsumer.verify过程,而Payload的信息可以类似JWTConsumer.getContent取出。

package tmp.JWT;

import java.io.UnsupportedEncodingException;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm; public class JWTProducer {
private Algorithm alg = null; JWTProducer() {
try {
alg = Algorithm.HMAC256("secret");
} catch (IllegalArgumentException | UnsupportedEncodingException e) {
e.printStackTrace();
}
} public String createToken() { if (alg == null) {
return null;
}
// Put Claims here
return JWT.create().withClaim("user", "manager").withClaim("company", "SBODEMOUS").sign(alg); } public static void main(String[] args) {
JWTProducer pro = new JWTProducer();
System.out.println(pro.createToken());
}
}

package tmp.JWT; import java.io.UnsupportedEncodingException; import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT; public class JWTConsumer {
private Algorithm alg = null;
JWTVerifier verifier = null; JWTConsumer() {
try {
alg = Algorithm.HMAC256("secret");
verifier = JWT.require(alg).build();
} catch (IllegalArgumentException | UnsupportedEncodingException e) {
e.printStackTrace();
}
} public DecodedJWT verify(String token) {
DecodedJWT jwt = verifier.verify(token);
return jwt;
} public String getContent(String token) {
DecodedJWT jwt = this.verify(token);
return String.format("User:[%s]\tCompany:[%s]", jwt.getClaim("user").asString(),
jwt.getClaim("company").asString());
} public static void main(String[] args) {
final String TOKEN = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjb21wYW55IjoiU0JPREVNT1VTIiwidXNlciI6Im1hbmFnZXIifQ.6iXotJonkwK_7e8bmAw_3uIqwtFTx1tVxwIwhmIBhIg";
JWTConsumer con = new JWTConsumer();
System.out.println(con.getContent(TOKEN));
}
}

使用JWT注意事项

  • HTTPS和http-only的cookie
  • 强制验证HTTP Referer以防跨站点请求伪造

CSRF

CSRF,Cross Site Request Forgery, 跨站域请求伪造

用户访问A网站并登陆,Cookie还在时,就去访问B网站,而B网站可以利用A的Cookie去访问A的服务,从而对用户在A的权益造成损失。

JWT,oAuth和SSO的讨论的更多相关文章

  1. SpringSecurityOAuth使用JWT Token实现SSO单点登录

    ⒈认证服务器 1.添加pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <arti ...

  2. 170810、spring+springmvc+Interceptor+jwt+redis实现sso单点登录

    在分布式环境中,如何支持PC.APP(ios.android)等多端的会话共享,这也是所有公司都需要的解决方案,用传统的session方式来解决,我想已经out了,我们是否可以找一个通用的方案,比如用 ...

  3. 认证 协议 JWT OAuth Session Cookie

    本文翻译自Auth-Boss. 如果有翻译的不恰当或不对的地方, 欢迎指出. 成为一个认证老司机, 了解网络上不同的身份认证方法. 本文档的目的是记录和编目Web上的身份验证方法.认证指的是创建一个系 ...

  4. IdentityServer4专题之三:OAuth、SSO和OpenID

    一.oauth 典型案例:如果一个用户R拥有两项服务:一项服务是图片在线存储服务A,另一个是图片在线打印服务B.由于服务A与服务B是由两家不同的服务提供商提供的,所以用户在这两家服务提供商的网站上各自 ...

  5. 使用JWT+RSA完成SSO单点登录

    无状态登录原理 1.1.什么是有状态? 有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session. 例如登录:用户登 ...

  6. spring boot:spring security+oauth2+sso+jwt实现单点登录(spring boot 2.3.3)

    一,sso的用途 ? 1,如果有多个应用系统,用户只需要登录一次就可以访问所有相互信任的应用系统. 不需要每次输入用户名称和用户密码, 也不需要创建并记忆多套用户名称和用户密码. 2,系统管理员只需维 ...

  7. 系统的讲解 - SSO单点登录

    目录 概念 好处 技术实现 小结 扩展 概念 SSO 英文全称 Single Sign On,单点登录. 在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统. 比如:淘宝网(www.t ...

  8. Asp.Net Core基于Cookie实现同域单点登录(SSO)

    在同一个域名下有很多子系统 如:a.giant.com  b.giant.com   c.giant.com等 但是这些系统都是giant.com这个子域. 这样的情况就可以在不引用其它框架的情况下, ...

  9. 看图理解JWT如何用于单点登录

    单点登录是我比较喜欢的一个技术解决方案,一方面他能够提高产品使用的便利性,另一方面他分离了各个应用都需要的登录服务,对性能以及工作量都有好处.自从上次研究过JWT如何应用于会话管理,加之以前的项目中也 ...

随机推荐

  1. 关于在Servlet中的Fileter

    Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据, ...

  2. c# 实现 HSV 调色板

    界面相关核心代码如下: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private vo ...

  3. Oracle 相关知识

    1.Navicat 连接Oracle 报错: 解决办法: 1).先下载oracle客户端,win64_11gR2_client.zip,下载地址:http://www.oracle.com/techn ...

  4. Linux下 USB设备驱动分析(原创)

    之前做过STM32的usb HID复合设备,闲来看看linux下USB设备驱动是怎么一回事, 参考资料基于韦东山JZ2440开发板,以下,有错误欢迎指出. 1.准备知识 1.1USB相关概念: USB ...

  5. Linux上静态库和动态库的编译和使用

    linux上静态库和动态库的编译和使用(附外部符号错误浅谈) 这就是静态库和动态库的显著区别,静态库是编译期间由链接器通过include目录找到并链接到到可执行文件中,而动态库则是运行期间动态调用,只 ...

  6. tomcat守护相关

    tomcat守护相关(centos7) 今天在部署自己的服务到CentOS7服务器上tomcat中时,担心服务宕机想守护一下服务程序,于是现在网上找了一个用while写的循环守护脚本,后来发现这种方式 ...

  7. Kong(V1.0.2) Health Checks and Circuit Breakers Reference

    介绍 您可以让Kong代理的API使用ring-balancer,通过添加包含一个或多个目标实体的 upstream 实体进行配置,每个 target指向不同的IP地址(或主机名)和端口.ring-b ...

  8. 未来-区块链-Aliyun:阿里云IoT - 所知不止于感知

    ylbtech-未来-区块链-Aliyun:阿里云IoT - 所知不止于感知 1.返回顶部 1. 基础产品接入 设备接入 设备管理 数据分析 应用开发 网络管理 边缘计算 设备认证 安全运营 AliO ...

  9. E3Upload项目总结

    项目需求:读取阿里云数据库数据,通过webservice接口上传给第三方. 概要设计,项目满足以下几点: 1.动态接口调用 2.给多平台上传 3.数据保持(减轻数据库压力) 4.上传任务管理 5.扩展 ...

  10. yolo v2使用总结

    以下都是基于yolo v2版本的,对于现在的v3版本,可以先clone下来,再git checkout回v2版本. 玩了三四个月的yolo后发现数值相当不稳定,yolo只能用来小打小闹了. v2训练的 ...