理解授权协议oauth2

场景

小明同学下载了一款游戏,王者荣耀。通过使用三方授权的方式登录,在微信内点击同意登录,并勾选同意访问微信的基本信息;之后在王者荣耀内,小明就可以使用自己微信内的头像,暱称,还可以邀请到微信内的好友进行组队游戏。
oauth2在这个例子中解决了什么问题呢
小明在微信有账号,王者荣耀内没有账号。通过微信授权的方式,小明在王者荣耀省去了注册登录的过程,甚至可以邀请到微信好友进行组队游戏

理论

oauth2是什么

OAuth 2.0 is the industry-standard protocol for authorization. OAuth 2.0 focuses on client developer simplicity while providing specific authorization flows for web applications, desktop applications, mobile phones, and living room devices.

意思是说,oauth2是一个授权的标准协议。通过提供特定的授权流程来简化客户端开发。

四种角色

resource owner
An entity capable of granting access to a protected resource.
When the resource owner is a person, it is referred to as an
end-user.

资源所有者,例子中的小明同学

resource server
The server hosting the protected resources, capable of accepting
and responding to protected resource requests using access tokens.

资源服务器,例子中微信的资源,包括小明的微信头像,暱称,好友列表这些个人信息

client
An application making protected resource requests on behalf of the
resource owner and with its authorization. The term “client” does
not imply any particular implementation characteristics (e.g.,
whether the application executes on a server, a desktop, or other
devices).

客户端,例子中的游戏:王者荣耀

authorization server
The server issuing access tokens to the client after successfully
authenticating the resource owner and obtaining authorization.

授权服务器,用于颁发访问token,例子中的微信授权服务器。

授权服务器和资源服务器可以是同一个服务器,也可以是不同的服务器。上面的例子中,资源服务器和授权服务器都是微信服务器。

协议流程

 +--------+                               +---------------+
 |        |--(A)- Authorization Request ->|   Resource    |
 |        |                               |     Owner     |
 |        |<-(B)-- Authorization Grant ---|               |
 |        |                               +---------------+
 |        |
 |        |                               +---------------+
 |        |--(C)-- Authorization Grant -->| Authorization |
 | Client |                               |     Server    |
 |        |<-(D)----- Access Token -------|               |
 |        |                               +---------------+
 |        |
 |        |                               +---------------+
 |        |--(E)----- Access Token ------>|    Resource   |
 |        |                               |     Server    |
 |        |<-(F)--- Protected Resource ---|               |
 +--------+                               +---------------+

A:上图中客户端直接向资源所有者发起授权请求。最好是通过授权服务器作为中介向资源所有者发起请求,如上面小明的例子,王者荣耀客户端通过微信授权服务器向小明发起授权请求。
B:客户端收到资源所有者的授权许可。授权许可类型可以下文介绍的四种方式之一,具体选择哪一种要根据客服端请求授权的方式和授权服务器支持的方式。如上面的例子中,王者荣耀客户端收到客户的授权许可。
C:客户端通过授权许可向授权服务器发起获取访问令牌的请求。例子中王者荣耀客户端向微信服务器发起请求。
D:授权服务器进行身份认证和验证授权许可之后,颁发访问令牌。例子中微信服务器验证王者荣耀客户端获取了小明的授权之后,颁发访问令牌给王者荣耀客户端。
E:客户端携带访问令牌向资源服务器请求受保护的资源。王者荣耀客户端向微信服务器请求暱称头像等资源。
F:资源服务器返回受保护的资源。微信服务器验证访问令牌,如果有效,则正确响应。

四种授权许可类型

授权码Authorization Code

最常用的一种方式,上面小明微信授权的例子就是。
在这里插入图片描述
1.客户端通过授权服务器作为中介向资源所有者发起授权请求。
2.在步骤2.2返回授权码之前,授权服务器会对资源所有者的身份进行验证。
3.步骤3.1通过客户端直接访问授权服务器获取访问令牌,越过了资源所有者的代理:浏览器,保证了访问令牌不会被资源所有者暴露给其他人。

简化模式Implicit

Implicit是一种简化的授权码方式。针对一些特定的客户端(使用诸如JavaScript这类脚本语言浏览器客户端)做了优化,授权服务器省略了颁发授权码的过程,而是直接颁发访问令牌。
在这里插入图片描述
简化模式提升了某些客户端的响应能力和效率(诸如一些浏览器内的应用程序)。
但要注意存在的一些安全隐患,能使用授权码方式的场景尽量使用授权码。

资源所有者密码授权方式Resource Owner Password Credentials

资源所有者直接将账号密码告诉客户端,客户端通过账号密码访问授权服务器获取访问令牌。
一般用于资源所有者和客户端之间高度信任的场景。
在这里插入图片描述

客户端授权方式Client Credentials

受保护资源在客户端控制下的场景,客户端凭证作为授权许可。可用于后台api服务消费者。
在这里插入图片描述

实践

可参考JavaBigData1024的文章
后面再抽时间代码实践

总结

oauth2授权协议,并不是认证协议。后续学习OIDC身份认证

参考文献

https://tools.ietf.org/html/rfc6749#page-6

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章