目次
Digest認証とは
比較対象としてBasic認証がありますが、Digest認証はIDとパスワードをMD5で暗号化しているため、Basic認証よりもセキュリティ面で優れています。しかし、後発のためすべての環境に対応しておらず、特定多数のユーザー向けのサイトはBasic認証が使われています。自分が参画した案件では、特定のクライアント向けであったため、Digest認証が採用されていました。
ライブラリ
Digest認証の採用例が少ないせいか良さげなライブラリがないです。Nugetで調べてもバックエンド用のライブラリが多くクライアント用で唯一使えそうなのがRestSharp向けのRestSharp.Authenticators.Digestライブラリぐらいでした。
https://github.com/Alterdata/RestSharp.Authenticators.Digest
RestSharp.Authenticators.Digestライブラリについて
使い方は以下の通り。まるでBasic認証と同じように開発できる。
var client = new RestClient(baseUrl){
Authenticator = new DigestAuthenticator(username, password),
}
注意して欲しいのは、通信失敗に関するExceptionはDigestAuthenticatorクラスをインスタンスした段階で発生する事。
どういう事かというとDigest認証はサーバからnonceパラメータ(一回限りのランダムな文字列)を受け取ってから、その文字列でユーザー名とパスワードを暗号化してから送信する仕様のため。
つまり、そのランダムな文字列を受け取る通信処理がDigestAuthenticatorをインスタンスで発生しています。
上記のこともあって、Digest認証の仕様を理解しないま上記のコードを開発し、サーバ側のログを見て認証に成功しているか確認しようとすると、なぜか2回通信が発生しているので混乱します。また、Digest認証は1回目のステータスコードをUnauthorizedステータスで返すので、あれ?認証失敗してる?と勘違い。
ライブラリを使えば1行ほどでDIgest認証が作れますが、Digest認証の技術仕様は調べておくほうが良さげです。
さいごに
RestSharpはレガシーなHttpWebRequestクラスを使用しているので、Microsoft.Extensions.HttpライブラリでDigest認証をするためにHttpClientで作り直そうと思いました。が、面倒になったので途中で放棄しました。やるとすれば、RestSharpの下記クラスを参考にしながら作り直すのが良さそうです。
https://github.com/Alterdata/RestSharp.Authenticators.Digest/tree/master/src/DigestAuthenticator
あと、Core3.1じゃなくて.NET5で作るのが良さそうです。PostやらPutなどのHttpメソッドを示す列挙体はNET5にのHttpMethodというクラスがあるので、多少コード量を削減できるはずです。