質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HTTPヘッダー

Hypertext Transfer Protocol(HTTP)の中のHTTPヘッダフィールドはHTTPの要求やレスポンスの機能しているパラメーターが含まれます。その要求もしくはレスポンスライン(メッセージの最初の一行)でメッセージヘッダを作ります。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

775閲覧

Alamofireでdigest認証について

komasannkomatta

総合スコア28

HTTPヘッダー

Hypertext Transfer Protocol(HTTP)の中のHTTPヘッダフィールドはHTTPの要求やレスポンスの機能しているパラメーターが含まれます。その要求もしくはレスポンスライン(メッセージの最初の一行)でメッセージヘッダを作ります。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2018/10/04 09:18

Alamofireでdigest認証を行っています。
以下の様に、authenticateにてユーザ、とパスワードを指定し、ダイジェスト認証が必要なサイトに接続。
その時の通信内容をワイヤーシャークで確認すると、リクエストが2回行われ、1回目は401となり、その際にダイジェスト認証に必要なランダム文字列が返され、それを受けて2回目のリクエストが行われたのち200となり認証成功となっています。

Alamofireでのリクエストを行うコードは、1度しか記述していませんが、内部で上記内容の様に2回リクエストが発生しているのは、Alamofireが内部で、処理を行ってくれているからなのでしょうか?
もしそうであるなら、どの箇所で行っているか分かりませんでしょうか?
(pod内のAlamofireのswiftファイルを探しましたが、受け取ったランダム文字列をハッシュするなどの箇所が見つけられません)
2回目に渡している認証情報を編集したいのですが、方法がわかりません。

編集したい理由ですが、ダイジェスト認証を行っているサイトが、認証ロジックを更新し、下記の方法では認証できなくなってしまいたした。
問い合わせたところ、認証情報内のalgorithm="MD5"となっているところのダブルクォーテーションを削除しないといけないと言われた為です。

Alamofire.request(url, method: .post, parameters: parameters, headers: headers)
.authenticate(user: user_id, password: password)
.responseString { (response) in
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

なかなか興味深い質問で、わたしなりに調べてみました。ただ、専門家ではないので、間違っている可能性は十分にありますので、その点考慮して読んでいただければと思います。

前置き

まず、algorithm="MD5"で、ダブルクォーテーションで囲むことが間違いなのかですが、以下のリンクを見ると、どうも間違いじゃないように思えます。。

HTTP Digest 認証の SHA-256 の扱い(2015年の記事なのでちょっと古いですが)
rfc7616(これも2015年のもの)
ただ、3.9 Examplesをみると、囲まれていないのですが、html header rfc7235
をみると、どちらでも良い様に読めます(間違いかもしれませんが)

ABNF

1Authorization = credentials 2credentials = auth-scheme [ 1*SP ( token68 / #auth-param ) ] 3auth-scheme = token 4auth-param = token BWS "=" BWS ( token / quoted-string )

curlでの確認

よく分からない場合、別の実装で確認すると様子がわかったりするので、よく利用されているcurlを利用してみました。Authorizationヘッダをみると、algorithm="MD5"なっていました。

bash

1$ cat /etc/centos-release 2CentOS Linux release 7.2.1511 (Core) 3$ curl --version 4curl 7.29.0 (x86_64-redhat-linux-gnu) libcurl/7.29.0 NSS/3.19.1 Basic ECC zlib/1.2.7 libidn/1.28 libssh2/1.4.3 5Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp 6Features: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz

bash

1curl -v -k --digest -u admin:pass https://localhost/digest/ 2* About to connect() to localhost port 443 (#0) 3* Trying ::1... 4* 接続を拒否されました 5* Trying 127.0.0.1... 6* Connected to localhost (127.0.0.1) port 443 (#0) 7* Initializing NSS with certpath: sql:/etc/pki/nssdb 8* skipping SSL peer certificate verification 9* SSL connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 10* Server certificate: 11* subject: CN=localhost 12* start date: 1010 17:39:08 2018 GMT 13* expire date: 1月 08 17:39:08 2019 GMT 14* common name: localhost 15* issuer: CN=Let's Encrypt Authority X3,O=Let's Encrypt,C=US 16* Server auth using Digest with user 'admin' 17> GET /digest/ HTTP/1.1 18> User-Agent: curl/7.29.0 19> Host: localhost 20> Accept: */* 21> 22< HTTP/1.1 401 Unauthorized 23< Server: nginx 24< Date: Fri, 12 Oct 2018 07:37:01 GMT 25< Content-Type: text/html; charset=iso-8859-1 26< Content-Length: 381 27< Connection: keep-alive 28< WWW-Authenticate: Digest realm="private Web", nonce="oI4tJwN4BQA=6f7eda4711047e2454eb8ad78f77c87ea309f079", algorithm=MD5, qop="auth" 29< 30* Ignoring the response-body 31* Connection #0 to host localhost left intact 32* Issue another request to this URL: 'https://localhost/digest/' 33* Found bundle for host localhost: 0x24c6e20 34* Re-using existing connection! (#0) with host localhost 35* Connected to localhost (127.0.0.1) port 443 (#0) 36* Server auth using Digest with user 'admin' 37> GET /digest/ HTTP/1.1 38> Authorization: Digest username="admin", realm="private Web", nonce="oI4tJwN4BQA=6f7eda4711047e2454eb8ad78f77c87ea309f079", uri="/digest/", cnonce="ICAgICAgICAgICAgICAgICAgICAgICAgIDczODI1NTQ=", nc=00000001, qop=auth, response="06461008d7725ed115a2276e1a44b0e3", algorithm="MD5" 39> User-Agent: curl/7.29.0 40> Host: localhost 41> Accept: */*

本題

さて、Alamofireで当該部分をどの様に作成しているのかという質問ですが、Alamofire自体はURLSession関連APIのラッパライブラリなので、Alamofire側ではなくURLSessionで生成している様です。
Document:Fetching Website Data into Memoryや、Objective-Cのサンプル
などを参考にAlamofireを利用しない実装をしても、algorithm="MD5"となっていました。おそらくsocketを利用して実装しないとこの部分はカスタマイズできない様にも思えます。(カスタマイズの仕方は探せませんでした)
総合的に考えると、クライアントの対応工数や、apacheのhttpdであれば、algorithm="MD5"でも許容することなどから、サーバ側が対応してもらえないのか交渉して貰うのが良いのではないでしょうか。

投稿2018/10/12 08:44

t_obara

総合スコア5488

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

komasannkomatta

2018/10/15 02:05

t_obara様 ご回答、ありがとうございます。 結論だけでなく詳細な調査方法を記述していただき、とても分かりやすく理解できました。 サーバ側で対応してもらえるように交渉いたします。 今回は、お手数をおかけして大変申し訳ございませんでした。 分からないことを調べる際の、アプローチの仕方など、質問内容以上に勉強になりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問