5分钟了解OAuth2与OpenID

2021-04-29 11:02:45 浏览数 (1)

互联网产品离不开帐号登录或第三方登录、资源授权访问,经常会听到OAuth2、OpenID这些概念,它们是什么、有什么用、有什么关系呢?接下来,我将简单介绍OAuth2和OpenID。

首先,我们先看下今日头条第三方登录微信帐号,获取头像昵称、导出公众号文章的例子。

当使用今日头条,选择使用微信帐号登录时,会跳转到微信,如果微信还未登录,会弹出登录窗口,用户填写用户名密码,完成登录。然后,微信弹出提示框:今日头条申请获取头像昵称等权限,是否允许?。用户选择允许后,微信向后台帐号服务请求Token(令牌)交给今日头条,今日头条拿着Token向微信帐号服务请求头像昵称等,微信帐号服务会校验Token决定是否提供头像昵称等。今日头条也可以拿着Token向微信公众号服务请求文章,微信公众号服务向微信帐号服务校验Token决定是否提供文章。

上述例子中微信用户的昵称、头像、文章是存储在微信服务器上,今日头条想要访问这些资源,需要用户允许后,微信再授权给今日头条访问。这涉及到一个授权的过程。传统使用密码的授权机制,存在权限过大和权限回收困难的问题,比如:直接在今日头条上提供微信的帐号和密码,今日头条就可以访问该账号的所有资源,一段时间后如果用户不想让今日头条继续访问,只能修改密码。而OAuth2使用Access Token具有使用期和访问权限属性,有效解决这些问题。

OAuth2设计了授权机制的框架,涉及4个角色、3个交互。

Resource Owner 资源所有者,一般指终端用户(如微信用户)

Authorization Server 授权服务器(如微信帐号服务)

Resource Server 资源服务器(如微信公众号服务)

Client 客户端(如微信、今日头条)

步骤A和B 授权申请,一般展示给用户确认是否允许授权,如:微信弹窗让用户确认是否允许今日头条访问***。

步骤C和D 用户同意授权后,颁发Access Token,如:微信帐号服务按今日头条的申请颁发Access Token。Access Token有过期时间。

步骤E和F 客户端使用Access Token请求资源,资源服务器向授权服务器校验Access Token是否过期、是否有权限,校验通过后提供资源,如:今日头条使用Access Token向微信公众号服务获取文章,微信公众号服务校验Access Token是否过期、是否有获取文章的权限,校验通过后提供文章。

从OAuth2授权流程看,OAuth2协议没有涉及到身份认证(类似输用户名密码登录),也就是说,进行OAuth2步骤C和D前,如果用户没有身份认证需要先进行身份认证,具体怎么进行身份认证OAuth2没涉及,于是OpenID扩展OAuth2增加身份认证的功能。

上图为OpenID的流程图,其中OP(OpenID Provider)为OAuth2的Authorization Server支持OpenID协议,RP(Relying Party)为OAuth2的Client支持OpenID协议。OpenID的步骤1-3,对OAuth2的步骤C和D做了扩展,其它步骤与OAuth2的步骤一样,只是表述不同可以不看(此图直接复用OpenID协议文档的图)。

步骤1(扩展),RP请求授权时指定步骤3的响应方式,响应方式包括:code(授权码方式)、token等4种,不同的响应方式下面的子流程会有些不同,下面以token为例说明。

步骤2(新增),OP判断用户是否登录,未登录让用户登录。

步骤3(扩展),OP返回id_token和Access_Token,除了Access_Token还返回id_token唯一标识认证的用户。

OAuth2提供授权机制,OpenID是基于OAuth2增加身份认证功能,更详细内容可以查阅RFC6749和OpenID规范。

0 人点赞