APK下载失败如果在股票浏览器后面的密码保护网站

时间:2013-07-11 19:20:38

标签: android ruby-on-rails

我在使用rails的服务器上提供APK时遇到问题。如果下载链接放入/公开,我可以提供APK。但是,我想用密码保护它。如果我将文件移到需要HTTP身份验证的URL后面,那么它会立即在带有Download Unsuccessful的股票浏览器上失败。

如果我安装并运行firefox,firefox可以下载APK并正确安装。

任何人都知道如何使用Android的股票浏览器进行此操作?

我已将MIME Type添加到服务器:

Mime::Type.register "application/vnd.android.package-archive", :apk

我在HTTP身份验证后面尝试send_file:

send_file "android.apk", :type => 'application/vnd.android.package-archive'

来自/ public的成功HTTP标头:

~  curl -s -D- android.apk -o/dev/null
HTTP/1.1 200 OK
Server: nginx/1.4.1
Date: Thu, 11 Jul 2013 20:06:43 GMT
Content-Type: application/octet-stream
Content-Length: 38673086
Last-Modified: Thu, 11 Jul 2013 20:05:12 GMT
Connection: keep-alive
ETag: "51df0ff8-24e1abe"
Accept-Ranges: bytes

HTTP身份验证后面的HTTP头不成功:

~  curl -s -D- private/android.apk -o/dev/null      
HTTP/1.1 200 OK
Server: nginx/1.4.1
Date: Thu, 11 Jul 2013 20:11:53 GMT
Content-Type: application/octet-stream
Transfer-Encoding: chunked
Connection: keep-alive
Status: 200 OK
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-UA-Compatible: chrome=1 
Content-Disposition: attachment; filename="SironaVideoSurvey.apk"
Content-Transfer-Encoding: binary
Cache-Control: private
Set-Cookie: request_method=GET; path=/
X-Request-Id: 6b99f5e5-87f8-4f8c-816c-0034265b3991
X-Runtime: 0.016140

2 个答案:

答案 0 :(得分:5)

这看起来是Android中的一个(〜6岁!!)错误: https://code.google.com/p/android/issues/detail?id=1353

显然我们所能做的就是解决这个问题。互联网上还有其他可以自行找到的hacky解决方法,但我不建议将其中大部分作为一般解决方案。

或许尝试将文件扩展名更改为全部大写,如下所示: http://www.digiblog.de/2011/04/android-and-the-download-file-headers/

因此该行变为:

Content-Disposition: attachment; filename="SironaVideoSurvey.APK"

如果这不起作用,我建议您告诉您的客户使用其他非库存(非Chrome!)浏览器。 :/祝你好运。

答案 1 :(得分:0)

提供登录页面,而不是使用HTTP身份验证。

使用PHP和Apache2,您可以执行以下操作:

的.htaccess

Options -Indexes
RewriteEngine on

RewriteCond %{HTTP_COOKIE} PHPSESSID=(\w+)
RewriteCond /tmp/access-%1 -f
RewriteRule ^(.*)$ $1 [L]

RewriteCond %{REQUEST_URI} !=/login.php
RewriteRule ^(.*)$ /login.php?req=$1 [L]

您也可以将其放在Apache2的*.conf文件夹中的sites-enabled文件中。如果要使用.htaccess文件,请确保在Apache2 config中启用AllowOverride All,否则Apache2将忽略.htaccess个文件。

的login.php

<?php
$password = "supersecret"; //change this
?>
<!DOCTYPE html>
<html>

<head>
    <title>Site Login</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <style type="text/css">
        .incorrect {
            color: red;
        }
    </style>
</head>

<body>
    <?php
if (isset($_POST["password"]) && ($_POST["password"] == "$password")) {
    session_start();
    touch("/tmp/access-" . session_id());
    header("Location: /" . $_GET['req']);
} else {
    if (isset($_POST['password']) || $password == "") {
?>
   <p class="incorrect">
        <b>Incorrect Password</b>
        <br>Please enter the correct password
    </p>
    <?php
    } else {
?>
    <p>Please enter the password</p>
    <?php
    }
?>
    <form method="post">
        <p>
        <input name="password" type="password" size="25" maxlength="10">
        <input value="Login" type="submit">
        </p>
    </form>
    <?php
}
?>
</body>

</html>

策略是将每个请求重定向到登录页面,但来自经过身份验证的会话的请求除外。这包括下载,图像,CSS文件,JS文件等的请求。

通过使用文件名中具有会话ID的临时文件,将身份验证状态从PHP传送到Apache2(它没有任何数据,但它的存在表示经过身份验证的会话)。输入正确的密码后,PHP将创建该文件。然后,如果Apache2可以根据请求cookie中找到的会话ID检测到该文件存在,那么任何后续请求都将由Apache2正常提供

资产/ htaccess的

这有助于排除某些资源(如图像和CSS)要求身份验证,以便可以在登录页面上使用它们。我们假设它们位于assets文件夹中。只需使用以下内容创建assets/.htaccess

Options -Indexes
RewriteEngine off

备注

  1. 您可以针对其他脚本语言(如JSP或Ruby on Rails)或Web服务器(如Nginx)调整策略。请注意,Options -Indexes是可选的,但建议使用它,因为它会阻止目录列表。

  2. 默认情况下,会话在24分钟不活动后到期。这由session.gc_maxlifetime中的php.ini定义。可以使用PHP删除会话的临时文件来添加注销功能。

  3. 此示例是一个只有一个密码的简单登录页面。借助PHP的强大功能,您可以将其扩展为您可以想象的任何庞大的身份验证管理。无论是多用户还是用户名,用户档案的数据库存储,有限的访问控制,基于Web的用户管理等等。

  4. 是的,这适用于Android旧版浏览器上的下载,名为“浏览器”,其中HTTP身份验证失败。