Oauth2.0认证模式

背景

首先token认证方式的出现是伴随着系统架构的发展而来的。

最初的单机应用使用sessionId+cookie完全可以满足问题。

随着系统业务访问量加大,为满足服务高可用需求,系统引入了分布式架构,但是session只能存在单机节点上,为了解决这一问题,首先使用过session粘贴技术(通过hash等手段让请求始终访问之前生成sessionId的节点),这个方案的问题是万一存sessionId的节点挂了,整个系统都不能登陆了,也违背了高可用的设计思路;后来使用session复制的方案,即每台节点都copy一份sessionId,这引出2个问题,第一个就是分布式一致性的问题,节点同一时间重复创建了怎么办?另一个就是更头疼的系统扩展问题,随着系统越来越庞大,节点增多,session复制消耗的性能也越来越大,整个系统因为session出现了可遇见的性能瓶颈;再后来出现了session集中存储到一个地方,这样解放了服务器,但是session存储的高可用问题又来了,简直就是套娃式困局。

既然有状态服务出现瓶颈,大佬们开始提出无状态服务,就是使用token验证方式替代较重的session,token就是一个字符串,只要服务根据约定好的算法解析出的结果跟预期一致就可以通过验证,也不需要保存在内存中,无状态服务的好处是系统扩展轻松,新追加的服务轻装上阵,完全没有顾虑。Oauth就是一种规范,用来保证token机制的可行,目前在web端和移动端都是主流登陆验证方案,Oauth2.0于2010年正式提出,一直沿用到现在,可见其稳定。

随着互联网行业迅猛发展,各种app,各种网站层出不穷,传统登陆方式就要求用户在每个想登陆的站点都要注册自己的账号信息和密码,这也留下了一定隐患,有的小站点可能技术不那么强,这就有可能导致用户信息泄漏,Oauth正好可以解决这种对一些站点即想用又不信任问题。从使用体验的角度,单点登陆的方式也可以简化用户对账号密码的管理。

Oauth2认证模式的4种类型

  1. 授权码模式

这种模式最常用,也是最安全的模式,相关的角色有3个:
客户端(web站点/app,从认证服务的视角,不管你是web页面还是后台服务,都属于客户端范畴)、资源服务(存放个人信息的服务,比如微信存放你个人信息的服务)、认证服务(某可信的账户平台如微信平台)

使用之前需要在认证服务注册下自己的app信息(主要包括app名称、app站点、认证callback地址等),认证平台会给客户端创建一个clientId(客户端id)和client_secret(客户端秘钥)。这是为了解决认证平台不信任客户端的问题。

使用的时候用户首先会点击客户端登陆页上的一个链接,打开认证服务上的一个登陆确认页面,用户认证的时候会上传以下请求参数:

  1. clientId
  2. redirect_uri 登陆确认后页面重定向的地址
  3. response_type 这个参数的值必须是code,代表授权码模式
  4. state (可选) 这个参数是客户端自己生成的随机数/随机串,认证服务重定向的时候会带上这个state,用以表明自己的身份,这个参数主要用来防止csrf攻击。
  5. scope(可选)请求资源的范围,多个用空格隔开

认证成功后,认证服务会重定向到redirect_uri,
同时认证服务还会按照之前注册好的callback地址,向客户端发一个get请求,参数:

  1. code 就是授权码
  2. state (可选) 这个是之前客户端生成的随机数,作用还是防csrf攻击

这样客户端拿到了code,会再向认证平台的授权服务器发起请求,参数:

  1. code
  2. clientId
  3. client_secret

授权服务验证code没问题后,会给客户端返回token。

客户端拿着token就可以去资源服务器请求用户信息了(头像、姓名等)。

  1. 隐藏式(implicit)

这种模式大致流程是:

  1. 用户在登录页上点击链接认证
  2. 认证成功后认证服务器直接返回token

这个模式不经过code验证的过程,这种token可以直接在callback的uri上看到,并且客户端后台也不会验证token,这种模式安全性显然没有授权码模式好,应用也不多。

  1. 密码模式

流程:
用户直接在客户端上输入账号密码,然后由客户端向认证服务请求要token。

要使用这种模式就表明用户完全信任客户端了,如果信任客户端,直接在客户端上注册账号不就好了,何必把其他平台的账号告诉客户端,万一客户端保存了这个账号密码呢?

  1. 客户端模式

流程:
用客户端自己的名义向认证服务获取token,跟用户没什么关系。这也不会是登陆会考虑的场景吧...

http://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html
https://www.bilibili.com/video/BV1zt41127hX?spm_id_from=333.999.0.0

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

推荐阅读更多精彩内容