【问题标题】:Getting the OAUTH2 Token获取 OAUTH2 令牌
【发布时间】:2018-02-01 10:40:10
【问题描述】:

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

Content-Type application/x-www-form-urlencoded

... 并发送 client_id、redirect_uri 和 code 参数。我得到了一些看起来像这样的东西:

{
    "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}}

对于 Postman 可能会做的我的代码没有做的事情有什么想法吗?

【问题讨论】:

    标签: java oauth-2.0 jersey jax-rs


    【解决方案1】:

    当您在Response 上调用toString() 时,它不会显示在响应正文中。您需要通过调用Response#readEntity 从中提取正文。

    但是即使尝试将其提取为字符串,您仍然需要解析字符串。最好的办法是为令牌响应创建一个 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,当我使用你所描述的 pojo 时,我得到了一个:Response response = jerseyWebTarget.request().post(Entity.form(form)); return response.readEntity(AccessTokenResponse.class);,该方法按照你的建议返回了一个 AccessTokenResponse .有什么想法吗?再次感谢。
    • 请发布整个堆栈跟踪。如果您要返回 HTML,则很可能是服务器端出现错误。在尝试读取尝试实体之前检查状态码
    猜你喜欢
    • 2016-10-13
    • 2017-04-04
    • 2012-06-29
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多