Restlet客户端使用身份验证密钥

时间:2015-06-01 14:38:39

标签: java restlet

使用restlet JEE 2.3.2。

我有一个客户端ID和秘密与服务器restful API交互。提交该信息会返回一个必须用于后续请求的授权密钥。在卷曲中,我可以使用该密钥进行查询并可以获取数据:

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

如何设置客户端资源以提交该授权密钥?在线文档似乎并不能涵盖这种情况。

2 个答案:

答案 0 :(得分:1)

如果方案不重要,可以使用“自定义”方案(因为它在HTTP规范中是必需的)。为了避免警告“重定向引擎不支持方案”,只需注册一个,如下:

您可以使用“自定义”方案实现所需目标,如下所示。

    // 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");

答案 1 :(得分:0)

在这种情况下,我认为您可以使用质询响应,因为此功能使用格式Authorization构建Authorization: Scheme ChallengeResponseContent标头:

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,如下所述:

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;
    }
}

希望它可以帮到你, 亨利