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

时间:2012-02-28 08:42:50

标签: java http authentication

目前我正致力于TMDb API的实施。有一种名为User Authentication的方法。我已成功实施了第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);
    }
}

它正在控制台中打印回调网址以及请求令牌(如果我将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());
}

但在控制台我得到了:

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]

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

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

我非常感谢你的建议。

提前致谢。

2 个答案:

答案 0 :(得分:3)

我不熟悉TmDB,但我已经在他们的用户身份验证过程中阅读了该页面,我认为您误解了它。

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

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

我相信你想要做的是:

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

  2. 通过调用new session API检查用户是否已授权您,再次传递API密钥以及之前获取的“request_token”。如果您使用“session_id”获得成功回复,则您已获得授权,您可以跳过其余步骤。

  3. 否则,将用户重定向(或打开浏览器,如果您还没有在浏览器中)到Authentication-Callback中指定的URL。

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

答案 1 :(得分:1)

只需保持信息更新(现在还有api的v4):

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

v3 https://developers.themoviedb.org/3/authentication/how-do-i-generate-a-session-id

v4 https://developers.themoviedb.org/4/auth/user-authorization-1

相关问题