我在使用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
答案 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,您可以执行以下操作:
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
个文件。
<?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正常提供。
这有助于排除某些资源(如图像和CSS)要求身份验证,以便可以在登录页面上使用它们。我们假设它们位于assets
文件夹中。只需使用以下内容创建assets/.htaccess
。
Options -Indexes
RewriteEngine off
您可以针对其他脚本语言(如JSP或Ruby on Rails)或Web服务器(如Nginx)调整策略。请注意,Options -Indexes
是可选的,但建议使用它,因为它会阻止目录列表。
默认情况下,会话在24分钟不活动后到期。这由session.gc_maxlifetime
中的php.ini
定义。可以使用PHP删除会话的临时文件来添加注销功能。
此示例是一个只有一个密码的简单登录页面。借助PHP的强大功能,您可以将其扩展为您可以想象的任何庞大的身份验证管理。无论是多用户还是用户名,用户档案的数据库存储,有限的访问控制,基于Web的用户管理等等。
是的,这适用于Android旧版浏览器上的下载,名为“浏览器”,其中HTTP身份验证失败。