2013-07-01 160 views
17

如果我有一臺服務器,我使用用戶名/密碼進行身份驗證,併爲隨後的請求獲取身份驗證令牌,那麼解決此問題的最佳方法是什麼?使用Volley進行令牌驗證

流程應該是這樣的: - 啓動要求 - 如果我們沒有身份驗證令牌 - 用戶名和密碼 得到它 - 讓與請求的身份驗證令牌 - 如果請求失敗,因爲令牌過期,獲得新權威性與用戶名和密碼令牌 - 完成

我注意到,排球已經可能有一些可能解決這個問題 - - 身份驗證https://android.googlesource.com/platform/frameworks/support/+/4474bc11f64b2b274ca6db5a1e23e8c1d143d5fa/volley/src/com/android/volley/toolbox/Authenticator.java它包含getAuthToken()和invalidateAuthToken()方法,以新的身份驗證令牌 重試請求這正是我想要的。但它似乎從未在圖書館中使用過。

+0

我剛剛查看了源代碼,它看起來像你一樣 - 代碼中沒有使用Authenticator。所以可能你必須手動完成。 – negersiu

+0

是的。與此同時,我複製了BasicNetwork類並在那裏進行了調整,以便爲我執行身份驗證。 – MantasV

+2

你可以發佈你如何做它的答案,請 –

回答

11

我使用volley作爲使用longlive(LLT)和shortlive(SLT)令牌的認證系統。

我手動完成了,但一旦你完成了所有工作,它確實沒有太多的工作。

讓所有安全要求子類baseSecureRequest可以處理此令牌機制共同在其onResponse()和onErrorResponse()所有安全要求。

就顯得有點node.js的風格,在那裏請求發送其他請求,並等待回調。


的應用程序可能有十幾個畫面,只有一半需要身份驗證的訪問 - 所以每個屏幕應該是無知其請求的要求。

方案A

  • 我們試圖發送一個安全的請求。我們注意到我們在 內存中沒有SLT,因此請創建一個TokenRequest。
  • TokenRequest的onResponse()保存 該令牌內存(讓單會話管理器抓住它或 類似無所不在的類)
  • 現在回調到原來的 具體類的請求對象繼續與最新更新令牌。

方案B

  • 我們發送的安全要求,但我們的SLT是陳舊的(已過期)

  • 服務器返回錯誤代碼或味精,你可以在 趕上一般onErrorResponse()你的baseSecureRequest。

  • 在此onError()中,您發送一個refreshTokenRequest()對象, 嘗試通過使用LLT從服務器請求新的SLT來刷新內存中的SLT。

  • 的refreshTokenRequest的onResponse()現在可以回調到 原始請求重新發送。

  • 但是onErrorResponse()或許應該放棄整個事情,因爲機會是 任何不是一個連接錯誤 - 是由 無效LLT錯誤。如果你一直試圖刷新一個不好的LLT,你將永遠不會離開。
+9

@mjw ...你有這樣的代碼示例嗎? –

+4

我第二個這個議案,任何代碼? – CQM

+2

我同意。我們可以爲此得到一些示例代碼嗎? – HariKJ

1
  1. 您可能想要在Android中使用AccountManager API進行身份驗證和授權。您可以按照博客here
  2. 對於OAuth 2.0服務器端實現,您可以閱讀IETF草稿V2-31 here
  3. 爲了更好地理解OAuth 2.0,您可以閱讀Nitesh Kumarhere的博客。
  4. 對於服務器端執行的OAuth 2.0,您可以在Github上叉Apis Autherization Server回購。
  5. 更多的實施選項可以在OAuth 2.0的網站上找到here
+0

感謝您的迴應,但我的問題是專門針對Volley。這不是關於如何進行授權,但如何將其與Volley – MantasV

+0

集成AndroidAuthenticator似乎使用accountManager,但我不知道我們應該如何使用AndroidAuthenticator。 –

1

您是否看到此博客文章? https://smaspe.github.io/2013/06/06/volley-part2.html

演示一個簡單的方法來重寫請求對象以使用twitter令牌。

@Override 
    public Map<String, String> getHeaders() throws AuthFailureError { 
     Map<String, String> headers = new HashMap<String, String>(); 
     String auth = "Basic " 
       + Base64.encodeToString((TwitterValues.CONSUMER_KEY 
       + ":" + TwitterValues.CONSUMER_SECRET).getBytes(), 
         Base64.NO_WRAP); 
     headers.put("Authorization", auth); 
     return headers; 
    } 
+0

鏈接關閉。你有這樣的另一篇文章嗎? – davidbonachera

+1

@davidbonachera鏈接的博客最近被移動(並重新命名)我更新了鏈接。 – njzk2

+0

儘管這個鏈接可能回答這個問題,但最好在這裏包含答案的基本部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/18821940) –

-2

getToken()失敗。狀態BAD_AUTHENTICATION錯誤

我也面臨同樣的問題。

解決方案:檢查設備是否使用您的Google帳戶登錄。

+0

這應該是一個答案或一個新的問題? –

相關問題