【问题标题】:change in response code compared between java client and browser clientjava客户端和浏览器客户端之间响应代码的变化
【发布时间】:2016-05-27 03:56:27
【问题描述】:

我正在尝试通过 java 代码访问一个用于商业 oAuth v2.0 的驱动器。 A/c 由一个驱动器 apiauthenticatoin 给出的规范:https://dev.onedrive.com/auth/aad_oauth.htm, 在 azure ad 中注册应用程序后,我们需要获取授权码才能访问 onedrive 进行业务。

所以我已经在 Advanced Rest Client(Chrome 扩展程序)中尝试过,并成功地在重定向 uri 中获取了身份验证代码(预期响应代码为 302)。

但是,当我尝试使用 httpclient/URLConnection/httpURLConection/default httpURLConnection/jsoup 在 java 中实现它时,我得到的响应代码是 200 OK,我找不到标题字段“Location”(我们在其中可以得到授权码和重定向 uri)。

为了使 java 客户端中的响应与 ARC 中的响应一样准确,是否应进行任何特定更改??

java 方法会丢弃这些元素吗?

【问题讨论】:

    标签: java http azure redirect oauth-2.0


    【解决方案1】:

    根据我的理解,您希望请求一个 URL,而不像浏览器那样自动重定向。

    据我所知,如果没有将ClientPNames.HANDLE_REDIRECTS='http.protocol.handle-redirects' 设置为布尔值,Apache HttpClient 将使用响应代码 30x 执行以下重定向,请参阅文档http://hc.apache.org/httpcomponents-client-4.2.x/tutorial/html/httpagent.html#d5e1169

    ClientPNames.HANDLE_REDIRECTS='http.protocol.handle-redirects':定义是否应自动处理重定向。此参数需要 java.lang.Boolean 类型的值。如果未设置此参数,HttpClient 将自动处理重定向。

    但是,我认为URLConnectionHTTPURLConnectionHttpsURLConnection 不会自动重定向,即使是它们实现的jsoup

    这里有一些代码展示了如何防止自动重定向并提取标题。

    1.使用HttpClient

    HttpClient client = new DefaultHttpClient();
    client.getParams().setParameter(ClientPNames.HANDLE_REDIRECTS, false);
    HttpGet request = new HttpGet("<URL>");
    HttpResponse response = client.execute(request);
    
    //get all headers       
    Header[] headers = response.getAllHeaders();
    for (Header header : headers) {
        System.out.println("Key : " + header.getName() + " ,Value : " + header.getValue());
    }
    

    2.使用HttpURLConnection

    URL url = new URL("<URL>");
    URLConnection conn = url.openConnection();
    
    //get all headers
    Map<String, List<String>> map = conn.getHeaderFields();
    for (Map.Entry<String, List<String>> entry : map.entrySet()) {
        System.out.println("Key : " + entry.getKey() + " ,Value : " + entry.getValue());
    }
    

    希望对您有所帮助。最好的问候。

    【讨论】:

    • 嗨,我真的明白了。在使用 ARC 时,我已经登录了浏览器,所以我得到了验证码作为响应,但是通过 java 客户端,我不能像在浏览器中那样做。您对通过 java 应用程序(非用户同意应用程序)授权 OneDrive for Business 有什么建议。我也尝试过使用 Deamon 应用程序,但也没有任何运气。我通过 oAuth 2.0 的客户端凭据流直接获得了访问令牌,但它在使用访问令牌时提供了 unsupported app only token
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    相关资源
    最近更新 更多