上周,我想開(kāi)發(fā)OAuth 2.0的一個(gè)實(shí)例。我檢查了Spring-security-Oauth2.0的樣例,OAuth 2提供商sparklr2和OAuth 2客戶端TONR 。我探索在互聯(lián)網(wǎng)上了一下,整理相關(guān)文檔。編譯并運(yùn)行了OAuth 2提供商sparklr2和OAuth 2客戶端TONR,并檢查所有的授權(quán)上。現(xiàn)在,我在這里從實(shí)用的角度講解的OAuth 2.0的不同方面來(lái)理解Spring-security-Oauth2.0。
這篇文章是試圖描述的OAuth 2.0以簡(jiǎn)化的形式來(lái)幫助開(kāi)發(fā)商和服務(wù)提供商實(shí)施的協(xié)議。
我將涵蓋以下主題在這篇文章中。
1 。實(shí)體
2 。創(chuàng)建應(yīng)用程序
3 。授權(quán), Grant-Type
a.Web服務(wù)器應(yīng)用程序(Web Server)
b.基于瀏覽器的應(yīng)用程序(Web Client)
c.手機(jī)應(yīng)用程序(Mobile APP)
d.其它桌面應(yīng)用程序
4 。訪問(wèn)資源
5 。資源
OAuth2.0流程:
OAuth的服務(wù)器:
這也被稱為OAuth的提供者。它的整體責(zé)任是驗(yàn)證和授權(quán)的用戶/客戶端和管理令牌。
第三方應(yīng)用:
第三方應(yīng)用程序俗稱為客戶端,將嘗試獲得訪問(wèn)用戶的帳戶。它需要從用戶獲得許可,才可以這樣做。這可能是一個(gè)基于Web服務(wù)器的應(yīng)用程序,基于瀏覽器的應(yīng)用程序,桌面應(yīng)用程序,手機(jī)/平板電腦應(yīng)用程序或一些智能設(shè)備,如谷歌護(hù)目鏡和智能電視。
資源服務(wù)器:
俗稱為資源服務(wù)器的API ,從其中的數(shù)據(jù)會(huì)被提取出來(lái)或送達(dá)。這可能是SOAP或REST的基礎(chǔ)服務(wù)提供商。
用戶:
用戶俗稱為資源擁有者,誰(shuí)可以訪問(wèn)訪問(wèn)資源。
創(chuàng)建應(yīng)用程序:
在您開(kāi)始OAuth的過(guò)程中,您必須先注冊(cè)一個(gè)新的應(yīng)用與服務(wù)/供應(yīng)商。當(dāng)注冊(cè)一個(gè)新的應(yīng)用程序,你通常注冊(cè)基本信息,如應(yīng)用程序克林特ID ,秘密,授權(quán)發(fā)放,類型等,另外,你必須注冊(cè)一個(gè)重定向URI,用于將用戶重定向到Web服務(wù)器,基于瀏覽器的,或移動(dòng)應(yīng)用程序。
重定向的URI :
該服務(wù)將只將用戶重定向到注冊(cè)的URI ,這有助于防止某些攻擊。任何HTTP重定向的URI必須與SSL安全保護(hù),因此該服務(wù)將只重定向到的URI以“https ”開(kāi)頭。這可以防止從令牌在授權(quán)過(guò)程中被截獲。
客戶端ID和授權(quán)密碼:
注冊(cè)您的應(yīng)用程序后,你將擁有你的客戶端ID和客戶端授權(quán)密碼。該客戶端ID被認(rèn)為是公共信息,并用于建立登錄網(wǎng)址,或包括在一個(gè)頁(yè)面上的Javascript源代碼。客戶端授權(quán)密碼必須保密。如果部署的應(yīng)用程序不能保守授權(quán)密碼的機(jī)密,如JavaScript或本機(jī)應(yīng)用程序,那么這個(gè)授權(quán)密碼不被使用。
授權(quán)方式:
的OAuth 2的第一步驟是從用戶獲得授權(quán)。對(duì)于基于瀏覽器或移動(dòng)應(yīng)用程序,這通常是由顯示給用戶提供的服務(wù)的接口來(lái)實(shí)現(xiàn)的。
OAuth的2提供了不同的用例數(shù)批類型。定義的補(bǔ)助類型有:
一個(gè)Web服務(wù)器上運(yùn)行的應(yīng)用程序授權(quán)碼
隱含的基于瀏覽器的或移動(dòng)應(yīng)用程序
密碼與用戶名和密碼登錄
對(duì)于應(yīng)用程序訪問(wèn)客戶端憑據(jù)
Web服務(wù)器應(yīng)用程序
Web應(yīng)用程序都寫在一個(gè)服務(wù)器端語(yǔ)言和運(yùn)行服務(wù)器的應(yīng)用程序的源代碼是不提供給公眾。
授權(quán)請(qǐng)求:
http://localhost:8080/oauth2/oauth/authorize?response_type=code&client_id=easylocate&scope=read&redirect_uri=http://localhost:8080/web
之后接受訪問(wèn)。該頁(yè)面將被重定向到重定向URI的授權(quán)碼。
http://localhost:8080/web/?code=t7ol7D
現(xiàn)在是時(shí)候來(lái)交換授權(quán)碼來(lái)獲得訪問(wèn)令牌。
http://localhost:8080/oauth2/oauth/token?grant_type=authorization_code&code=t7ol7D&redirect_uri=http://localhost:8080/web&client_id=easylocate&client_secret=secret
與訪問(wèn)令牌的OAuth的服務(wù)器回復(fù)
{
“ ACCESS_TOKEN ”:“ 372c3458 - 4067 - 4b0b - 8b77 - 7930f660d990 ”
“ token_type ” : “bearer” ,
“ refresh_token ” : “ ce23c924 - 3f28 - 456C - A112 - b5d02162f10c ”
“ expires_in ” : 37364 ,
“scope” : “read”
}
萬(wàn)一錯(cuò)了授權(quán)碼,的Oauth服務(wù)器回復(fù)的錯(cuò)誤。
{
“error” : “ invalid_grant ” ,
“ error_description ” : “無(wú)效的授權(quán)碼: t7olD ”
}
安全性:需要注意的是該服務(wù)應(yīng)要求應(yīng)用程序進(jìn)行預(yù)注冊(cè)的重定向的URI 。否則將有一個(gè)錯(cuò)配。
基于瀏覽器的應(yīng)用程序和移動(dòng)應(yīng)用程序:
基于瀏覽器的應(yīng)用程序在瀏覽器從網(wǎng)頁(yè)加載的源代碼之后運(yùn)行完全。由于整個(gè)源代碼是提供給瀏覽器,他們不能保持其客戶端秘密的保密性,所以這個(gè)秘密是不是在這種情況下使用。
授權(quán)請(qǐng)求:
http://localhost:8080/oauth2/oauth/authorize?response_type=token&client_id=easylocate&redirect_uri=http://localhost:8080/web&scope=read
之后接受訪問(wèn)。該頁(yè)面將被重定向到重定向URI與令牌。
http://localhost:8080/web/#access_token=372c3458-4067-4b0b-8b77-7930f660d990&token_type=bearer&expires_in=37026
就是這樣,沒(méi)有其他的步驟!在這一點(diǎn)上,一些JavaScript代碼可以(在#后的部分)拉出訪問(wèn)令牌的片段,并開(kāi)始進(jìn)行API請(qǐng)求。
如果出現(xiàn)錯(cuò)誤,你反而會(huì)收到一條錯(cuò)誤的URI片段,如:
http://localhost:8080/web/#error=invalid_scope&error_description=Invalid+scope%3A+rea&scope=read+write
基于密碼:
OAuth的2還提供了可用于令牌直接交換一個(gè)用戶名和密碼訪問(wèn)密碼交付式。因?yàn)檫@顯然需要的應(yīng)用程序來(lái)收集用戶的密碼,它應(yīng)該只用于由服務(wù)自身創(chuàng)建的應(yīng)用程序。例如,原生Twitter的應(yīng)用程序可以使用這筆款項(xiàng)型移動(dòng)或桌面應(yīng)用程序登錄。
使用密碼交付式,只是讓類似下面的POST請(qǐng)求。我現(xiàn)在用的卷曲工具來(lái)演示POST請(qǐng)求。您可以使用任何其余客戶端。
卷曲-I -X POST -D “的client_id = easylocate & grant_type =密碼和用戶名admin和密碼=管理員& CLIENT_SECRET =秘密” http://localhost:8080/oauth2/oauth/token
服務(wù)器將返回與令牌
{
“ ACCESS_TOKEN ”:“ 4e56e9ec - 2f8e - 46b4 - 88b1 - 5d06847909ad ”
“ token_type ” : “bearer” ,
“ refresh_token ”:“ 7e14c979 - 7039 - 49d0 - 9c5d - 854efe7f5b38 ”
“ expires_in ” : 36133 ,
“scope” : “read,write"
}
客戶端憑據(jù)基于:
基于客戶端credentals授權(quán)用于服務(wù)器到服務(wù)器應(yīng)用程序的訪問(wèn)。我只是表示使用卷曲工具的POST請(qǐng)求。
卷曲-I -X POST -D “的client_id = easylocate & grant_type = client_credentials & CLIENT_SECRET =秘密” http://localhost:8080/oauth2/oauth/token
服務(wù)器會(huì)回來(lái)的訪問(wèn)令牌
{
“ ACCESS_TOKEN ”:“ 9cd23bef - ae56 - 46b0 - 82f5 - b9a8f78da569 ”
“ token_type ” : “bearer” ,
“ expires_in ” : 43199 ,
“scope” : “read”
}
訪問(wèn)的資源:
一旦您通過(guò)驗(yàn)證并獲得訪問(wèn)令牌,可以提供訪問(wèn)令牌來(lái)訪問(wèn)受保護(hù)的資源。
聯(lián)系客服