1. 程式人生 > >Oauth2.0 用Spring-security-oauth2 非常簡單

Oauth2.0 用Spring-security-oauth2 非常簡單

上週,我想開發OAuth 2.0的一個例項。我檢查了Spring-security-Oauth2.0的樣例,OAuth 2提供商sparklr2和OAuth 2客戶端TONR 。我探索在網際網路上了一下,整理相關文件。編譯並運行了OAuth 2提供商sparklr2和OAuth 2客戶端TONR,並檢查所有的授權上。現在,我在這裡從實用的角度講解的OAuth 2.0的不同方面來理解Spring-security-Oauth2.0


這篇文章是試圖描述的OAuth 2.0以簡化的形式來幫助開發商和服務提供商實施的協議。

我將涵蓋以下主題在這篇文章中。

1 。實體
2 。建立應用程式
3 。授權, Grant-Type
                   a.

Web伺服器應用程式(Web Server)
                   b.
基於瀏覽器的應用程式(Web Client)
                   c.
手機應用程式(Mobile APP)
                   d.其它桌面應用程式
4 。訪問資源
5 。資源


OAuth2.0流程:


OAuth的伺服器:
這也被稱為OAuth的提供者。它的整體責任是驗證和授權的使用者/客戶端和管理令牌。

第三方應用:
第三方應用程式俗稱為客戶端,將嘗試獲得訪問使用者的帳戶。它需要從使用者獲得許可,才可以這樣做。這可能是一個基於Web伺服器的應用程式,基於瀏覽器的應用程式,桌面應用程式,手機/平板電腦應用程式或一些智慧裝置,如谷歌護目鏡和智慧電視。

資源伺服器:
俗稱為資源伺服器的API ,從其中的資料會被提取出來或送達。這可能是SOAP或REST的基礎服務提供商。

使用者:
使用者俗稱為資源擁有者,誰可以訪問訪問資源。

建立應用程式:

在您開始OAuth的過程中,您必須先註冊一個新的應用與服務/供應商。當註冊一個新的應用程式,你通常註冊基本資訊,如應用程式克林特ID ,祕密,授權發放,型別等,另外,你必須註冊一個重定向URI,用於將使用者重定向到Web伺服器,基於瀏覽器的,或移動應用程式。

重定向的URI :
該服務將只將使用者重定向到註冊的URI ,這有助於防止某些攻擊。任何HTTP重定向的URI必須與SSL安全保護,因此該服務將只重定向到的URI以“https ”開頭。
這可以防止從令牌在授權過程中被截獲。

客戶端ID和授權密碼:
註冊您的應用程式後,你將擁有你的客戶端ID和客戶端授權密碼該客戶端ID被認為是公共資訊,並用於建立登入網址,或包括在一個頁面上的Javascript原始碼。客戶端授權密碼必須保密。如果部署的應用程式不能保守授權密碼的機密,如JavaScript或本機應用程式,那麼這個授權密碼不被使用。

授權方式:

的OAuth 2的第一步驟是從使用者獲得授權。對於基於瀏覽器或移動應用程式,這通常是由顯示給使用者提供的服務的介面來實現的。

OAuth的2提供了不同的用例數批型別。定義的補助型別有:

 
一個Web伺服器上執行的應用程式授權碼
 
隱含的基於瀏覽器的或移動應用程式
 
密碼與使用者名稱和密碼登入
 
對於應用程式訪問客戶端憑據

Web伺服器應用程式
Web應用程式都寫在一個伺服器端語言和執行伺服器的應用程式的原始碼是不提供給公眾。

授權請求:

http://localhost:8080/oauth2/oauth/authorize?response_type=code&client_id=easylocate&scope=read&redirect_uri=http://localhost:8080/web

之後接受訪問。該頁面將被重定向到重定向URI的授權碼。

http://localhost:8080/web/?code=t7ol7D

現在是時候來交換授權碼來獲得訪問令牌。

