Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取OAUTH2令牌_Java_Oauth 2.0_Jersey_Jax Rs - Fatal编程技术网

Java 获取OAUTH2令牌

Java 获取OAUTH2令牌,java,oauth-2.0,jersey,jax-rs,Java,Oauth 2.0,Jersey,Jax Rs,我正在尝试从我们的IDM服务器检索OAUTH2令牌——我尝试了几种基本示例,但它们都返回200状态,没有包含任何代码。我可以通过邮递员使用以下标题轻松完成: Content-Type application/x-www-form-urlencoded 。。。以及发送客户端id、重定向uri和代码参数。我得到的东西看起来像这样: { "access_token": "abcd...", "token_type": "bearer", "expires_in": 3600

我正在尝试从我们的IDM服务器检索OAUTH2令牌——我尝试了几种基本示例,但它们都返回200状态,没有包含任何代码。我可以通过邮递员使用以下标题轻松完成:

Content-Type application/x-www-form-urlencoded
。。。以及发送客户端id、重定向uri和代码参数。我得到的东西看起来像这样:

{
    "access_token": "abcd...",
    "token_type": "bearer",
    "expires_in": 3600
}
下面是一段超级基本代码,它只不过是想看看我是否可以在此时获取令牌:

public class Service {

public String getToken() {

    String client_id = "f2e8...";
    String redirect_uri = "https://mysite/";
    String code = "AAAAAA...";

    form = new Form();
    form.param("client_id", client_id);
    form.param("code", code);
    form.param("redirect_uri", redirect_uri);
    JerseyClientBuilder jerseyClientBuilder = new JerseyClientBuilder();
    JerseyWebTarget jerseyWebTarget = 
    jerseyClientBuilder.build().target("https://token-source-site/");
    Response response = jerseyWebTarget.request().post(Entity.form(form));
    return response.toString();
  }
}
但我得到的回报是:

InboundJaxrsResponse{context=ClientResponse{method=POST, 
uri=https://token-source-site/, status=200, reason=OK}}

有没有想过邮递员可能在做什么,而我的代码没有做什么?

当您只调用响应上的toString时,它不会显示在响应主体上。你需要通过调用ResponsereadEntity从中提取尸体

但是,即使尝试将其提取到字符串中,您仍然存在解析字符串的问题。最好的做法是为令牌响应创建一个POJO

public class AccessTokenResponse {
    @JsonProperty("access_token")
    private String accessToken;

    @JsonProperty("token_type")
    private String tokenType;

    @JsonProperty("expires_in")
    private long expiresIn;

    // getters and setters
}
那你就可以了

Response response = jerseyWebTarget.request().post(Entity.form(form));
return response.readEntity(AccessTokenResponse.class);
使方法返回AccessTokenResponse,以便客户端也可以访问其他属性

要使其工作,您需要具有Jackson提供者依赖项

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>${jersey.version}</version>
</dependency>

非常感谢,这很有意义。我要试一试!再次感谢@peeskillet,但我发现我得到了一个:MessageBodyReader not found for media type=text/html;当我执行以下操作时,charset=utf-8:Response-Response=jerseyWebTarget.request.postEntity.formform;return response.readEntityAccessTokenResponse.class;如您所述使用pojo,方法按照您的建议返回AccessTokenResponse。有什么想法吗?再次感谢。请发布整个堆栈跟踪。如果返回HTML,很可能服务器端出现错误。在尝试读取try实体之前,请检查状态代码