2013-07-05 55 views
13

我是REST webservice的新手,剛剛創建了我的第一個webservice。
在我的服務中,用戶可以通過簡單的表單創建他的用戶名和密碼。如何使用基於REST webservice的基本HTTP身份驗證(Java + Jersey)?

現在如何檢查用戶憑據在用戶登錄時,在??
我的意思是我有一個簡單的形式驗證用戶登錄,但如何驗證用戶時,他是執行附加的各種協議操作/更新/刪除?

例如:
在FB您登錄並保存其中有您的憑據,當你執行像「發佈狀態」,消息的朋友...等操作......它並不要求一個cookie爲您的憑據了,因爲它有一個cookie在您的憑據在那裏,它僅僅使用該cookie ...

但在REST我們不使用Cookie,所以下一個選項是HTTP標頭。 ,我想知道如何通過HTTP頭.IE發送和收到用戶憑據
Basic HTTP Auth

+0

您需要對此有何反饋?如果不是,我的回答對你有幫助,你可以接受我的帖子來回答這個問題。 Greetz :) – benjiman

回答

29

客戶端

要發送憑據使用HTTP Authorization頭的API,指定憑據形式爲Basic username:password。用戶名:密碼字符串必須使用稱爲Base64的編碼方案進行編碼。因此,一個例子可以頭看起來像這樣:

Authorization: Basic d2lraTpwZWRpYQ== 

至於其餘的規範規定,在客戶端 - 服務器通信應該是無狀態的,你必須包括對每個請求的憑據頭。通常,您將在客戶端使用會話cookie來識別用戶,以便他不必在每個請求中輸入他的憑證。

服務器端

要檢查您的新澤西州的REST Service中的憑據,你需要捕捉和攔截所有傳入的請求。澤西島提供了一個名爲ContainerRequestFilters的概念來做到這一點。例如,如果你使用Tomcat,你可以在你的web.xml這樣添加你的servlet定義中這種類型的過濾器:

<init-param> 
    <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name> 
    <param-value>your.package.BasicAuthFilter</param-value> 
</init-param> 

引用的類BasicAuthFilter需要實現球衣ContainerRequestFilter接口和覆蓋public ContainerRequest filter(ContainerRequest request)方法。裏面的方法,你將基本做到以下幾點:

  • 從請求的Authorization頭
  • 解碼它們獲取的Base64編碼憑據(即使用javax.xml.bind.DatatypeConverter.parseBase64Binary()
  • 使用您的UserDAO(或其他數據源提供者)以檢查證書是否有效
  • 返回狀態代碼401 Unauthorized如果驗證失敗(即throw new WebApplicationException(Status.UNAUTHORIZED)
  • 如果憑據有效,僅僅是爲了將其委託給新澤西州的資源,是負責處理它

你可以找到this博客文章一個很好的例子返回請求。

+2

提供的鏈接中的示例僅適用於JERSEY 1.x。而且它不適用於2.X. – lonelyloner

+1

鏈接的博客文章包含一個指向Jersey 2.x示例的鏈接:https://simplapi.wordpress.com/2015/09/17/jersey-jax-rs-implements-a-http-basic-auth-decoder - 用於-2-X-分支/ – CalumMcCall