簡體   English   中英

Restlet客戶端使用身份驗證密鑰

[英]Restlet client use authentication key

使用restlet JEE 2.3.2。

我有一個客戶端ID和與服務器Restful API交互的秘密。 提交該信息后,我將獲得必須用於后續請求的授權密鑰。 在curl中,我可以使用該鍵進行查詢並獲取數據:

curl -XGET "Authorization c79cec57-a52f-4e04-f3ca-55ea2a202114" "https://some/restful/endpoint"

如何設置我的客戶資源以提交該授權密鑰? 在線文檔似乎沒有涵蓋這種情況。

如果該方案不重要,則可以使用“自定義”方案(因為它在HTTP規范中是必需的)。為避免警告“ restlet引擎不支持該方案”,只需注冊一個,如下所示:

您可以使用“自定義”方案來實現所需的目標,如下所示。

    // Declare a custom Authenticator helper, if it is not standard
    Engine.getInstance().getRegisteredAuthenticators().add(new AuthenticatorHelper(ChallengeScheme.CUSTOM, true, false) {});

    // set up the reusable challenge response
    ChallengeResponse cred = new ChallengeResponse(ChallengeScheme.CUSTOM);
    cred.setRawValue("12344");

    ClientResource cr = new ClientResource("http://localhost:8183/");
    cr.setChallengeResponse(cred);
    cr.get();

如果您想要一個空方案,可以執行以下操作:

    ChallengeResponse cred = new ChallengeResponse(new ChallengeScheme("",""));
    cred.setRawValue("12345");

在這種情況下,我認為您可以使用描述的質詢響應,因為該功能使用格式Authorization: Scheme ChallengeResponseContent來構建Authorization標頭:

ClientResource resource = new ClientResource(resouceURL);
String token = "myToken";
ChallengeResponse cr = new ChallengeResponse(
             ChallengeScheme.HTTP_OAUTH_BEARER);
cr.setRawValue(token);
resource.setChallengeResponse(cr);
(...)

實際上,Restlet需要一個挑戰方案,該挑戰方案將在標頭Authorization值內的令牌(或其他事物)之前添加。 請參見類AuthenticatorUtils#formatRequest摘錄:

public static String formatRequest(ChallengeRequest challenge,
        Response response, Series<Header> httpHeaders) {
    String result = null;

    if (challenge == null) {
        Context.getCurrentLogger().warning(
                "No challenge response to format.");
    } else if (challenge.getScheme() == null) {
        Context.getCurrentLogger().warning(
                "A challenge response must have a scheme defined.");
    } else if (challenge.getScheme().getTechnicalName() == null) {
        Context.getCurrentLogger().warning(
                "A challenge scheme must have a technical name defined.");
    } else {
        ChallengeWriter cw = new ChallengeWriter();
        cw.append(challenge.getScheme().getTechnicalName()).appendSpace();
        int cwInitialLength = cw.getBuffer().length();

        if (challenge.getRawValue() != null) {
            cw.append(challenge.getRawValue());
        } else {
    (...)

在您的情況下,我認為您需要按如下所述Authorization構建標題Authorization

ClientResource resource = new ClientResource(resouceURL);
String token = "myToken";
resource.getRequest().getHeaders().add("Authorization", token);
resource.get();

您還可以根據需要實現自定義客戶端資源,以便自動應用令牌:

public class ProtectedClientResource extends ClientResource {
    private String token;

    public ProtectedClientResource(String uri) {
        super(uri);
    }

    @Override
    public Response handleOutbound(Request request) {
        if (token!=null) {
            request.getHeaders().add("Authorization", token);
        }
        return super.handleOutbound(request);
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }
}

希望對您有幫助,蒂埃里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM