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

Java Restlet客户端使用身份验证密钥,java,restlet,Java,Restlet,使用restletjee2.3.2 我有一个与服务器restful API交互的客户机id和密码。提交该信息会使我返回一个授权密钥,该密钥必须用于后续请求。在curl中,我可以使用该键进行查询,并可以返回数据: curl -XGET "Authorization c79cec57-a52f-4e04-f3ca-55ea2a202114" "https://some/restful/endpoint" 如何设置客户端资源以提交该授权密钥?在线文档似乎没有涵盖这种情况。在这种情况下,我认为您可以使

使用restletjee2.3.2

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

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

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

在这种情况下,我认为您可以使用所述的质询响应,因为这种功能使用格式
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需要一个质询方案,该方案将添加在头
授权
值内的令牌(或其他内容)之前。请参阅从类
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 {
    (...)
您还可以根据需要实施自定义客户端资源,以便自动应用令牌:

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;
    }
}
希望它能帮助你,
Thierry

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

    ChallengeResponse cred = new ChallengeResponse(new ChallengeScheme("",""));
    cred.setRawValue("12345");
您可以使用“自定义”方案实现所需的功能,如下所示

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

我已经通过
resource.getRequest().getHeaders().add(“授权”,令牌);
添加了标题,但出现以下错误:2015年6月1日上午10:49:27 org.restlet.engine.header.HeaderUtils addExtensionHeaders警告:添加标准标题“授权”“这是不允许的。请在restletapi中使用等效属性。我还尝试了
ChallengeResponse cr=newchallengeresponse(ChallengeScheme.HTTP_OAUTH_BEARER);cr.setRawValue(令牌);资源。setChallengeResponse(cr)但出现以下错误:警告:Restlet引擎不支持质询方案HTTP_承载。是的,但使用OAuth承载,您将获得类似以下内容:
授权:承载mytoken
。。。即使您有消息(您不必将oauth扩展放在类路径中),头也会添加到请求中……我使用的是maven,除了org.restlet和各种表示扩展之外,我没有添加任何内容。调用resource.get()时,restlet引擎不支持的
HTTP_承载出现,在此之前,我看到服务器响应401“请求需要用户身份验证”,因此它似乎不喜欢格式,可能是身份验证中的“承载”字符串。。。我只需要一个代币。我做了一些测试,似乎在版本2.3.2中添加了限制。它只适用于2.3.1版。我将我的测试项目上传到github。请参阅此URL:。