OAuth2 and Jwt

一、Oauth2

1.OAuth2介绍

OAuth(Open Authorization)是一个关于授权(authorization)的开放网络标准,允许用户授权第三方应用访问用户的授权信息,而不需要提供账号密码给第三方应用。
协议的特点:
简单:不管是协议的提供者还是第三方应用的开发者,都很容易理解并使用
安全:没有涉及到用户的秘钥等敏感信息,更加的安全和灵活
开放:任何服务提供商都可以按照OAuth协议进行实现

1.2基本概念

1)Resource Owner:资源所有者,也就是“用户”。
2)Authorization server:授权服务器,服务提供者专门用于处理认证授权的服务器。
3)Resource server:资源服务器,服务提供者用于存储用户生成的资源的服务器。

2.OAuth2设计思路

OAuth在"客户端"与"服务提供商"之间,设置了一个授权层(authorization layer)。"客户端"不饿呢过直接登录“服务提供商”,只能登录授权层,以此来区分用户和客户端。第三方应用登录授权层所用的令牌(token),和用户的密码不同,用户在登录授权时,可以指定授权令牌·的权限和有效期。
OAuth2的执行流程:


image.png

A)用户使用第三方客户端,第三方客户端要求用户进行授权
B)用户同意授权
C)客户端得到用户授权后,向授权服务器申请令牌
D)授权服务器进行认证通过后,同意发放令牌
E)客户端使用令牌,向资源服务器申请获取资源
F)资源服务器确认令牌合法后,同意向客户端开放用户授权的资源

2.1客户端授权模式

客户端在得到用户授权后,才能获取令牌,但是不管是哪种授权模式,第三方应用在申请令牌前,都要在系统中进行备案,然后会拿到该客户端的两个重要标识:客户端ID(client ID)和客户端秘钥(client secret)。
1)授权码模式(authorization code)
授权码模式就是第三方应用先获取一个授权码,然后再使用授权码去获取令牌。这种方式安全性是最高的,也是主流使用的方式。

授权码模式

执行流程如下:
A)用户访问客户端,客户端重定向到授权服务器
B)用户进行选择是否授权
C)如果用户授权了,将会重定向到客户端事先指定的Redirection URI,同时附带授权码
D)客户端接受到授权码,会附带一个Redirection URI,向授权服务器申请令牌
E)授权服务器核对授权码后,将向客户端发放access token(访问令牌)和refreshtoken(更新令牌)

2)简化模式(implicit)
该模式通常针对第三方式纯web应用,没有后端。简化模式直接在浏览器中向授权服务器申请令牌,跳过了授权码这一步,所有步骤都是在浏览器完成,因此该模式很不安全。通常令牌的有效期很短,一般就是session的有效器。

简化模式

执行流程如下:
A)用户访问客户端,客户端重定向到授权服务器
B)用户进行选择是否授权
C)如果用户授权了,将会重定向到客户端事先指定的Redirection URI,并在URI的Hash部分包含了访问令牌
D)浏览器向资源服务器发送请求,但是不包含上一步的Hash值
E)资源服务器返回一个网页,里面包含的代码可以获取Hash值中的令牌
F)浏览器执行脚本,提取令牌,然后浏览器将令牌发送给客户端

3)密码模式(resource owner password credentials)
此模式是将用户的账号密码告诉客户端,但是客户端不得存储密码,然后客户端使用密码获取访问令牌。一般使用在集成系统的子系统中。

密码模式

执行流程如下:
A)用户向客户端提供账号密码
B)客户端通过用户名和密码发送授权服务器,然后请求令牌
C)授权服务器确认合法后,向客户端提供访问令牌

4)客户端模式(client credentials)
该模式通常用于没有前端的应用,客户端不是以用户的名义获取数据,而是以客户端自身。

客户端模式

执行流程如下:
A)客户端向授权服务器·进行身份认证,并申请访问令牌
B)授权服务器确认无误后,向客户端提供访问令牌

2.2 令牌的更新

令牌是有时限限制的,不能一直使用,如果令牌过期后,还要经历上面这么多步骤,那可能性能、体验上都比较差,而且反复进行验证也是没有必要的。


令牌更新

而关于具体的方式,则是使用刷新令牌,在令牌过期前,通过刷新令牌发送请求,去更新令牌。

3.Spirng Security Oauth2实现单点登录

3.1 什么是单点登录

单点登录(single sign On),简称sso。它的用途在于不管多复杂的应用群,只要登录一次,在用户授权范围内地所有系统,都可以访问。

3.2单点登录的常用方式

1)同域单点
使用场景:所有系统都在一个一级域名的不同二级域名下

同域

核心原理:
a)门户系统设置Cookie的domain为一级域名,这样可以共享门户的Cookie给所有使用该域名的系统
b)将session进行共享,让所有系统都能获取同一个session
c)系统通过门户Cookie中的sessionID读取到session中的登录信息,完成单点登录

2)跨域单点
单点登录之间系统域名不一致,这样就无法共享Cookie,也就获取不到同一个session。此时需要通过单独的授权服务(UAA)来管理统一登录。


跨域

核心原理:
a)系统1没有登录,跳转UAA请求授权
b)在UAA系统中输入用户名、密码进行登录操作
c)登录完成后将信息存储在UAA的session中,并写入该域名的Cookie
d)此时系统2也没登录,也要跳转UAA进行授权
e)由于系统1的登录信息存储在UAA的session中,然后读取session中的登录信息,完成单点登录

二、JWT介绍

1.什么是JWT

JSON web token(jwt),它定义了一种简介的、自包含的协议格式,通信双方都是用json传递数据。传递的信息通过数字签名可以被验证。

2.jwt的组成

1)头部(header)
头部描述jwt的基本信息:类型、签名所用算法。

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

对头部进行base64加密后,就是第一部分的内容。
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
2)载荷(payload)
这一部分就是存放有效信息的地方:
iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

3)签名(signature)
这一部分主要是加盐(secret)进行令牌的组合加密

var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
// 这三部分+加盐组合起来才是jwt
var signature = HMACSHA256(encodedString, 'fyhh');

secret是保存在服务端的私钥,是不能够泄露出去,也不能存储在客户端。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,578评论 6 544
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,701评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,691评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,974评论 1 318
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,694评论 6 413
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 56,026评论 1 329
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 44,015评论 3 450
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,193评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,719评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,442评论 3 360
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,668评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,151评论 5 365
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,846评论 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,255评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,592评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,394评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,635评论 2 380

推荐阅读更多精彩内容