1.1 什么是OAuth協(xié)議
OAuth協(xié)議垮耳,是一種授權(quán)協(xié)議,不涉及具體的代碼,只是表示一種約定的流程和規(guī)范终佛。OAuth協(xié)議一般用于用戶決定是否把自己在某個服務(wù)商上面的資源(比如:用戶基本資料俊嗽、照片、視頻等)授權(quán)給第三方應(yīng)用訪問铃彰。此外绍豁,OAuth2.0協(xié)議是OAuth協(xié)議的升級版,現(xiàn)在已經(jīng)逐漸成為單點(diǎn)登錄(SSO)和用戶授權(quán)的標(biāo)準(zhǔn)豌研。
1.2 適用場景
用戶不再需要注冊大量賬號
用于單點(diǎn)登錄
用于分布式系統(tǒng)的權(quán)限控制
1.3授權(quán)設(shè)計(jì)簡單理解
門禁授權(quán)系統(tǒng)為例
第一步妹田,門禁系統(tǒng)的密碼輸入器下面,增加一個按鈕鹃共,叫做"獲取授權(quán)"鬼佣。快遞員需要首先按這個按鈕霜浴,去申請授權(quán)晶衷。
第二步,他按下按鈕以后阴孟,屋主(也就是我)的手機(jī)就會跳出對話框:有人正在要求授權(quán)晌纫。系統(tǒng)還會顯示該快遞員的姓名、工號和所屬的快遞公司永丝。
我確認(rèn)請求屬實(shí)锹漱,就點(diǎn)擊按鈕,告訴門禁系統(tǒng)慕嚷,我同意給予他進(jìn)入小區(qū)的授權(quán)哥牍。
第三步,門禁系統(tǒng)得到我的確認(rèn)以后喝检,向快遞員顯示一個進(jìn)入小區(qū)的令牌(access token)嗅辣。令牌就是類似密碼的一串?dāng)?shù)字,只在短期內(nèi)(比如七天)有效挠说。
第四步澡谭,快遞員向門禁系統(tǒng)輸入令牌,進(jìn)入小區(qū)损俭。
2.1 運(yùn)行流程
(A)用戶打開客戶端以后蛙奖,客戶端要求用戶給予授權(quán)。
(B)用戶同意給予客戶端授權(quán)撩炊。
(C)客戶端使用上一步獲得的授權(quán)外永,向認(rèn)證服務(wù)器申請令牌。
(D)認(rèn)證服務(wù)器對客戶端進(jìn)行認(rèn)證以后拧咳,確認(rèn)無誤伯顶,同意發(fā)放令牌。
(E)客戶端使用令牌,向資源服務(wù)器申請獲取資源祭衩。
(F)資源服務(wù)器確認(rèn)令牌無誤灶体,同意向客戶端開放資源。
2.2 四種授權(quán)模式
2.2.1 授權(quán)碼模式
(1)用戶訪問客戶端掐暮,后者將前者導(dǎo)向認(rèn)證服務(wù)器蝎抽,假設(shè)用戶給予授權(quán),認(rèn)證服務(wù)器將用戶導(dǎo)向客戶端事先指定的"重定向URI"(redirection URI)路克,同時附上一個授權(quán)碼樟结。
(2)客戶端收到授權(quán)碼,附上早先的"重定向URI"精算,向認(rèn)證服務(wù)器申請令牌:GET /oauth/token?response_type=code&client_id=test&redirect_uri=重定向頁面鏈接瓢宦。請求成功返回code授權(quán)碼,一般有效時間是10分鐘灰羽。
(3)認(rèn)證服務(wù)器核對了授權(quán)碼和重定向URI驮履,確認(rèn)無誤后,向客戶端發(fā)送訪問令牌(access token)和更新令牌(refresh token)廉嚼。POST /oauth/token?response_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=重定向頁面鏈接玫镐。請求成功返回access Token和refresh Token。
2.2.2 簡化模式
適用于公開的瀏覽器單頁應(yīng)用
Access Token直接從授權(quán)服務(wù)器返回(只有前端渠道)
不支持refresh tokens
假定資源所有者和公開客戶應(yīng)用在同一個設(shè)備上
最容易受安全攻擊
2.2.3用戶名密碼 Resource Owner Credentials
使用用戶名密碼登錄的應(yīng)用怠噪,例如桌面App
使用用戶名/密碼作為授權(quán)方式從授權(quán)服務(wù)器上獲取access token
一般不支持refresh token
假定資源擁有者和公開客戶子啊相同設(shè)備上
2.2.4 客戶端憑證 Client Credentials
適用于服務(wù)器見通信場景恐似,機(jī)密客戶代表它自己或者一個用戶
只有后端渠道,使用客戶憑證獲取一個access token
因?yàn)榭蛻魬{證可以使用對稱或者非對稱加密傍念,該方式支持共享密碼或者證書