Symfoware

Symfowareについての考察blog

apache2 mod_access_tokenをJavaから使用する

特定のディレクトリに時間制限付きのアクセス許可を与えるモジュール
mod_access_token

以前、Pythonでアクセスする方法を調べてみました。
apache2 mod_access_tokenをPythonから使用する

Javaで同様のことを行ってみます。



Apache Commons Codec



Base64エンコードは、Apache Commons Codecで行います。

Apache Commons Codec
こちらからバイナリをダウンロード。

commons-codec-1.10.jarをビルドパスに含めておきます。




サンプルコード



寄せ集めで不格好ですが、こんなコードになりました。


  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;
  3. import java.net.HttpURLConnection;
  4. import java.net.URL;
  5. import java.net.URLEncoder;
  6. import java.nio.charset.StandardCharsets;
  7. import javax.crypto.Mac;
  8. import javax.crypto.spec.SecretKeySpec;
  9. import org.apache.commons.codec.binary.Base64;
  10. public class MainProcess {
  11.     
  12.     private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1";
  13.     
  14.     public static void main(String... args) throws Exception {
  15.         
  16.         String uri = "/test/index.html";
  17.         String accesskey = "7864ffcb01fb5cde1f1c2f37b619fbcd";
  18.         String secret = "15cfb576a8bdc1551219fdeb3117ed85";
  19.         
  20.         // アクセス許可1時間
  21.         long expires = (System.currentTimeMillis() / 1000) + 3600;
  22.         String plaintext = "GET" + uri + expires + accesskey;
  23.         
  24.         // SHA1 HMAC暗号化準備
  25.         SecretKeySpec signingKey = new SecretKeySpec(secret.getBytes(), HMAC_SHA1_ALGORITHM);
  26.         Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
  27.         mac.init(signingKey);
  28.         // 暗号化実行
  29.         byte[] rawHmac = mac.doFinal(plaintext.getBytes());
  30.         // Base64エンコード実行
  31.         Base64 encoder = new Base64();
  32.         String signature = encoder.encodeToString(rawHmac);
  33.         
  34.         // 末尾の「=」を削る
  35.         signature = signature.substring(0, signature.length()-1);
  36.         
  37.         // 結果をURLエンコード
  38.         signature = URLEncoder.encode(signature, StandardCharsets.UTF_8.name());
  39.         
  40.         // リクエストのクエリー作成
  41.         String token_param = String.format("AccessKey=%s&Expires=%s&Signature=%s", accesskey, expires, signature);
  42.         
  43.         
  44.         // 作成したクエリーを用いて、ファイルのダウンロード実行
  45.         URL url = new URL("http://192.168.1.102" + uri + "?" + token_param);
  46.         HttpURLConnection connection = null;
  47.         connection = (HttpURLConnection) url.openConnection();
  48.         connection.setRequestMethod("GET");
  49.         if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
  50.             return;
  51.         }
  52.         
  53.         try (InputStreamReader isr = new InputStreamReader(
  54.                 connection.getInputStream(), StandardCharsets.UTF_8);
  55.                 BufferedReader reader = new BufferedReader(isr)) {
  56.             String line;
  57.             while ((line = reader.readLine()) != null) {
  58.                 System.out.println(line);
  59.             }
  60.         }
  61.         connection.disconnect();
  62.     }
  63.     
  64. }




実行してみると、ちゃんと認証を通過しファイルの内容が取得出来ました。



【参考URL】

HMAC-SHA1 署名を計算する Java サンプルコード

How to generate an HMAC in Java equivalent to a Python example?

JavaでのHttpClientサンプル
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/01/10(土) 17:56:07|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<PHPで画像リサイズ(ImageMagick, GD使用) | ホーム | Apache JMeterでmod_access_tokenの負荷テスト>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1577-f547a44e
この記事にトラックバックする(FC2ブログユーザー)