成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

OAuth2基本概念和運(yùn)作流程

YFan / 2605人閱讀

摘要:目前的版本是版,本文將對(duì)的一些基本概念和運(yùn)行流程做一個(gè)簡(jiǎn)要介紹。只要有一個(gè)第三方應(yīng)用程序被破解,就會(huì)導(dǎo)致用戶密碼泄漏,以及所有被密碼保護(hù)的數(shù)據(jù)泄漏。運(yùn)行流程客戶端向資源所有者請(qǐng)求授權(quán)。

OAuth(開放授權(quán))是一個(gè)關(guān)于授權(quán)的開放標(biāo)準(zhǔn),允許用戶讓第三方應(yīng)用訪問該用戶在某一網(wǎng)站上存儲(chǔ)的私密的資源(如照片,視頻,聯(lián)系人列表),而無需將用戶名和密碼提供給第三方應(yīng)用。目前的版本是2.0版,本文將對(duì)OAuth2.0的一些基本概念和運(yùn)行流程做一個(gè)簡(jiǎn)要介紹。主要參考RFC-6749。

應(yīng)用場(chǎng)景

這里有兩個(gè)典型的例子:

比如你瀏覽某個(gè)網(wǎng)站的技術(shù)文章,發(fā)現(xiàn)其中某段介紹的不夠詳細(xì),想留言給作者提問,點(diǎn)擊評(píng)論,結(jié)果發(fā)現(xiàn)需要有這個(gè)網(wǎng)站的賬號(hào)才能留言,此時(shí)有兩個(gè)選擇,一個(gè)是新注冊(cè)一個(gè)此網(wǎng)站的賬號(hào),二是點(diǎn)擊通過github快速登錄。前者你覺得過于繁瑣,直接點(diǎn)擊了github登錄,此時(shí),OAuth的認(rèn)證流程就開始了。通過引導(dǎo)跳轉(zhuǎn)到github界面,會(huì)提示你是否授權(quán)該網(wǎng)站使用你的github用戶信息,點(diǎn)擊確認(rèn),跳轉(zhuǎn)回原網(wǎng)站,發(fā)現(xiàn)已經(jīng)使用你的github賬號(hào)默認(rèn)注冊(cè)了一個(gè)用戶,而且還不需要用戶名和密碼,便捷高效。

假如有一個(gè)云沖印的網(wǎng)站,可以將你存儲(chǔ)在Google的照片沖印出來,用戶為了使用該服務(wù),必須讓云沖印讀取Google上的照片。為了拿到照片,云沖印必須得拿到一個(gè)用戶的授權(quán),如何獲取這個(gè)用戶授權(quán)呢?傳統(tǒng)方法是用戶將用戶名和密碼告訴云沖印,那么云沖印就可以自由無限制的訪問了(相當(dāng)于用戶自己訪問),這樣顯然是不行的,有幾個(gè)嚴(yán)重的缺點(diǎn):

云沖印為了保存后續(xù)服務(wù),會(huì)保存用戶的密碼,這樣很不安全。

云沖印擁有了獲取用戶存儲(chǔ)在Google的所有資料的權(quán)力,用戶沒法限制云沖印得到的授權(quán)范圍和授權(quán)有效期。

用戶只有修改密碼,才能收回賦予云沖印的權(quán)力,但是如果還授權(quán)給了其他的應(yīng)用,那么密碼的修改將影響到所有被授權(quán)應(yīng)用。

只要有一個(gè)第三方應(yīng)用程序被破解,就會(huì)導(dǎo)致用戶密碼泄漏,以及所有被密碼保護(hù)的數(shù)據(jù)泄漏。(例子來自阮一峰-理解OAuth2.0)

可以看出,OAuth就是為解決如上例子而誕生的。

名詞解釋

以下幾個(gè)名詞至關(guān)重要:

Resource Owner:資源所有者。即用戶。

