[英]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.