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. Windows与Linux的命令行命令对比

    Windows与Linux的命令行命令对比 * Windows不区分大小写,Linux区分大小写的. sn DOS Command UNIX Equivalent Effect 影响 1 ASSIGN ...

  2. 第五章JavaScript

    创建数组://1.字面量方式创建 (推荐大家使用这种方式创建数组 简单粗暴) var colors = ['red','color','yellow'];console.log(colors) //空 ...

  3. Python(五) —— 内置模块

    文档参考:https://docs.python.org/zh-cn/3.7/library/index.html 随机模块——random 这里我们介绍几种常用 random 的操作   名称 功能 ...

  4. rsync命令简单用法介绍

    rsync有两种常用的认证方式,一种为rsync-daemon方式,另外一种则是ssh.在一些场合,使用rsync-daemon方式会比较缺乏灵活性,ssh方式则成为首选.但是今天实际操作的时候发现当 ...

  5. 【Python】SciKit-Learn包安装问题

    pip install scikit-learn 如果失败的话,可以考虑直接升级pip 我原先的pip版本是10.0.1 安装失败 升级pip到18.1后,在安装就成功了

  6. Spring Cloud(Dalston.SR5)--Config 集群配置中心-刷新配置

    远程 SVN 服务器上面的配置修改后,需要通知客户端来改变配置,需要增加 spring-boot-starter-actuator 依赖并将 management.security.enabled 设 ...

  7. 将Json数据 填充到 实例类 的函数

    /// <summary> /// 将Json数据 填充到 实例类 /// </summary> /// <typeparam name="T"> ...

  8. Spring Boot(5)一个极简且完整的后台框架

    https://blog.csdn.net/daleiwang/article/details/75007588 Spring Boot(5)一个极简且完整的后台框架 2017年07月12日 11:3 ...

  9. 黑电平校正BLC

    参考:https://www.cnblogs.com/zhangAlin/p/10661763.html

  10. 用openssl为EAP-TLS生成证书(CA证书,服务器证书,用户证书)

    用openssl为EAP-TLS生成证书(CA证书,服务器证书,用户证书) 来源: https://www.cnblogs.com/osnosn/p/10597897.html 来自osnosn的博客 ...