Java 获取OAUTH2令牌
我正在尝试从我们的IDM服务器检索OAUTH2令牌——我尝试了几种基本示例,但它们都返回200状态,没有包含任何代码。我可以通过邮递员使用以下标题轻松完成: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
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实体之前,请检查状态代码