Oauth2.0 用Spring-security-oauth2


客戶端通過appId,redirectUrl,在open platform打開的頁面上填寫正確的用戶名和密碼后,open platform驗證通過后,會跳轉到redirectUrl,此時的redirectUrl上多個一個參數:request_code;

第三方應用 在后台 使用request_code,appId,appSecret,redirectUrl,獲取token,然后使用這個token消費ResourceServer提供的API,獲取想要的數據

 

什么是OAuth授權?

一、什么是OAuth協議
OAuth(開放授權)是一個開放標准,所謂OAuth(即Open Authorization,開放授權),它是為用戶資源授權提供了一種安全簡單的標准,
允許第三方網站在用戶授權的前提下訪問在用戶在服務商那里存儲的各種信息。
而這種授權無需將用戶提供用戶名和密碼提供給該第三方網站而是直接從服務商提供的頁面直接登錄。

OAuth允許用戶提供一個訪問標記(專業點叫做令牌)給第三方網站,一個訪問標記(專業點叫做令牌)對應一個特定的第三方網站,同時該訪問標記(專業點叫做令牌)只能在特定的時間內訪問特定的資源

說白了就是:也就是說用戶在訪問第三方web或應用的時候,第三方在不知道用戶的賬號和密碼的情況下 經過用戶授權后就可以獲取用戶在服務商哪里存儲的文章,微博信息等等信息

 

一、OAuth授權必須經過三個步驟

第一步:獲取未授權的Request Token (請求標記)  跳轉到服務商的登錄頁面

第二步:獲取用戶授權Request Token(請求標記) 用戶輸入賬號密碼進行登錄授權

第三步:用授權過的Request Token(請求標記)  換取Access Token (訪問標記)

以上三個步驟是OAuth授權的必須步驟 ,可能很多公司的授權方式各有不同,但是大致步驟是一樣的

 

下面以新浪微博為例子 介紹下如何進行OAuth授權:

1.首先你要成為新浪的開發者  點擊這里進入開發者網站:http://open.weibo.com

進入后注冊一個賬號 添加開發者個人信息 ,你可以直接用你的微博賬號登錄 然后加入開發者即可  詳細步驟這里不再贅述

 

2.創建應用  如何創建應用,直接點擊頂部導航欄的我的應用 即可 創建

*假設你創建的應用名稱加做 "程序源微博"

*應用創建完畢默認 就進入"開發階段" 就具備了授權資格

*這個時候點擊我的應用 --> 應用信息 你會看到如下的信息

App Key:917518064   應用的唯一標識

App Secret:b18853174e2902fd05b04dc34d7be792  密鑰

應用地址:https://itunes.apple.com/cn/genre/ios/id36?mt=8

這是時候我們還需要設置一個回調頁面,就是授權成功后跳轉的頁面  如何設置?

點擊編輯 然后輸入你要回調的頁面網址即可

2.有了上面的設置之后 我們就可以進行資源授權了 我們現在都是OAuth授權2.0

(1)首先第一步獲取未授權的Request Token  來到服務器的登錄界面

*新浪提供的頁面是這個頁面:https://api.weibo.com/oauth2/authorize

*必須要傳遞的兩個參數:

client_id (string類型)     申請應用時分配的AppKey // 得知道給哪個應用授權
redirect_uri (string類型)     授權回調地址 // 授權成功后跳轉到哪個頁面

也就是說我們要正確的來到服務器提供的授權登錄界面完整的url地址應該是這樣的:

https://api.weibo.com/oauth2/authorize?client_id=917518064&redirect_uri=http://www.cnblogs.com/syios

打開上面的地址你會看到如下界面:

此時我們輸入我們的微博賬號 這里也可以自己給自己授權也就是說你可以用戶剛剛創建應用的賬號 對你的應用進行授權

當我們點擊登錄后 ,這次授權就成功了,當然如果你是第一次授權可能看到不是上面的界面 而是授權界面 這個時候你點擊授權即可

登錄成功后回跳轉到回調頁面

(2)獲取授權過的Request Token 

授權成功后回自動跳轉到回調頁面

 

 

你會發現新浪會在回調頁面后面拼接一個參數 這個參數code 就是授權成功后的 Request Token (請求標記)

(3)根據授權過Request Token(請求標記) 獲取一個Access Token(訪問標記) 

這一步是第三方應用后台完成的

這個時候新浪提供了另外一個地址 用來獲取訪問標記

URL : https://api.weibo.com/oauth2/access_token

當然也必須要傳如下的參數 才能成功獲取訪問標記:

client_id          string     申請應用時分配的AppKey。
client_secret    string     申請應用時分配的AppSecret。
grant_type       string     請求的類型,填寫authorization_code
code                string     調用authorize獲得的code值。
redirect_uri      string     回調地址,需需與注冊應用里的回調地址一致

這個時候我們只需要將所有的參數通過POST方式發送給新浪服務器之后我們會得到服務器的返回數據 返回結果如下:

{
    "access_token" = "2.00vWf4GEUSKa7D739148f7608SXA9B";
    "expires_in" = 137596133;
    "remind_in" = 137596133;
    uid = 1258537523;
}

 

access_token: 就是我們需要的訪問標記 我們只需要獲取這個標記 保存即可

uid:表示當前登錄用戶的ID

這里需要大家明白一個知識點:

access_token : 1個用戶給1個應用授權成功后,就獲得對應的1個access_token,作用是:允許1個應用訪問1個用戶的數據
uid:1個用戶對應1個uid,每1個用戶都有自己唯一的uid
舉例:

張三 /李四
應用1 /應用2
張三給應用1、應用2授權成功了:1個uid、2個access_token
李四給應用2授權成功了:1個uid、1個access_token
上面操作:產生了2個uid,3個access_token

3.授權過程中的常見錯誤

1.invalid_request
1> 沒有傳遞必填的請求參數
2> 請求參數不對
3> URL中間留有空格

2.invalid_client
1> client_id的值傳遞錯誤(AppKey不對)

3.redirect_uri_mismatch
1> 回調地址不對

提醒:授權帳號注意  如果應用還沒有經過新浪審核,只能訪問自己或者其他15個測試帳號的微博數據

好了,關於OAuth授權 就說這么多了

http://www.cnblogs.com/syios/p/4762546.html

 

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 。資源

 

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:+rea&scope=read+write

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

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

curl   -I -X POST -D http://localhost:8080/oauth2/oauth/token?grant_type=password&code=t7ol7D&redirect_uri=http://localhost:8080/web&client_id=easylocate&client_secret=secret
服務器將返回與令牌

{
  “ 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請求。

curl   -I -X POST -D http://localhost:8080/oauth2/oauth/token?client_id = appId&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”
}

 

訪問的資源:

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

http://blog.csdn.net/u011537073/article/details/52108369

http://projects.spring.io/spring-security-oauth/docs/oauth2.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM