理解OAuth2.0協議-基礎篇

什麼是OAuth2.0?

https://oauth.net/2/ 說:php

OAuth 2.0 is the next evolution of the OAuth protocol which was originally created in late 2006. OAuth 2.0 focuses on client developer simplicity while providing specific authorization flows for web applications, desktop applications, mobile phones, and living room devices. This specification is being developed within the IETF OAuth WG.web

OAuth(開放受權)是一個開放標準,容許用戶受權第三方網站訪問他們存儲在另外的服務提供者上的信息,而不須要將用戶名和密碼提供給第三方網站或分享他們數據的全部內容。瀏覽器

OAuth2.0 是在 OAuth 基礎上的簡化與優化,雖然不向下兼容,可是和OAuth 有着類似的理論。安全

OAuth2.0 的角色

資源全部者 resource owner (RO)

指對某種資源擁有受權能力的實體,若是資源屬於某我的的話,這個 RO 就是這我的的終端帳戶。服務器

資源服務器 resource server (RS)

指某種資源的容器,RS 經過判斷 Access Token 是否有效決定資源是否被受權訪問。微信

客戶端 client (C)

指須要訪問某個用戶的受保護資源的客戶端程序,既能夠是個桌面程序,也能夠是個瀏覽器,也能夠是個後臺服務。app

認證服務端 authorization server (AS)

指頒發 Access Token 給客戶端的服務,固然頒發以前要對 RO 進行認證而且由 RO 完成受權。ide

OAuth2.0 協議流程

從上面的角色能夠猜到,OAuth2.0 認證發生在某個資源擁有者但願經過客戶端訪問其全部資源的時候。 例如:網站 wepass.vip 但願實現微信登陸,並獲取用戶微信的頭像,那這時候 wepass.vip 這個網站自己就能夠看做是一個 Client,做爲擁有微信的我,就是一個資源擁有者(RO),要獲取的頭像就是個人資源(其實用戶名密碼自己也屬於資源),而 RS(存頭像的那個服務器) 和 AS (給認證的那個服務器) 則所有是由騰訊開放平臺提供。學習

因此,當我(RO)想在 wepass.vip (Client) 上看到個人頭像(Resource)的時候,我會先訪問 wepass.vip,而後 wepass.vip 發現我沒登陸,就求騰訊(AS)給我驗身,而後我在騰訊的認證服務器(AS)上輸入個人用戶名口令(或者二維碼、或者快捷登陸),若是騰訊承認我(有時還須要承認Client),就會生成一個 Access Token,wepass.vip 再經過Access Token 去騰訊的資源服務器(RS)上要個人頭像,而後再展現給我,這樣就完成了一個 OAuth2.0 認證。優化

這樣作的好處是:wepass.vip 不會獲得個人用戶名密碼,可是依然能夠相信個人身份,而我也只須要記住本身的微信口令,就能夠同時登陸 wepass一、wepass二、wepass3 ... 也就是實現了單點登陸。

看圖(純手繪):

+--------+                               +---------------+
     |        |--(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 ---|               |
     +--------+                               +---------------+

還有一些常見概念

許可類型 Authorization Grant

因爲第三方應用(client)的多樣性,OAuth2.0提出了多種受權類型:

  • 如受權碼 Authorization Code Grant

    這種類型 AS 在完成 RO 的認證和受權後,給 Client 一個 Code, Client 帶着 Code 再去換 AccessToken,再用 AccessToken 訪問資源。

  • 隱式受權 Implicit Grant

    這種狀況下,RO 認證並受權後,AS 會把 AccessToken 直接交給 Client,而不須要 Client 保存 Authorization Code,再去換取 Access Token。 這種場景適合於沒有服務端的程序,也就是沒有辦法對 Authorization Code 進行保密的 Client 類型。

  • RO憑證受權 Resource Owner Password Credentials Grant

    這是一種 RO 對 Client 高度可信的受權方式,RO 要把本身的憑證(用戶名、密碼)交給 Client,Client 直接拿去向 AS 請求 Access Token。

  • Client憑證受權 Client Credentials Grant

    這種場景下 AS 只須要認證 Client,比較適合於待訪問資源的安全級別不高或者資源只屬於這個 Client 的場景。

訪問令牌 Access Token

訪問令牌就是爲了訪問資源用的,通常是字符串形式,裏面標註了其範圍(Scope)和壽命(Duration)。

續期令牌 Refresh Token

續期令牌就是在當前的訪問令牌到期時,爲期續期使用的。續期令牌是個可選項,它會和訪問令牌一塊兒頒發給Client,只不過續期令牌指在 AS 上使用,不在 RS 上使用。

傳輸層安全性版本 TLS Version

TLS = Transport Layer Security,若是使用了 TLS,咱們就要對其遵循的規範版本進行標註。目前最新的版本號爲1.2,最普遍的版本號爲1.0。

誰在用 OAuth2.0?

還有HP、IBM、Oracle等等等等,有頭有臉有用戶的大公司都有本身的 AS 和 RS。

下次再聊聊客戶端的註冊

玩得開心!

原文請戳: http://www.tonglei.win/2016/10/25/IT學習/SSO/理解OAuth2.0協議-基礎篇/ @tonglei.wn

相關文章
相關標籤/搜索