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

Tap*_*ose 7 java authentication http

目前我正在研究TMDb API的实现.有一种称为用户身份验证的方法.我已成功实施了第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);
    }
}
Run Code Online (Sandbox Code Playgroud)

它在控制台中打印回调URL以及请求令牌(如果我将其转换writer.toString()为Json对象).

但第二部分是用户名和密码的用户身份验证.回调URL将用户重定向到TMDb的登录页面.我已经通过将回调网址从控制台复制粘贴到浏览器来测试它.

第2步说明:

第2步:从用户请求授权

获得有效的请求令牌后,您的应用程序需要打开Web浏览器并将其发送到TMDb.生成新令牌时的HTTP响应将包含可以轻松用于重定向的Authentication-Callback标头.

如果用户未登录到TMDb,则会在被要求授予您的应用程序使用其帐户的权限之前将其重定向到登录页面.一旦用户授予您的应用程序使用其帐户的权限,此过程的基于浏览器的部分就结束了,您可以将它们返回到您的应用程序.

就像对新令牌的请求一样,批准的响应将包括Authentication-Callback标头,这也是将应用程序重定向回API并生成真实会话ID的便捷方式.

现在我的问题是:如果我有用户名和密码,我可以通过HttpURLConnection或任何其他方式验证该用户吗?

我试过这个:

url = new URL(callBackUrl);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");        
BASE64Encoder encoder = new BASE64Encoder();
String usernamepassword = "myusername" + ":" + "mypassword";
String encodedAuthorization = encoder.encode(usernamepassword.getBytes());
connection.setRequestProperty("Authorization", "Basic "+ encodedAuthorization);
headerFields = connection.getHeaderFields();

for(Map.Entry<String, List<String>> entry : headerFields.entrySet()) {
    System.out.println(entry.getKey() + " : " +entry.getValue());
}
Run Code Online (Sandbox Code Playgroud)

但在控制台我得到:

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]
Run Code Online (Sandbox Code Playgroud)

如你看到的:

Status : [404 Not Found]
Run Code Online (Sandbox Code Playgroud)

所以最后的程序并不富有成效.

我是以错误的方式实施身份验证吗?

我非常感谢你的建议.

提前致谢.

Eli*_*hop 4

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

他们特别表示,他们不希望第三方应用程序存储用户名/密码凭据,或在请求中传递它(“该系统的好处是,我们永远不会通过空气传递用户名或密码,也不会要求将其存储在本地的第 3 方应用程序”)。作为第三方应用程序,callbackUrl 处的页面不应该向其发布任何内容;它是供人类使用的。用户看到此页面,询问“您想授予[第三方应用程序名称]的访问权限吗?如果是,请在此处登录”。您的应用程序无法控制该过程;它故意与您分开,以便您永远无法拦截或存储用户的凭据。用户批准您后,您将能够获得您使用的不透明令牌(会话 ID),而不是凭据。

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

我相信你想做的是这样的:

  1. 执行步骤 1,就像您正在做的那样。但不要获取 Authentication-Callback 标头;还要获取 Authentication-Callback 标头。还解析 JSON 响应并获取“request_token”的值。

  2. 通过调用新的会话 API并再次传递您的 API 密钥以及之前获取的“request_token”,检查用户是否已经授权您。如果您收到带有“session_id”的成功响应,则表明您已获得授权,可以跳过其余步骤。

  3. 否则,将用户(如果尚未使用浏览器,则打开浏览器)重定向到 Authentication-Callback 中指定的 URL。

  4. 现在,由于登录/批准过程与您的应用程序是分开的,您如何知道它何时完成?该文档对此并不清楚,并且没有描述任何方式让您获得有关它的通知(或使 TMDb 重定向回您的应用程序)。您可能只需要以某个合理的时间间隔轮询结果(即返回步骤 2)。