AndroidのAPKファイルをBasic認証掛けて公開する

By | 2013/09/04

こんちには、こんばんわ、こまんたれぶー。中川です。

IPアドレス的に不特定多数の人にAPKをテストプレイしてもらいたいときに、どこかの公開サーバ上にAPKをおいておいてテストプレイヤーにメールか何かでAPKのURLをおくってダウンロードしてもらう。っていうのはよくある話しだと思います。

で、そのときに「やっぱり誰でも彼でも節操無くアクセス可能」っていうのは怖いじゃないですか。そういう時はこれ。Basic認証ですよね?

そう。Basic認証。.htaccessとかで

<FilesMatch “^.*\.apk$”>
AuthUserFile authuserfile
AuthGroupFile /dev/null
AuthName “apk”
AuthType Basic
require valid-user
</FilesMatch>

こんなことしますよね?そして、http://example.com/chou_omoshiro.apkとかのURLを叩いてもらうわけです。これで認証ダイアログが出てきてDLが始まって万事OK!…とはならないんです。Androidの標準ブラウザからアクセスする場合。

ちょっと詳細はリンクはらせていただきます。

Androidでapkファイルのダウンロードに失敗する原因

ググってみると、どうやらWebブラウザとダウンローダが別プロセスだかになっていて、認証情報がブラウザからダウンローダへ渡されてないため、ダウンロードに失敗するとか。

長い前置きでしたが、結局どうしてみたか。色々考えて実験した末、PHPでCookieとRedirectを組み合わせて実現してみました。

PHPは2つです。

  • setcookie.php — Cookieの設定とRedirectを行うPHP
  • apkdown.php — CookieをチェックしてAPKをレスポンスするPHP

それぞれコードをさらしてみます。

setcookie.php

if(!isset($_SERVER['PHP_AUTH_USER'])) {
echo(‘do not set basic auth’);
}
else {
setcookie(‘name’, ‘value’, time() + 24 * 3600 * 7, ‘/’);
header(“Location: http://example.com/apkdown.php”);
exit;
}

setcookieの最後の’/'は無いとダメです。

apkdown.php

<?php
$cookie = $_COOKIE['name'];              // Cookie取得
$ret = $cookie===’value’ ? TRUE : FALSE;
if( $ret ) {
header(‘Content-Disposition: attachment; filename=”chou_iketeru.apk”‘);
header(‘Content-Type: application/vnd.android.package-archive’);
header(‘Content-Transfer-Encoding: binary’);
header(‘Content-Length: ‘.filesize(“chou_iketeru.apk”));
readfile(“chou_iketeru.apk”);
exit;
}
else {
echo “Cookie does not exists.\n”;
}

同じフォルダにchou_iketeru.apkがある想定です。

あと、.htaccessはこんなかんじ。

<FilesMatch “^.*\.apk$”>
deny from all
</FilesMatch>
<Files “apkdown.php”>
allow from all
</Files>
<Files “setcookie.php”>
AuthUserFile hogehoge
AuthGroupFile /dev/null
AuthName “apk”
AuthType Basic
require valid-user
</Files>

apkはアクセスできないように。apkdownはCookieによる認証任せで。setcookie.phpにBasic認証をかける。

 

Android端末あるあるですが。普通にAPKにBasic認証かけてもDLできるものは出来るみたいですね。とりあえずGalaxyNexusはできませんでした。

今回の仕組みはさっきつくったばかり(笑)なので、機種によっては動かないとかあるかもしれないですが、こういうやり方思いついたよ!ってことで公開してみます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です