OAuth2原來(lái)這樣用



一、理論
1、OAuth2介紹
OAuth(開(kāi)放授權(quán))是一個(gè)開(kāi)放標(biāo)準(zhǔn),允許用戶(hù)授權(quán)第三方移動(dòng)應(yīng)用訪問(wèn)他們存儲(chǔ)在另外的服務(wù)提供者上的信息,而不需要將用戶(hù)名和密碼提供給第三方移動(dòng)應(yīng)用或分享他們數(shù)據(jù)的所有內(nèi)容,OAuth2.0是OAuth協(xié)議的延續(xù)版本,但不向后兼容OAuth 1.0即完全廢止了OAuth1.0。
2、OAuth2角色
OAuth2的標(biāo)準(zhǔn)定義了以下幾種角色:
客戶(hù)端(Client):客戶(hù)端即代表意圖訪問(wèn)受限資源的第三方應(yīng)用。在訪問(wèn)實(shí)現(xiàn)之前,它必須先經(jīng)過(guò)用戶(hù)者授權(quán),并且獲得的授權(quán)憑證將進(jìn)一步由授權(quán)服務(wù)器進(jìn)行驗(yàn)證。
資源擁有者(Resource Owner):資源擁有者即代表授權(quán)客戶(hù)端訪問(wèn)本身資源信息的用戶(hù),也就是應(yīng)用場(chǎng)景中的“開(kāi)發(fā)者A”。客戶(hù)端訪問(wèn)用戶(hù)帳戶(hù)的權(quán)限僅限于用戶(hù)授權(quán)的“范圍”(aka. scope,例如讀取或?qū)懭霗?quán)限)。
認(rèn)證服務(wù)器(Authorization Server):認(rèn)證服務(wù)器驗(yàn)證用戶(hù)身份然后為客戶(hù)端派發(fā)資源訪問(wèn)令牌,即給客戶(hù)端校驗(yàn)授權(quán)碼和頒發(fā) token ;
資源服務(wù)器(Resource Server):資源服務(wù)器托管了受保護(hù)的用戶(hù)賬號(hào)信息。
3、OAuth2認(rèn)證流程
如圖是OAuth2的認(rèn)證流程圖:
(1)、客戶(hù)端向資源擁有者發(fā)起授權(quán)請(qǐng)求(輸入自己的社交賬號(hào)密碼)。
(2)、資源擁有者確認(rèn)客戶(hù)端的授權(quán),返回授權(quán)碼。
(3)、客戶(hù)端拿到授權(quán)碼向認(rèn)證服務(wù)器換取令牌token。
(4)、認(rèn)證服務(wù)器對(duì)授權(quán)碼進(jìn)行身份校驗(yàn),通過(guò)后發(fā)放令牌給客戶(hù)端(授權(quán)碼只能使用一次)。
(5)、客戶(hù)端拿著令牌token去請(qǐng)求資源服務(wù)器。
(6)、資源服務(wù)器檢驗(yàn)令牌token是否有效,有效返回客戶(hù)端用戶(hù)信息。
二、模式
OAuth2的標(biāo)準(zhǔn)定義了以下四種授權(quán)模式;
1、授權(quán)碼模式
我們上面講的內(nèi)容是基于授權(quán)碼模式,指的是在第三方應(yīng)用中先申請(qǐng)一個(gè)授權(quán)碼,然后用該授權(quán)碼獲取令牌。它被稱(chēng)為最安全的一種模式之一,因?yàn)楂@取令牌的操作是在兩個(gè)服務(wù)端進(jìn)行的,減少token泄露的風(fēng)險(xiǎn)。
官網(wǎng)流程圖:
從調(diào)接口方面,簡(jiǎn)單來(lái)說(shuō):
第一步:獲取code:
eg:oauthServer+"/oauth/authorize?
client_id="+clientId+"&response_type=code&redirect_uri="+redirectUrl+"&scope=all"
如果沒(méi)有登錄,則會(huì)跳轉(zhuǎn)到統(tǒng)一身份認(rèn)證登錄頁(yè)面。如果用戶(hù)登錄了,調(diào)用接口后,會(huì)重定向到
redirect_uri,授權(quán)碼會(huì)作為它的參數(shù)
第二步:獲取access_token
eg: oauthServer+"/oauth/token?code="+code+"&grant_type=authorization_code&client_secret="+clientSecret+"&redirect_uri="+redirectUri+"&client_id="+clientId
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1ODk1MzQ5NzMsInVzZXJfbmFtZS
"token_type": "bearer",
"expires_in": 59,
"scope": "all",
"user_name": "nicky",
"jti": "f2343d44-a85b-428f-9a5e-b51850053988"
}
第三步:訪問(wèn)系統(tǒng)資源,此時(shí)統(tǒng)一認(rèn)證服務(wù)會(huì)根據(jù)該認(rèn)證客戶(hù)端權(quán)限信息判斷,決定是否返回信
息。
訪問(wèn):http://localhost:8080/api/userinfo?access_token=${accept_token}
2、簡(jiǎn)化模式
簡(jiǎn)化模式是對(duì)授權(quán)碼模式進(jìn)行的簡(jiǎn)化,直接跳過(guò)獲取授權(quán)碼的步驟,直接在瀏覽器中向認(rèn)證服務(wù)器申請(qǐng)令牌。
從調(diào)接口方面,簡(jiǎn)單來(lái)說(shuō):
第一步:訪問(wèn)授權(quán),要傳client_id:客戶(hù)端id,redirect_uri:重定向uri,response_type為token,
scope是授權(quán)范圍,state是其它自定義參數(shù)
http://localhost:8888/oauth/authorize?client_id=cms&redirect_uri=http://localhost:8084/callback&response_type=token&scope=read&state=123
第二步:授權(quán)通過(guò),會(huì)重定向到redirect_uri,access_token碼會(huì)作為它的參數(shù)
http://localhost:8084/callback#access_token=${accept_token}&token_type=bearer&state=123&expires_in=120
第三步:拿到acceptToken之后,就可以直接訪問(wèn)資源
http://localhost:8084/api/userinfo?access_token=${accept_token}
3、密碼模式
密碼模式中,用戶(hù)需要將賬戶(hù)和密碼提供給客戶(hù)端向認(rèn)證服務(wù)器申請(qǐng)令牌,所以該種模式需要用戶(hù)高度
信任客戶(hù)端。
從調(diào)接口方面,簡(jiǎn)單來(lái)說(shuō):
第一步:直接傳username,password獲取token
http://localhost:8888/oauth/token?client_id=cms&client_secret=secret&username=admin&password=123456&grant_type=password&scope=all
第二步:拿到acceptToken之后,就可以直接訪問(wèn)資源
http://localhost:8084/api/userinfo?access_token=${accept_token}
4、客戶(hù)端模式
客戶(hù)端模式適用于沒(méi)有前端的命令行應(yīng)用,即在命令行下請(qǐng)求令牌
從調(diào)接口方面,簡(jiǎn)單來(lái)說(shuō):
第一步:獲取token
http://localhost:8888/oauth/token?client_id=cms&client_secret=123&grant_type=client_credentials&scope=all
第二步:拿到acceptToken之后,就可以直接訪問(wèn)資源
http://localhost:8084/api/userinfo?access_token=${accept_token}
三、實(shí)戰(zhàn)
OAuth2在慧安蜂巢物聯(lián)網(wǎng)操作系統(tǒng)平臺(tái)中的應(yīng)用,采用的是讓用戶(hù)在系統(tǒng)管理員中自行配置的方式,目前系統(tǒng)適配Github,我們使用Github為案例。
1、Github配置OAuth2
(1)、登錄github賬號(hào),右上角個(gè)人中心選擇Settings -> develop Settings -> OAuth Apps -> New OAuthApp
(2)、Application name 自定義名稱(chēng);Home URL 項(xiàng)目地址;Authorization callback URL 回調(diào)地址,項(xiàng)目 ip+ /login/oauth2/code/;
點(diǎn)擊確定,如圖
(3)、選擇Generate a new client secret 創(chuàng)建密鑰,記錄ClientId和Client Secrests,保存。
2、慧安蜂巢配置OAuth2
(1)、登錄系統(tǒng)管理員賬戶(hù) ->系統(tǒng)配置 -> OAuth2 -> 啟動(dòng)OAuth2 -> 添加
協(xié)議按著部署的網(wǎng)絡(luò)協(xié)議選擇http還是https,重定向URL模板就是GitHub上配置得回調(diào)地址,供應(yīng)商選擇Github,用戶(hù)組端ID和用戶(hù)組機(jī)密為上一步github中得ClientId和Client Secrests,保存。
(2)、退出登錄,首頁(yè)就能看到使用Github登錄得入口啦,點(diǎn)擊使用Github登錄,輸入你的Github賬戶(hù)密碼即可登錄
四、總結(jié)
本文從理論、認(rèn)證流程出發(fā),對(duì)OAuth2進(jìn)行了相關(guān)講解,給大家?guī)?lái)初步得認(rèn)識(shí),并且給大家講解了授權(quán)碼模式、簡(jiǎn)化模式、密碼模式、客戶(hù)端模式,我們慧安蜂巢物聯(lián)網(wǎng)操作系統(tǒng)平臺(tái)的OAuth2就是基于授權(quán)碼模式進(jìn)行開(kāi)發(fā)的,并且實(shí)戰(zhàn)接入Github教大家如何使用慧安蜂巢物聯(lián)網(wǎng)操作系統(tǒng)平臺(tái)的OAuth2應(yīng)用。