http://localhost:8080/oauth2/oauth/token?grant_type=authorization_code&code=t7ol7D&redirect_uri=http://localhost:8080/web&client_id=easylocate&client_secret=secret

與訪問令牌的OAuth的伺服器回覆

 {
  
“ ACCESS_TOKEN ”:“ 372c3458 - 4067 - 4b0b - 8b77 - 7930f660d990 ”
  
“ token_type ” : “bearer” ,
  
“ refresh_token ” : “ ce23c924 - 3f28 - 456C - A112 - b5d02162f10c ”
  
“ expires_in ” : 37364 ,
  
“scope” : “read”
}

萬一錯了授權碼,的Oauth伺服器回覆的錯誤。

 {
  
“error” : “ invalid_grant ” ,
  
“ error_description ” : “無效的授權碼: t7olD ”
}

安全性:需要注意的是該服務應要求應用程式進行預註冊的重定向的URI 。否則將有一個錯配。

基於瀏覽器的應用程式和移動應用程式:
基於瀏覽器的應用程式在瀏覽器從網頁載入的原始碼之後執行完全。由於整個原始碼是提供給瀏覽器,他們不能保持其客戶端祕密的保密性,所以這個祕密是不是在這種情況下使用。

授權請求:

http://localhost:8080/oauth2/oauth/authorize?response_type=token&client_id=easylocate&redirect_uri=http://localhost:8080/web&scope=read

之後接受訪問。該頁面將被重定向到重定向URI與令牌。

http://localhost:8080/web/#access_token=372c3458-4067-4b0b-8b77-7930f660d990&token_type=bearer&expires_in=37026

就是這樣,沒有其他的步驟!在這一點上,一些JavaScript程式碼可以(在#後的部分)拉出訪問令牌的片段,並開始進行API請求。

如果出現錯誤,你反而會收到一條錯誤的URI片段,如:

http://localhost:8080/web/#error=invalid_scope&error_description=Invalid+scope%3A+rea&scope=read+write

基於密碼:
OAuth的2還提供了可用於令牌直接交換一個使用者名稱和密碼訪問密碼交付式。因為這顯然需要的應用程式來收集使用者的密碼,它應該只用於由服務自身建立的應用程式。例如,原生Twitter的應用程式可以使用這筆款項型移動或桌面應用程式登入。

使用密碼交付式,只是讓類似下面的POST請求。我現在用的捲曲工具來演示POST請求。您可以使用任何其餘客戶端。

捲曲-I -X POST -D “的client_id = easylocate & grant_type =密碼和使用者名稱admin和密碼=管理員& CLIENT_SECRET =祕密” http://localhost:8080/oauth2/oauth/token

伺服器將返回與令牌

{
  
“ ACCESS_TOKEN ”:“ 4e56e9ec - 2f8e - 46b4 - 88b1 - 5d06847909ad ” 
 “ token_type ” : “bearer” ,

“ refresh_token ”:“ 7e14c979 - 7039 - 49d0 - 9c5d - 854efe7f5b38 ”
  
“ expires_in ” : 36133 ,
  
“scope” : “read,write"
}

客戶端憑據基於:
基於客戶端credentals授權用於伺服器到伺服器應用程式的訪問。我只是表示使用捲曲工具的POST請求。

捲曲-I -X POST -D “的client_id = easylocate & grant_type = client_credentials & CLIENT_SECRET =祕密” http://localhost:8080/oauth2/oauth/token

伺服器會回來的訪問令牌
 {
  
“ ACCESS_TOKEN ”:“ 9cd23bef - ae56 - 46b0 - 82f5 - b9a8f78da569 ”
  
“ token_type ” : “bearer” ,
  
“ expires_in ” : 43199 ,
  “scope
” : “read”
}

訪問的資源:

一旦您通過驗證並獲得訪問令牌,可以提供訪問令牌來訪問受保護的資源。