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

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

新規登録して質問してみよう
ただいま回答率
86.02%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

FlaskでDigest認証をするとcurlでユーザーとパスワードを入れても認証されない

a_eui
a_eui

総合スコア13

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

11回答

3グッド

8クリップ

22827閲覧

投稿2021/06/26 17:36

編集2021/06/30 03:33

###前提・実現したいこと

Flaskで作ったWeb APIにDigest認証をかけた際、curlで正しいユーザー名とパスワードを指定したら認証できるようにしたい

発生している問題・エラーメッセージ

Flaskで作ったWeb APIにDigest認証をかけた際、curlで正しいユーザー名とパスワードを指定しても認証されません。何故なのでしょうか?
ブラウザでユーザー名とパスワードを入力した際はうまく認証され、正しいページが表示されます。

$ curl --digest -u a:a http://127.0.0.1:80 Unauthorized Access

該当のソースコード

下記のapi.py以外にDigest認証用の設定は特に行っておりません。apacheを使用しています。

api.py

1from flask import Flask, jsonify, abort, make_response, request 2from flask_httpauth import HTTPDigestAuth 3 4api = Flask(__name__) 5 6api.config['SECRET_KEY'] = 'secret key here' #ランダムな値を作成する 7auth = HTTPDigestAuth() 8 9#"id":"パスワード" 10users = { 11 "a": "a", 12 "b": "b" 13} 14 15@auth.get_password 16def get_pw(username): 17 if username in users: 18 return users.get(username) 19 return None 20 21@api.route('/') 22@auth.login_required 23def index(): 24 return "Hello, %s!" % auth.username() 25 26if __name__ == '__main__': 27 api.run(host='127.0.0.1', port=80)

バージョン

Python 3.7.3
Flask 1.0.2
Flask-HTTPAuth 4.4.0

###補足
ちなみにDigest認証からBasic認証に変更した時はcurlでもうまく表示されました。

ktl2018, sobajiro, tamura0425👍を押しています

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

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

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

下記のような質問は推奨されていません。

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答11

9

ベストアンサー

これ実に不思議な現象だと思いました。ちなみに、wgetだと認証が通ります。wget、curl、Flask-HTTPAuthの内部を追いかけたところ、原因がわかりました。

Flask-HTTPAuthはopaqueというパラメータをセッションに保存しています。なので、Cookieが有効にならないと認証に失敗します。wgetはデフォルトでCookieを保存しませんが、Digest認証時のCookieは有効になるようです。一方、cURLはオプションを指定しないとCookieが有効になりません。

解決策としては、明示的にCookieを有効にすればよいと思います。

$ curl -c cookie.jar --digest -u "a:a" http://127.0.0.1:5000 Hello, a!

ただ、実験や学習目的ならよいのですが、セキュリティが目的ならDigest認証はお勧めしません。なぜなら、パスワードの安全な保存ができないからです。サンプルソースでも平文でパスワードを取り扱っていますが、Digest認証の場合、パスワードをハッシュ値で保存することができません。
なので、セキュリティ目的なら、HTTPSとBasic認証の組み合わせの方が安全です。

投稿2021/06/27 10:46

ockeghem

総合スコア11626

tanat, YakumoSaki, abetaf, gasbombe, ktl2018, a_eui, sobajiro, yuokada, sbwhitecap👍を押しています

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

a_eui

2021/06/27 12:02 編集

ご丁寧な回答ありがとうございます。大変勉強になりました。 追加の質問で恐縮なのですが、curlでオプションを付け加える以外に、pythonファイルの内容に何か追加するなどしてCookieを有効にする方法はあるのでしょうか?
ockeghem

2021/06/27 12:03

Pythonなどサーバー側の操作でCookieを有効にする方法はありません。やるとすれば、Flask-HTTPAuthをカスタマイズしてopaqueのチェックを省くくらいです。セキュリティを弱める方向なので、お勧めできませんが。
a_eui

2021/06/27 12:08

承知いたしました。この度は大変勉強になりました。本当にありがとうございました。

0

Double-check that the subway surfers online username and password you're using in your curl command match the ones you've set up for digest authentication in your Flask app. It's possible that you've mistyped the credentials.

投稿2023/03/25 02:29

bekeanloinse

総合スコア2

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

I like to read and learn the information you provide before participating in the Drift Boss race to ensure safety.

投稿2023/03/24 08:03

victorable

総合スコア2

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

投稿2023/03/02 03:26

KiethDunt

総合スコア18

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

投稿2023/03/02 03:25

KiethDunt

総合スコア18

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

もう 1 つの可能性は、Digest 認証を処理するように Flask アプリケーションが適切に構成されていないことです。 Flask_httpauth.HTTPDigestAuth mapquest driving directions クラスが正しく使用されていること、およびクライアントから提供されたユーザー名とパスワードを検証するために verify_password メソッドが実装されていることを確認してください。

投稿2023/02/27 09:53

celinedion

総合スコア6

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

Thank you very much, I have been seeking for this information for a very long time, and the information that you provided in your article has been very helpful to me in my work. dordle

投稿2023/02/14 08:59

sara167

総合スコア14

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

トランスポートが安全な HTTP であっても、要求ごとにユーザー名とパスワードを送信しなければならないのは不便であり、セキュリティ上の問題と見なされる可能性があります。これを可能にするために、クライアントはコーディングせずに資格情報をビットライフで保存する必要があるためです。```ここに言語を入力
コード

Download vidmate

投稿2023/02/09 19:50

編集2023/02/09 19:53
Siyop

総合スコア2

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

難易度: SmartNews (一番難しい/大変) > PayPay > Woven Planet > Mercari trap the cat
年収(もらったオファー) : Woven Planet > SmartNews > Mercari > PayPay

投稿2023/01/31 07:55

halibutfit

総合スコア4

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

shell shockers Flaskで作ったWeb APIにDigest認証をかけた際、curlで正しいユーザー名とパスワードを指定しても認証されません。何故なのでしょうか?

投稿2023/01/30 08:18

lorde

総合スコア4

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

Even if the transport is secure HTTP, having to submit a username and password with every request is inconvenient and could be viewed as a security concern because the client must store bitlife the credentials without coding in order to be able to do so.

投稿2023/01/12 00:58

lilycoliins

総合スコア6

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。