Client:客戶端(第三方應(yīng)用)。如云沖印。

HTTP service:HTTP服務(wù)提供商,簡(jiǎn)稱服務(wù)提供商。如上文提到的github或者Google。

User Agent:用戶代理。本文中就是指瀏覽器。

Authorization server:授權(quán)(認(rèn)證)服務(wù)器。即服務(wù)提供商專門用來處理認(rèn)證的服務(wù)器。

Resource server:資源服務(wù)器,即服務(wù)提供商存放用戶生成的資源的服務(wù)器。它與認(rèn)證服務(wù)器,可以是同一臺(tái)服務(wù)器,也可以是不同的服務(wù)器。

Access Token:訪問令牌。使用合法的訪問令牌獲取受保護(hù)的資源。

運(yùn)行流程

(A)客戶端向資源所有者請(qǐng)求授權(quán)。授權(quán)請(qǐng)求可以直接對(duì)資源所有者(如圖所示)進(jìn)行,或者通過授權(quán)服務(wù)器作為中介進(jìn)行間接訪問(首選方案)。

(B)資源所有者允許授權(quán),并返回憑證(如code)。

(C)客戶端通過授權(quán)服務(wù)器進(jìn)行身份驗(yàn)證,并提供授權(quán)憑證(如code),請(qǐng)求訪問令牌(access token)。

(D)授權(quán)服務(wù)器對(duì)客戶端進(jìn)行身份驗(yàn)證,并驗(yàn)證授權(quán)憑證,如果有效,則發(fā)出訪問令牌。

(E)客戶端向資源服務(wù)器請(qǐng)求受保護(hù)的資源,并通過提供訪問令牌來進(jìn)行身份驗(yàn)證。

(F)資源服務(wù)器驗(yàn)證訪問令牌,如果正確則返回受保護(hù)資源。

授權(quán)

從運(yùn)行流程不難看出,要獲取access token必須先得到用戶授權(quán)(authorzation grant),那么如果獲取這么用戶授權(quán)呢?OAuth 2.0定義了四種類型的授權(quán)類型:

