OAuth2 目前一种 Web 主流的安全认证方法,是一种授权框架,资源所有者(Resource Owner)可以藉由授权服务器(Authorization Server)来允许第三方应用程序(Client)来访问的受保护的资源(Protected Resource)。
co-author: MowLi 微风
OAuth2规格书中,对资源也自定义的分配,下表为rfc中所分配的角色分配表:
角色 | 说明 |
---|---|
Client | 所使用的存取工具或程序,如 Browser, Mobile Phone, Postman |
Resource Owner | 具备服务存取资格的人 |
Authorization Server | 负责认证的服务器,主要负责发行Access Token |
Protected Resource | 欲存取的服务 |
举一个最常被 OAuth 相关书籍提及的例子:你(Resource Owner)有一张储存在云端服务的相片(Protected Resource),今天你想要透过一个影印服务(Client)去列印该相片。
在传统做法上,为了让影印服务(Client)拿到相片就必须将你的云端服务的凭证(例如:帐号密码)给这个影印服务,让它能存取该云端服务的资源。而 IETF RFC 6749 及 Action 书中列出了一些缺点:
综观来说,在 OAuth2 中:
简单来说,Client若要存取服务的话,首先要先拿到Authorization Grant,再使用Grant拿取Access Token,最後再使用Access Token存取服务。
Authorization Code
属於比较广泛被使用的,client 取得 Authorization Code 才能以此换取access token。
Implicit
是相对安全性来的稍微低一点,是直接取得 access token。好处是可以减少存取的 round trip 加速认证的过程。
Resource Owner Password Credentials Grant
指的是直接透过 password 直接从 Authorization Server 取得 access token,比较适合使用在可以信任的 client。
Client Credentials
完全信任 client,直接取得 token 直接存取 Protected Resource。
以 Authorization Server 角度而言,client 主要分为两种 confidential 与 public,就字面上意义 confidential 属於可以直接被信任的、public 属於不被信任的存取者。不被信任的 client 取得 Grant 的方式建议为:Authorization Grant、Implicit 的方式 ; 若是属於信任的 Client 建议为:Resource Owner Password Credentials Grant、Client Credentials。
- public 指的是 Resource Owner 是属於一般使用者而非内部开发者,因此在进行取得凭证的过程应该使用较高的安全性的方式。
- confidential 指的是 Resource Owner 是属於内部开发者的,因为服务间会互相调用,因为是可信任的服务,因此用的凭证相对的比外部得来的宽松。
OAuth 2 并不是专属给第三方程序存取认证模式,它本身是一种框架,适用任何的认证情况。事实上在 IETF RFC 文件中,针对不同的 client 有不同强度的认证方法。市面上主要广泛运用在存取第三方程序通常都以 Authorization Grant 的方式进行存取。然而 OAuth 2 其实也可以运用在内部 Service 自己存取时的场景!
[1] Hardt, Dick. RFC 6749: The OAuth 2.0 Authorization Framework. Internet Engineering Task Force (IETF) 10 (2012): 2070–1721.
<<: 伸缩自如的Flask [day 8] ajax with jquery
>>: 前端工程学习日记24天 codpen 一秒使用css rest <设定完一劳永逸.
今天我们来介绍云端的监控, Cloud Operations Suite 。这个服务以前被称做 St...
“Slept, awoke, slept, awoke, miserable life.” ― f...
Day 3 的作业有没有写呢各位? 如果昨天有练习的话,应该觉得不会太难吧! 我们今天会用一样的方...
Object content Imutability Object constant 将指定的 p...
前面我们介绍了component以及props今天我们要介绍的是slots 什麽是slots呢?它是...