認証プロキシをFiddlerで超える

# はじめに
行く手を阻む認証プロキシを、Fiddlerで超えていきましょう。


## なぜ認証プロキシを超えなければならないのか

そこに認証プロキシがある限り、避けて通ることはできないのです。


## どんなときにFiddlerをつかうのか

使いたいアプリが認証プロキシに対応しているのなら、わざわざFiddlerを使う必要はありません。
例えば、IE等のWebブラウザなら必要に応じて認証用のダイアログを表示してくれるでしょう。また、プロキシ設定を変更可能なアプリ[^proxy]の大半は、認証情報を設定しておくことができます。

[^proxy]: ちょうどこのAdvent Calendarに関連する記事がありました → [proxy が存在するネットワークから、インターネット上の何かにアクセスする](https://qiita.com/GORO_Neko/items/d59c805ef27589cc4fce)


しかし、認証プロキシに対応していないアプリも数多存在します。
そんなときにFiddlerの出番です。


## なぜFiddlerなのか

Fiddlerは、Webを利用するエンジニア必携のツールなので。

認証プロキシをバイパスするためのツールは、Fiddler以外にも沢山あります。
むしろ、認証プロキシを超えることだけが目的であれば、わざわざ多機能なFiddlerを選択する必要はないでしょう。

しかし、前述のとおりFiddlerは**エンジニア必携のツール**なので、インストールされていて当然なのです。
万一、まだFiddlerがインストールされていないという場合は、すぐにインストールしましょう。


# Fiddlerで認証プロキシを超える設定

前置きが終わったところで、いよいよ認証プロキシを超える設定のご紹介です!!
…と、はりきって設定手順を書いていこうと思っていたのですが、以下の記事でとても詳しく説明されていました。
具体的な手順は以下を参照するとよいでしょう。

[認証プロキシ非対応アプリケーションを、認証プロキシ環境下で動かす方法](https://qiita.com/Nuits/items/1bd84b45b0b092527d8d)

手順を簡単にいうと、

1. 認証に必要な情報(文字列)を確認
1. FiddlerScriptを以下の様に編集
    1. HTTP Requestで(`OnBeforeRequest`関数)
    1. `Proxy-Authorization`ヘッダを付与する

ということになります。

サンプルコードも貼っておきましょう。

```js:CustomRules.js
static function OnBeforeRequest(oSession: Session) {
    // (既存のコード)
    // ......

    // Basic認証で「aladdin:opensesame」を送信
    oSession.oRequest["Proxy-Authorization"] = "Basic YWxhZGRpbjpvcGVuc2VzYW1l";
}
```

これだけで終わってしまうのも何なので、以下では少し補足をしていきたいと思います。


## FiddlerScript Editorについて

上記の記事では「FiddlerScript Editor」を別途インストールしていますが、この手順は不要です。Fiddler本体と一緒にインストールされるはずです。

## スクリプトファイルについて
スクリプトの編集方法は以下の3通りあります。

- [FiddlerScript]タブで編集
    - 上記記事で紹介されている方法です
- メニューの[Rules]-[Customize Rules...]でエディタを開いて編集
    - デフォルトでは、「FiddlerScript Editor」が開きます
- スクリプトファイル(JS)を直接編集
    - お好みのエディタで

いずれの方法でも、変更対象となるのは以下のファイルです。
 `%USERPROFILE%\Documents\Fiddler2\Scripts\CustomRules.js`

## `Proxy-Authorization`ヘッダとは

参照 → [Proxy-Authorization - HTTP | MDN](
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Proxy-Authorization)

大概の場合、認証方式はBasic認証だと思います。
なので、「`Basic `*username*`:`*password*」をBase64でエンコードした文字列が値になるでしょう。

## 文字列のエンコード方法
上記記事の手順のように、実際にブラウザから認証した際の情報から認証用の文字列を取得してもよいですが、FiddlerにはTextWizardというツールがついてるので、これを利用するとよいでしょう。

メニューの[Tools]-[TextWizard...]でTextWizardが開きます。
[Transform]が[To Base64]になっていることを確認してください。
![TextWizard.PNG](https://qiita-image-store.s3.amazonaws.com/0/81235/e00c05c5-6810-ed44-90ad-732b4ecc32d9.png)
[Transform]の選択肢をみればわかるように、このツールは様々な形式を変換できるステキなツールです。


## Fiddler自身を認証プロキシにする
メニューの[Rules]-[Require Proxy Authentication]をOnにすることで、Fiddler自身を認証プロキシにすることができます。
この機能は、自作のアプリやスクリプト等が認証プロキシに対応できているかを確認する際などに利用できます。

認証情報(`Proxy-Authorization`)が不正なRequestに対して、Fiddlerが以下のResponseを返してくれます。

```text:FiddlerからのResponse
HTTP/1.1 407 Proxy Auth Required
Connection: close
Proxy-Authenticate: Basic realm="FiddlerProxy (user: 1, pass: 1)"
Content-Type: text/html

<html><body>[Fiddler] Proxy Authentication Required.<BR>                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
```

ブラウザではこんな感じ。
![dialog.PNG](https://qiita-image-store.s3.amazonaws.com/0/81235/e80950ea-2cc2-a278-53fd-80bcd05b5e94.png)
Responseに記載されているとおり、usernameとpasswordは`1`で通れます。この値は変更できません(たぶん)。


# おわりに

最近は、ブラウザ搭載の開発者ツールが非常に充実しているのでFiddlerの出番は減ってきてはいます。
しかし、ブラウザ以外からのHTTP通信を覗きたいときやREST APIをバシバシ呼びたいときなど、まだまだFiddlerが活躍できる場面は沢山あります。

万一、まだFiddlerがインストールされていないという場合は、すぐにインストールしましょう。
そして、認証プロキシにハマらないように、**HTTP通信に失敗したら即Fiddlerを起動する**習慣をつけましょう。

では、よいお年を。