JWT和OAuth2 - 认证和授权的API应用场景

1 需求

你已经或者正在实现API;
你正在考虑选择一个合适的方法保证API的安全性;

2 基本比较

要比较JWT和OAuth2?首先要明白一点就是,这两个根本没有可比性,是两个完全不同的东西。

JWT是一种认证协议 
JWT提供了一种用于发布接入令牌(Access Token),并对发布的签名接入令牌进行验证的方法。 令牌(Token)本身包含了一系列声明,
应用程序可以根据这些声明限制用户对资源的访问。 OAuth2是一种授权框架 OAuth2不是一个标准协议,而是一个安全的授权框架,提供了一套详细的授权机制。它详细描述了系统中不同角色、用户、服务前端应用(比如API),
以及客户端(比如网站或移动App)之间怎么实现相互认证。用户或应用可以通过公开的或私有的设置,授权第三方应用访问特定资源。

  OAuth2用在使用第三方账号登录的情况(比如使用weibo, qq, github登录某个应用)

  JWT是用在前后端分离, 需要简单的对后台API进行保护时使用。(前后端分离无session, 频繁传用户密码不安全)

 

3 既然JWT和OAuth2没有可比性,为什么还要把这两个放在一起说呢?

比如微信是基于oauth2授权的,用户扫码登录我需要微信授权,然后微信授权以后,用户也点击确认之后我就认定用户为合法用户,自己用jwt生成一个token给用户,
用户每次访问都带着token访问我。在这里微信给我是授权,我给用户是认证。oauth2是可以和jwt一起使用。
通常情况下可能【用户名密码登录】以后你会用jwt给他颁发token来认证访问。

4 JWT使用场景

无状态的分布式API
JWT的主要优势在于使用无状态、可扩展的方式处理应用中的用户会话。服务端可以通过内嵌的声明信息,很容易地获取用户的会话信息,而不需要去访问用户或会话的数据库。在一个分布式的面向服务的框架中,这一点非常有用。

但是,如果系统中需要使用黑名单实现长期有效的token刷新机制,这种无状态的优势就不明显了。

优势

快速开发
不需要cookie
JSON在移动端的广泛应用
不依赖于社交登录
相对简单的概念理解

限制

Token有长度限制
Token不能撤销
需要token有失效时间限制(exp)

5 oauth2的使用场景

OAuth2使用场景
在作者看来两种比较有必要使用OAuth2的场景:

外包认证服务器
上边已经讨论过,如果不介意API的使用依赖于外部的第三方认证提供者,你可以简单地把认证工作留给认证服务商去做。 
也就是常见的,去认证服务商(比如facebook)那里注册你的应用,然后设置需要访问的用户信息,比如电子邮箱、姓名等。当用户访问站点的注册页面时,会看到连接到第三方提供商的入口。用户点击以后被重定向到对应的认证服务商网站,获得用户的授权后就可以访问到需要的信息,然后重定向回来。

优势

快速开发
实施代码量小
维护工作减少
大型企业解决方案
如果设计的API要被不同的App使用,并且每个App使用的方式也不一样,使用OAuth2是个不错的选择。

考虑到工作量,可能需要单独的团队,针对各种应用开发完善、灵活的安全策略。当然需要的工作量也比较大!
优势

灵活的实现方式
可以和JWT同时使用
可针对不同应用扩展

6 重要的考量

(1)时间投入
OAuth2是一个安全框架,描述了在各种不同场景下,多个应用之间的授权问题。有海量的资料需要学习,要完全理解需要花费大量时间。甚至对于一些有经验的开发工程师来说,也会需要大概一个月的时间来深入理解OAuth2。 这是个很大的时间投入。

相反,JWT是一个相对轻量级的概念。可能花一天时间深入学习一下标准规范,就可以很容易地开始具体实施。

(2)错误的风险
OAuth2不像JWT一样是一个严格的标准协议,因此在实施过程中更容易出错。尽管有很多现有的库,但是每个库的成熟度也不尽相同,同样很容易引入各种错误。在常用的库中也很容易发现一些安全漏洞。

当然,如果有相当成熟、强大的开发团队来持续OAuth2实施和维护,可以一定成都上避免这些风险。

(3)社交登录的好处
在很多情况下,使用用户在大型社交网站的已有账户来认证会方便。
如果期望你的用户可以直接使用Facebook或者Gmail或者微信之类的账户,使用现有的库会方便得多。

 

posted @ 2018-06-07 11:42  Adamanter  阅读(2712)  评论(0编辑  收藏  举报