RareJob Tech Blog

レアジョブテクノロジーズのエンジニア・デザイナーによる技術ブログです

Android アプリのプロキシ設定について

はじめに

こんにちは、まもなくサッカーのヨーロッパ主要リーグが開幕するということでワクワクしながら過ごしている APP/UX チームの杉山です。
私は特定のチームのサポではありませんが、プレシーズンマッチで絶好調のアーセナルがリーグ戦でどこまでいけるか楽しみにしています。

今回は、Android アプリのプロキシ設定について書いていきます。

さっそくプロキシ設定

Wi-Fi にプロキシ設定を行う場合

  1. 設定アプリを開く
  2. Wi-Fi 項目を選択する
  3. 利用可能なネットワーク一覧からプロキシを設定したいネットワークの詳細設定を開く
  4. 詳細設定内のプロキシ項目を選択する
  5. 「手動」を選択し、ホスト名、ポートなどの必要情報を入力する

*設定アプリ内の表示内容は端末により異なる為、名称などが違う場合がございます。

アプリ内でプロキシ設定を行う場合

利用するライブラリ

  • okhttp3
  • okhttp-digest

実際にコードを書いていく

val builder = OkHttpClient.Builder()

try {
    val proxy = 
        Proxy(
            Proxy.Type.HTTP, 
            InetSocketAddress.createUnresolved([プロキシのホスト名], [プロキシのポート名])
        )
    builder.proxy(proxy)
} catch (e:Exception) {
    Log.e(TAG, [error message])
}

val credentials = 
    Credentials([ユーザーネーム], [パスワード])
val digestAuthenticator = 
    object: DigestAuthenticator(credentials) {}
digestAuthenticator.isProxy = true
builder.proxyAuthenticator(digestAuthenticator)

return builder.addInterceptor {
    val build = 
        it.request()
          .newBuilder()
          .addHeader([name], [value])
          .build()
    return@addInterceptor it.proceed(build)
}.build()

何をやっているか見ていく

プロキシ接続用のエントリを作成し、このクライアントによって作成された接続で使用される HTTP プロキシを設定

val proxy = 
    Proxy(
        Proxy.Type.HTTP, 
        InetSocketAddress.createUnresolved([プロキシのホスト名], [プロキシのポート名])
    )
builder.proxy(proxy)

Authenticator に Credential を設定

val credentials = 
    Credentials([ユーザーネーム], [パスワード])
val digestAuthenticator = 
    object: DigestAuthenticator(credentials) {}

Authenticator にプロキシであるかを設定

digestAuthenticator.isProxy = true

プロキシサーバーからのチャレンジに応答するために使用する Authenticator を設定

builder.proxyAuthenticator(digestAuthenticator)

Interceptor に登録し、OkHttpClient を返す

return builder.addInterceptor {
    val build = 
        it.request()
          .newBuilder()
          .addHeader([name], [value])
          .build()
    return@addInterceptor it.proceed(build)
}.build()

アプリで組み込む際に行うと便利なこと

会社などでアカウントが発行される場合、ユーザーネーム、パスワードが違うと思われるので、アプリ起動時に情報を入力させ保持しておくと良きです。
入力方式はどのようなものでも構いませんが、情報を保持していない時だけ表示されるカスタムダイアログなどにすると実装コストも減ります。

終わりに

リモートワークも増え、このような実装をする機会があるエンジニアの方に有益な情報であれば幸いです。
最後までご覧頂きありがとうございました。

We're hiring!

rarejob-tech.co.jp