授權(quán)碼模式(authorization code

簡(jiǎn)化模式(implicit

密碼模式(resource owner password credentials

客戶端模式(client credentials

授權(quán)碼模式(authorization code

授權(quán)碼模式是功能最完整、使用最廣泛、流程最嚴(yán)密的授權(quán)模式。

由于這是一個(gè)基于重定向的流,所以客戶端必須能夠與資源所有者的用戶代理(通常是web瀏覽器)進(jìn)行交互,并且能夠從授權(quán)服務(wù)器接收傳入的請(qǐng)求(通過重定向)。

(A)用戶訪問客戶端,客戶端將用戶導(dǎo)向授權(quán)服務(wù)器,通過用戶代理(User-Agent)發(fā)送包括它的客戶端標(biāo)識(shí)符、請(qǐng)求的范圍、本地狀態(tài)和一個(gè)重定向URI,授權(quán)服務(wù)器在授予(或拒絕)訪問權(quán)后將其發(fā)送給用戶代理。

(B)授權(quán)服務(wù)器對(duì)資源所有者進(jìn)行身份驗(yàn)證(通過用戶代理),并確定資源所有者是否授予或拒絕客戶端的訪問請(qǐng)求。

(C)假如資源所有者同意授權(quán)請(qǐng)求,那么授權(quán)服務(wù)器將會(huì)使用前面提供的或者事先指定的重定向URI(redirection URI),重定向到客戶端,并附上一個(gè)授權(quán)碼(code)和一個(gè)前面提供的本地狀態(tài)(state)(如果有的話,則會(huì)原值返回)。

(D)客戶端收到授權(quán)碼,附上早先的重定向URI,向授權(quán)服務(wù)器申請(qǐng)令牌。這一步是在客戶端的后臺(tái)的服務(wù)器上完成的,對(duì)用戶不可見。在發(fā)出請(qǐng)求時(shí),授權(quán)服務(wù)器對(duì)客戶端進(jìn)行身份驗(yàn)證。請(qǐng)求參數(shù)包含授權(quán)代碼、用于獲得驗(yàn)證的授權(quán)代碼的重定向URI、標(biāo)識(shí)客戶端身份的client idclient secret。

(E)授權(quán)服務(wù)器對(duì)客戶端進(jìn)行身份驗(yàn)證,驗(yàn)證授權(quán)代碼,并確保所收到的重定向URI與用于在步驟(C)中對(duì)客戶端重定向的URI相匹配,如果有效,授權(quán)服務(wù)器將發(fā)送訪問令牌access token和刷新令牌refresh token(可選)。

接著來介紹下各個(gè)步驟所需的參數(shù)

對(duì)于步驟A,客戶端申請(qǐng)授權(quán)請(qǐng)求的URI,包含以下參數(shù):

response_type授權(quán)類型。必選項(xiàng),其值固定為code

client_id客戶端id。必選項(xiàng),用于標(biāo)識(shí)授權(quán)服務(wù)器中已注冊(cè)的客戶端。

redirect_uri重定向URI??蛇x項(xiàng),如果不填寫則使用注冊(cè)在授權(quán)服務(wù)器端與client_id對(duì)應(yīng)的redirect_uri。

scope申請(qǐng)的權(quán)限范圍,如readwrite??蛇x項(xiàng),如果申請(qǐng)的請(qǐng)求訪問超出授權(quán)服務(wù)器定義的可操作范圍則會(huì)失敗。

state表示客戶端當(dāng)前狀態(tài)??蛇x項(xiàng),可以指定任意值,授權(quán)服務(wù)器會(huì)原封不動(dòng)地返回這個(gè)值。

eg:

GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz
        &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
Host: server.example.com

C步驟中,服務(wù)器回應(yīng)客戶端的URI,包含以下參數(shù):

code授權(quán)碼。必選項(xiàng),授權(quán)碼必須在頒發(fā)后很快過期以減小泄露風(fēng)險(xiǎn),建議最長時(shí)間設(shè)為10分鐘,客戶端只能使用該碼一次,否則會(huì)被授權(quán)服務(wù)器拒絕。該碼與client id和重定向URI,是一一對(duì)應(yīng)關(guān)系。

state如果客戶端的請(qǐng)求中包含這個(gè)參數(shù),認(rèn)證服務(wù)器的回應(yīng)也必須一模一樣包含這個(gè)參數(shù)。

eg:

HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
          &state=xyz

D步驟中,客戶端向認(rèn)證服務(wù)器申請(qǐng)令牌的HTTP請(qǐng)求,包含以下參數(shù):

grant_type許可類型(授權(quán)模式)。必選項(xiàng),此處固定值為authorization_code。

code上一步獲得的授權(quán)碼。必選項(xiàng)。

redirect_uri表示重定向URI。必選項(xiàng),且必須與A步驟中的該參數(shù)值保持一致。

client_id表示客戶端ID,必選項(xiàng)。

eg:

POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb

E步驟中,認(rèn)證服務(wù)器發(fā)送的HTTP回復(fù),包含以下參數(shù):

access_token表示訪問令牌。必選項(xiàng)。

token_type表示令牌類型。該值大小寫不敏感,必選項(xiàng),可以是bearer類型或mac類型。

expires_in表示過期時(shí)間,單位為秒。如果省略該參數(shù),必須其他方式設(shè)置過期時(shí)間。

refresh_token表示更新令牌??蛇x項(xiàng),用來獲取下一次的訪問令牌。

scope表示權(quán)限范圍??蛇x項(xiàng),如果與客戶端申請(qǐng)的范圍一致,此項(xiàng)可省略。

eg:

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
   "access_token":"2YotnFZFEjr1zCsicMWpAA",
   "token_type":"example",
   "expires_in":3600,
   "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
   "example_parameter":"example_value"
}
簡(jiǎn)化模式(implicit

簡(jiǎn)化模式(implicit grant type)不通過第三方應(yīng)用程序的服務(wù)器,直接在瀏覽器中向認(rèn)證服務(wù)器申請(qǐng)令牌,跳過了"授權(quán)碼"這個(gè)步驟,因此得名。所有步驟在瀏覽器中完成,令牌對(duì)訪問者是可見的,且客戶端不需要認(rèn)證。具體步驟可參閱RFC6749 4.2節(jié)。

密碼模式(resource owner password credentials

密碼模式中,用戶向客戶端提供自己的用戶名和密碼。客戶端使用這些信息,向"服務(wù)商提供商"索要授權(quán)。
在這種模式中,用戶必須把自己的密碼給客戶端,但是客戶端不得儲(chǔ)存密碼。這通常用在用戶對(duì)客戶端高度信任的情況下,比如客戶端是操作系統(tǒng)的一部分,或者由一個(gè)著名公司出品。而認(rèn)證服務(wù)器只有在其他授權(quán)模式無法執(zhí)行的情況下,才能考慮使用這種模式。可參閱RFC6749 4.3節(jié)。

客戶端模式(client credentials

客戶端模式(Client Credentials Grant)指客戶端以自己的名義,而不是以用戶的名義,向"服務(wù)提供商"進(jìn)行認(rèn)證。嚴(yán)格地說,客戶端模式并不屬于OAuth框架所要解決的問題。在這種模式中,用戶直接向客戶端注冊(cè),客戶端以自己的名義要求"服務(wù)提供商"提供服務(wù),其實(shí)不存在授權(quán)問題??蓞㈤哛FC6749 4.4節(jié)。

基于Github登錄的授權(quán)碼模式例子

前文提到了一個(gè)Github登錄留言的例子,假設(shè)我們要使用OAuth2.0協(xié)議搭建一個(gè)網(wǎng)站,利用Github作為授權(quán)和資源服務(wù)器,實(shí)現(xiàn)第三方登錄功能。
(轉(zhuǎn)載)現(xiàn)概況一下主要流程:

1) 網(wǎng)站和Github之間的協(xié)商

Github會(huì)對(duì)用戶的權(quán)限做分類比如讀取倉庫信息的權(quán)限、寫入倉庫的權(quán)限、讀取用戶信息的權(quán)限、修改用戶信息的權(quán)限等等。如果我想獲取用戶的信息,Github會(huì)要求我,先在它的平臺(tái)上注冊(cè)一個(gè)應(yīng)用,在申請(qǐng)的時(shí)候標(biāo)明需要獲取用戶信息的哪些權(quán)限,并且在申請(qǐng)的時(shí)候填寫你的網(wǎng)站域名,Github只允許在這個(gè)域名中獲取用戶信息。

此時(shí)我的網(wǎng)站已經(jīng)和Github之間達(dá)成了共識(shí),Github也給我發(fā)了兩張門票,一張門票叫做Client Id,另一張門票叫做Client Secret。

2)用戶和Github之間的協(xié)商

用戶進(jìn)入我的網(wǎng)站,點(diǎn)擊github登錄按鈕的時(shí)候,我的網(wǎng)站會(huì)將Github給我的Client Id交給用戶,讓他進(jìn)入Github授權(quán)界面,如果此時(shí)用戶沒有登錄,Github會(huì)提示登錄(當(dāng)然這不是OAuth2.0客戶端部分應(yīng)該關(guān)注的)。假設(shè)用戶已經(jīng)登錄Github,那么Github看到用戶手中的門票,就知道是我的網(wǎng)站讓他過來的,于是就把我的網(wǎng)站獲取的權(quán)限擺出來,并詢問用戶是否允許網(wǎng)站獲取這些權(quán)限。

// 用戶登錄 github,協(xié)商
GET //github.com/login/oauth/authorize
// 協(xié)商憑證
params = {
  client_id: "xxxx",
  redirect_uri: "http://my-website.com"
}

如果用戶同意,在授權(quán)頁面點(diǎn)擊了確認(rèn)授權(quán)后,頁面會(huì)跳轉(zhuǎn)到我預(yù)先設(shè)定的 redirect_uri并附帶一個(gè)蓋了章的門票code

// 協(xié)商成功后帶著蓋了章的 code
Location: http://my-website.com?code=xxx

這個(gè)時(shí)候,用戶和 Github 之間的協(xié)商就已經(jīng)完成,Github 也會(huì)在自己的系統(tǒng)中記錄這次協(xié)商,表示該用戶已經(jīng)允許在我的網(wǎng)站訪問上直接操作和使用他的部分資源。

3)告訴Github我的網(wǎng)站要來訪問

第二步中,我們已經(jīng)拿到了蓋過章的門票code,但這個(gè)code 只能表明,用戶允許我的網(wǎng)站從github上獲取該用戶的數(shù)據(jù),如果我直接拿這個(gè)code去github訪問數(shù)據(jù)一定會(huì)被拒絕,因?yàn)槿魏稳硕伎梢猿钟?b>code,github并不知道code持有方就是我本人。

還記得之前申請(qǐng)應(yīng)用的時(shí)候github給我的兩張門票么,Client Id在上一步中已經(jīng)用過了,接下來輪到另一張門票Client Secret。

// 網(wǎng)站和 github 之間的協(xié)商
POST //github.com/login/oauth/access_token
// 協(xié)商憑證包括 github 給用戶蓋的章和 github 發(fā)給我的門票
params = {
  code: "xxx",
  client_id: "xxx",
  client_secret: "xxx",
  redirect_uri: "http://my-website.com"
}

拿著用戶蓋過章的code和能夠標(biāo)識(shí)個(gè)人身份的client_id、client_secret去拜訪 github,拿到最后的綠卡access_token。

// 拿到最后的綠卡
response = {
  access_token: "e72e16c7e42f292c6912e7710c838347ae178b4a"
  scope: "user,gist"
  token_type: "bearer",
  refresh_token: "xxxx"
}
4)用戶開始使用Github賬號(hào)在我的網(wǎng)站上留言
// 訪問用戶數(shù)據(jù)
GET //api.github.com/user?access_token=e72e16c7e42f292c6912e7710c838347ae178b4a

上一步github已經(jīng)把最后的綠卡access_token給我了,通過github提供的 API 加綠卡就能夠訪問用戶的信息了,能獲取用戶的哪些權(quán)限在response 中也給了明確的說明,scopeusergist,也就是只能獲取user組和gist組兩個(gè)小組的權(quán)限,user組中就包含了用戶的名字和郵箱等信息了。

// 告訴我用戶的名字和郵箱
response = {
  username: "barretlee",
  email: "[email protected]"
}
本文到此結(jié)束,介紹的整個(gè)流程比較簡(jiǎn)陋,具體細(xì)節(jié)還是閱讀RFC6749 。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/68626.html

相關(guān)文章

  • OAuth2基本概念運(yùn)作流程

    摘要:目前的版本是版,本文將對(duì)的一些基本概念和運(yùn)行流程做一個(gè)簡(jiǎn)要介紹。只要有一個(gè)第三方應(yīng)用程序被破解,就會(huì)導(dǎo)致用戶密碼泄漏,以及所有被密碼保護(hù)的數(shù)據(jù)泄漏。運(yùn)行流程客戶端向資源所有者請(qǐng)求授權(quán)。 OAuth(開放授權(quán))是一個(gè)關(guān)于授權(quán)的開放標(biāo)準(zhǔn),允許用戶讓第三方應(yīng)用訪問該用戶在某一網(wǎng)站上存儲(chǔ)的私密的資源(如照片,視頻,聯(lián)系人列表),而無需將用戶名和密碼提供給第三方應(yīng)用。目前的版本是2.0版,本文將...

    wyk1184 評(píng)論0 收藏0
  • 說說微信掃碼登錄

    摘要:詳情接口我們這里主要講的是網(wǎng)站應(yīng)用,網(wǎng)站應(yīng)用微信登錄是基于協(xié)議標(biāo)準(zhǔn)構(gòu)建的微信授權(quán)登錄系統(tǒng)即上面的協(xié)議。在微信客戶端授權(quán)登錄獲取用戶信息的可以查看。微信授權(quán)登錄目前支持模式,適用于擁有端的應(yīng)用授權(quán)。 一、OAuth2.0 OAuth(開放授權(quán))是一個(gè)開放標(biāo)準(zhǔn),允許用戶讓第三方應(yīng)用訪問該用戶在某一網(wǎng)站上存儲(chǔ)的私密的資源(如照片,視頻,聯(lián)系人列表),而無需將用戶名和密碼提供給第三方應(yīng)用。 ...

    Jokcy 評(píng)論0 收藏0
  • 理解JWT(JSON Web Token)認(rèn)證及python實(shí)踐

    摘要:認(rèn)證服務(wù)器,即服務(wù)提供商專門用來處理認(rèn)證的服務(wù)器。它與認(rèn)證服務(wù)器,可以是同一臺(tái)服務(wù)器,也可以是不同的服務(wù)器??蛻舳耸褂蒙弦徊将@得的授權(quán),向認(rèn)證服務(wù)器申請(qǐng)令牌。認(rèn)證服務(wù)器對(duì)客戶端進(jìn)行認(rèn)證以后,確認(rèn)無誤,同意發(fā)放令牌。 最近想做個(gè)小程序,需要用到授權(quán)認(rèn)證流程。以前項(xiàng)目都是用的 OAuth2 認(rèn)證,但是Sanic 使用OAuth2 不太方便,就想試一下 JWT 的認(rèn)證方式。這一篇主要內(nèi)容是 ...

    BigTomato 評(píng)論0 收藏0
  • 企業(yè)微信端項(xiàng)目登陸、獲取用戶信息流程

    摘要:步入正題吧身份認(rèn)證網(wǎng)頁授權(quán)登陸企業(yè)微信提供了的授權(quán)登陸方式,可以讓從企業(yè)微信終端打開網(wǎng)頁獲取成員的身份信息,從而避免登陸環(huán)節(jié)。 在開發(fā)之前,最好先過一遍官方的API,不然很難往下進(jìn)行。企業(yè)微信API 先介紹幾個(gè)基本的概念: cropid 每個(gè)企業(yè)都擁有一個(gè)唯一的cropid,要獲取次信息可在管理后臺(tái)我的企業(yè)-企業(yè)信息下查看企業(yè)ID(這個(gè)需要管理員權(quán)限的) userid 每個(gè)成員都有一...

    Amio 評(píng)論0 收藏0
  • OAuth2 學(xué)習(xí)筆記

    摘要:而在這背后則是建立在基礎(chǔ)之上。簡(jiǎn)化模式的授權(quán)許可簡(jiǎn)化模式的授權(quán)更加適用于移動(dòng)端的以及應(yīng)用,因?yàn)樗麄兊陌踩圆⒉荒軌虻玫奖WC。除此之外,服務(wù)也不會(huì)對(duì)應(yīng)用的做唯一性表示驗(yàn)證,依賴回調(diào)的地址。 showImg(https://segmentfault.com/img/bVvTab); 在日常的網(wǎng)站中,我們經(jīng)常會(huì)看見一些來自社交網(wǎng)站的登錄按鈕,類似使用facebook,twitter登錄等。而...

    用戶83 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<