読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

URLフェッチ機能でBasic認証を使う

Java Google App Engine

Google App EngineのURLフェッチ機能では、HttpURLConnectionが普通に使える訳ですが、Basic認証が必要なサイトにアクセスしたいと思って以下のように書いてデプロイしたら実行時エラーに

static {
    Authenticator.setDefault( new Authenticator(){
        @Override
        protected  PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication( USER, PASS.toCharArray() );
        }
    });
}

発生したエラーは次の通り。

Caused by: java.security.AccessControlException: access denied (java.net.NetPermission setDefaultAuthenticator)
	at java.security.AccessControlContext.checkPermission(Unknown Source)
	at java.security.AccessController.checkPermission(Unknown Source)

なるほど。まぁ、許可されないだろうな、常識的に考えて。

対策

ということで自前でAuthorizationヘッダを付与して対処。Base64エンコーダはApp Engineのライブラリにあったものを使用してみました。

import com.google.appengine.repackaged.com.google.common.util.Base64;
...
connection.addRequestProperty("Authorization",  "Basic " + encodeBase64( USER + ":" + PASS ));
...
String encodeBase64( String str ) {
    try {
        return Base64.encode( str.getBytes("UTF-8") );
    } catch (UnsupportedEncodingException e) {
        throw new RuntimeException(e); // 起こりえない
    }
}

これで無事目的のサイトにアクセスできることを確認。よしよし。