2016-02-18 53 views
3

我使用的春天啓動的後臺和Android設備爲我係統的前端訪問令牌。 現在我面臨使用Spring-OAuth2來保護我的資源服務器的挑戰。
我有一些問題,我想與您討論:
我的知識+ this tutorial是說我應該使用OAuth2.0「密碼」授予類型爲我的移動應用程序獲取訪問令牌。官方spring tutorial for security給出了一個例子,如何獲得訪問令牌使用密碼交付式:客戶端密鑰+清爽的春天的oauth2

$ curl client:[email protected]alhost:8080/oauth/token -d grant_type=password -d username=user -d password=pwd 

而且這纔是我的第一個問題:是否有可能使用的密碼交付式不發送「客戶端,以獲得訪問令牌祕密「?
由於客戶端密鑰可以通過反編譯客戶端應用程序進行「反向工程」。無祕密獲取訪問令牌應該是可能的,因爲Facebook SDK for Android在移動應用中也不需要client_secret。
我想在這裏我有一點很難理解爲什麼clientID的+ clientSecret需要包括在上面的要求,因爲,因爲已經有用戶名+包括密碼,它應該有可能生成訪問令牌,那麼,這是否帶來下一級的安全性?這是否意味着以下(示例):我在我的Android客戶端中以Filip身份登錄,並且正在向服務器發送每個請求的訪問令牌A.然後,我以Filip身份登錄到Web客戶端,並嘗試使用訪問令牌A從Web客戶端訪問資源服務器,這是不可能的,因爲訪問令牌A僅針對Android客戶端發佈?

下一個問題是我怎麼能刷新獲得訪問令牌?
我正在嘗試使用下面的命令,但我得到「完全身份驗證是需要訪問此資源。」當我得到新的刷新令牌後,我可以使用刷新令牌再次刷新我的新訪問令牌嗎?

curl -v --data "grant_type=refresh_token&client_id=acme&client_secret=acmesecret&refresh_token=REFRESH_TOKEN" http://localhost:9999/uaa/oauth/token 

謝謝

回答

0

要OAuth 2.0規範允許所謂的公共客戶,即客戶端不驗證身份。因此,可以使用公共客戶端的資源所有者密碼憑證授權,即不需要發送客戶端密鑰的授權者。這意味着授權服務器不能對客戶端採取任何措施,因爲client_id不是祕密,並且也無法阻止惡意客戶端使用該授權類型或客戶端冒充對方。因此,以這種方式使用它是以降低安全性爲代價的,儘管有人可能會爭辯說,在您的情況下,無論如何都無法使用機密客戶端,因此沒有任何區別。

一般資源所有者密碼憑據補助是OAuth的反模式和只是針對移民的目的,因爲它違背了大部分的OAuth的目標本身。

訪問令牌在每個客戶端基礎上發出的。

刷新令牌請求看起來不錯,但該授權服務器可能需要代替設置CLIENT_ID/client_secret作爲參數後,考慮到你爲原來的訪問令牌請求相同的基本身份驗證。