Java 通过HttpURLConnection进行浏览器身份验证

Java 通过HttpURLConnection进行浏览器身份验证,java,http,authentication,Java,Http,Authentication,目前,我正在执行的。有一个方法叫做。我已经成功地实施了步骤1 步骤1:生成请求令牌 首先,对新的令牌方法进行API调用。这会回来的 有效期为60分钟的新请求令牌。请求 在此阶段,用户未授权令牌。请求令牌是 API特定于帐户,是应用程序与应用程序之间的纽带 步骤2中的用户 对于步骤1,我有以下代码: URL url = new URL("http://api.themoviedb.org/3/authentication/token/new?api_key=the_key"); HttpURLCo

目前,我正在执行的。有一个方法叫做。我已经成功地实施了步骤1

步骤1:生成请求令牌

首先,对新的令牌方法进行API调用。这会回来的 有效期为60分钟的新请求令牌。请求 在此阶段,用户未授权令牌。请求令牌是 API特定于帐户,是应用程序与应用程序之间的纽带 步骤2中的用户

对于步骤1,我有以下代码:

URL url = new URL("http://api.themoviedb.org/3/authentication/token/new?api_key=the_key");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringWriter writer = new StringWriter();
String line;
while ((line = reader.readLine()) != null) {
    writer.write(line);
}
reader.close();
Map<String, List<String>> headerFields = connection.getHeaderFields();
String callBackUrl = null;
for(Map.Entry<String, List<String>> entry : headerFields.entrySet()) {
    if(entry.getKey() != null && entry.getKey().equals("Authentication-Callback")) {
        callBackUrl = entry.getValue().get(0);
    }
}
但在控制台中,我得到:

null : [HTTP/1.1 404 Not Found]
Status : [404 Not Found]
X-Frame-Options : [sameorigin]
Date : [Tue, 28 Feb 2012 08:30:17 GMT]
Vary : [Accept-Encoding]
X-Cascade : [pass]
Content-Length : [7835]
X-XSS-Protection : [1; mode=block]
Set-Cookie : [tmdb.session=BAh7CUkiD3Nlc3Npb25faWQGOgZFRiJFNGRkMjc5ODYwMjJmYWYwZDlmOGE5%0AOTVjY2E0NWFjMzhhYTRiOGFjOGJiYjQ5ZGFhNzExNDdkMGM4MWNhZGUyMEki%0ADWxhbmd1YWdlBjsARkkiB2VuBjsARkkiC2xvY2FsZQY7AEZJIgd1cwY7AEZJ%0AIg5sb2dnZWRfaW4GOwBGRg%3D%3D%0A; path=/; expires=Thu, 29-Mar-2012 08:30:17 GMT; HttpOnly]
Content-Type : [text/html;charset=utf-8]
Connection : [keep-alive]
Server : [nginx]
如你所见:

Status : [404 Not Found]
因此,最后一个程序是没有成效的

我是否以错误的方式实现身份验证

我真的很感激你的建议


提前感谢。

我对TmDB不熟悉,但我已经阅读了关于其用户身份验证过程的页面,我认为您误解了它

他们明确表示,他们不希望第三方应用程序存储用户名/密码凭据,也不希望在请求中传递该凭据(“该系统的好处是,我们从不通过空中传送用户用户名或密码,也不要求第三方应用程序将其存储在本地”)。callbackUrl上的页面不是第三方应用程序应该发布的内容;这是供人使用的。用户看到此页面,询问“是否要授予对[第三方应用程序名称]的访问权限?如果是,请在此处登录”。您的应用程序无法控制该过程;它有意与您分开,以便您永远不会拦截或存储用户的凭据。一旦用户批准了您,您将能够获得一个不透明的令牌(会话ID),您可以使用它来代替凭据

这与三条腿的OAuth基本相同;主要的区别是OAuth需要一些额外的字段和签名计算,所以这更简单。但它与HTTP basicauth无关

我相信你想做的是:

  • 执行第一步,就像你正在做的一样。但不要仅仅抓住身份验证回调头;还要解析JSON响应并获取“request_token”的值

  • 检查用户是否已通过调用再次传递API密钥以及之前获取的“请求\令牌”来授权您。如果您获得一个带有“会话id”的成功响应,则您已经获得授权,可以跳过其余步骤

  • 否则,请将用户重定向到身份验证回调中指定的URL(如果您尚未在浏览器中,请打开浏览器)

  • 现在,由于登录/批准流程与应用程序是分开的,您如何知道它何时完成?文档对此并不清楚,也没有描述任何让你获得通知(或者让TMDb重定向回你的应用程序)的方法。您可能需要在合理的时间间隔内对结果进行投票(即,返回步骤2)


  • 只是为了保持信息的更新(现在还有api的v4):

    这些是带有身份验证步骤的链接

    v3

    v4

    Status : [404 Not Found]