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

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

ただいまの
回答率

90.51%

  • Swift

    8742questions

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

  • HTTPヘッダー

    104questions

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

Alamofireでdigest認証について

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 547

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
}

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

 前置き

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

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

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

 curlでの確認

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

$ cat /etc/centos-release
CentOS Linux release 7.2.1511 (Core) 
$ curl --version
curl 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
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp 
Features: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz 
curl -v -k --digest -u admin:pass https://localhost/digest/
* About to connect() to localhost port 443 (#0)
*   Trying ::1...
* 接続を拒否されました
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* skipping SSL peer certificate verification
* SSL connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate:
*     subject: CN=localhost
*     start date: 10月 10 17:39:08 2018 GMT
*     expire date:  1月 08 17:39:08 2019 GMT
*     common name: localhost
*     issuer: CN=Let's Encrypt Authority X3,O=Let's Encrypt,C=US
* Server auth using Digest with user 'admin'
> GET /digest/ HTTP/1.1
> User-Agent: curl/7.29.0
> Host: localhost
> Accept: */*
> 
< HTTP/1.1 401 Unauthorized
< Server: nginx
< Date: Fri, 12 Oct 2018 07:37:01 GMT
< Content-Type: text/html; charset=iso-8859-1
< Content-Length: 381
< Connection: keep-alive
< WWW-Authenticate: Digest realm="private Web", nonce="oI4tJwN4BQA=6f7eda4711047e2454eb8ad78f77c87ea309f079", algorithm=MD5, qop="auth"
< 
* Ignoring the response-body
* Connection #0 to host localhost left intact
* Issue another request to this URL: 'https://localhost/digest/'
* Found bundle for host localhost: 0x24c6e20
* Re-using existing connection! (#0) with host localhost
* Connected to localhost (127.0.0.1) port 443 (#0)
* Server auth using Digest with user 'admin'
> GET /digest/ HTTP/1.1
> Authorization: Digest username="admin", realm="private Web", nonce="oI4tJwN4BQA=6f7eda4711047e2454eb8ad78f77c87ea309f079", uri="/digest/", cnonce="ICAgICAgICAgICAgICAgICAgICAgICAgIDczODI1NTQ=", nc=00000001, qop=auth, response="06461008d7725ed115a2276e1a44b0e3", algorithm="MD5"
> User-Agent: curl/7.29.0
> Host: localhost
> 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/15 11:05

    t_obara様

    ご回答、ありがとうございます。

    結論だけでなく詳細な調査方法を記述していただき、とても分かりやすく理解できました。
    サーバ側で対応してもらえるように交渉いたします。

    今回は、お手数をおかけして大変申し訳ございませんでした。
    分からないことを調べる際の、アプローチの仕方など、質問内容以上に勉強になりました。
    ありがとうございます。

    キャンセル

同じタグがついた質問を見る

  • Swift

    8742questions

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

  • HTTPヘッダー

    104questions

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