JAX-RSREST客戶端實現基本身份驗證機制

chszs發表於2015-07-02
版權宣告:本文為博主chszs的原創文章,未經博主允許不得轉載。 https://blog.csdn.net/chszs/article/details/46725551

《JAX-RS REST客戶端實現基本身份驗證機制》

作者:chszs,版權所有,未經同意,不得轉載。博主主頁:http://blog.csdn.net/chszs

很多SaaS API專案提供了HTTP訪問的基本身份驗證機制。因此,本文提供瞭如何在JAX-RS REST客戶端實現基本的訪問認證。有些HTTP客戶端庫提供了基本身份驗證過濾器,使用這些庫會更簡單。

1、基本的身份驗證機制

簡單來說,基本的身份驗證機制是在伺服器端實現的身份驗證機制,只需要客戶端提供使用者名稱和密碼即可,但是它對於HTTP報頭格式有一些特殊要求,如下所示:

基本身份驗證機制的HTTP Header格式

Authorization: Basic

“Authorization”是報頭的名字,它的值是這樣,比如”Basic YXBpOmtleS03Y2IzODY4ZWI5MmM2ZzFlZmY3NzY1YWExZDhmNmE0OQ==”。
在值中,Basic是關鍵字,它不能使用BASE64編碼,它緊跟空格,然後才是“使用者名稱+冒號+密碼”(即使用者名稱:密碼)的BASE64編碼後的字串。

2、Java 8之前的版本構建基本的身份驗證

在Java 8之前,要構建基本的身份驗證,可以使用javax.xml.bind.DatatypeConverter工具類。比如:

String username = "myusername";
String password = "myPassword";
String usernameAndPassword = username + ":" + password;
String authorizationHeaderName = "Authorization";
String authorizationHeaderValue = "Basic " + javax.xml.bind.DatatypeConverter.printBase64Binary( usernameAndPassword.getBytes() );

3、Java 8構建基本的身份驗證

Java 8要構建基本的身份驗證,可以使用java.util.Base64工具類。比如:

String username = "myusername";
String password = "myPassword";
String usernameAndPassword = username + ":" + password;
String authorizationHeaderName = "Authorization";
String authorizationHeaderValue = "Basic " + java.util.Base64.getEncoder().encodeToString( usernameAndPassword.getBytes() );

4、通過JAX-RS REST客戶端庫構建的身份驗證

要使用JAX-RS REST客戶端庫構建的身份驗證,可以這樣:

import static org.junit.Assert.*;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.MultivaluedHashMap;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;

import org.junit.Test;

public class BasicAuthenticationTest {

    @Test
    public void testBasicAuthentication() {
        //Define basic authentication credential values
        String username = "myusername";
        String password = "myPassword";

        String usernameAndPassword = username + ":" + password;
        String authorizationHeaderName = "Authorization";
        String authorizationHeaderValue = "Basic " + java.util.Base64.getEncoder().encodeToString( usernameAndPassword.getBytes() );

        // Build the form for a post request
        MultivaluedMap< String, String> formParameters = new MultivaluedHashMap();
        formParameters.add( "field1", "fieldValue1" );
        formParameters.add( "field2", "fieldValue2" );

        // Perform a post request
        String restResource = "https://restserver:8080/app-name/rest-api/";
        Client client = ClientBuilder.newClient();
        Response res = client.target( restResource )
            .path( "login" ) // API Module Path
            .request( "application/json" ) // Expected response mime type
            .header( authorizationHeaderName, authorizationHeaderValue ) // The basic authentication header goes here
            .post( Entity.form( formParameters ) );     // Perform a post with the form values

        assertTrue( res.getStatus() == 200 );
    }
}

5、總結

  1. 對於JDK 6以上版本,可以使用javax.xml.bind.DatatypeConverter類的printBase64Binary(byte[])靜態方法把位元組陣列編碼成BASE64的字串。
  2. Java 8則提供了java.util.Base64類,專用於處理Basic、URL、檔名和MIME等的編解碼。


相關文章