2016-05-04 9 views
1

Flaskで書かれた簡単なWebアプリケーションを開発しており、ブラウザの認証を一から理解することができます。最初のステップとして、私は使用して匿名アクセスを停止するために基本認証を追加しました:純粋なJavascriptを使用して永続的な基本認証を設定するにはどうすればよいですか?

from functools import wraps 
from flask import request, Response 


def check_auth(username, password): 
    """This function is called to check if a username/
    password combination is valid. 
    """ 
    return username == 'admin' and password == 'secret' 

def authenticate(): 
    """Sends a 401 response that enables basic auth""" 
    return Response(
    'Could not verify your access level for that URL.\n' 
    'You have to login with proper credentials', 401, 
    {'WWW-Authenticate': 'Basic realm="Login Required"'}) 

def requires_auth(f): 
    @wraps(f) 
    def decorated(*args, **kwargs): 
     auth = request.authorization 
     if not auth or not check_auth(auth.username, auth.password): 
      return authenticate() 
     return f(*args, **kwargs) 
    return decorated 

出典:http://flask.pocoo.org/snippets/8/

をそれは、セキュリティに関してこれは正常に動作します。しかし、問題は、それがユーザー名とパスワードを要求するということです。ユーザー名とパスワードを入力すると、承認は永続的です。だから私の質問は:

1)許可は永続的ですか?ブラウザセッション中は要求ヘッダーにBasic Authorizationが格納されていますか?シークレットウィンドウを開くともう一度入力する必要があることがわかります。

2)ブラウザのポップアップを使って純粋なJavscriptインスタントを使用して、ブラウザセッションを通じて永続的な基本認証を設定する、ログインページを上記のようにすることはできますか?

答えて

1

あなたはfirebugのようなツールをダウンロードして、あなたの要求に沿って前後にヘッダーを見なければなりません。これは、あなたのブラウザがユーザ名とパスワードなしでどのように再認証されているかを啓発するでしょう。

私はフラスケを完全に誤解していない限り、このすべてのコードは、この行のレスポンスヘッダを送信してこれが何をやっている

{'WWW-Authenticate': 'Basic realm="Login Required"'}) 

に基本的な要求挑戦と401を送信してやっています。ブラウザがこれを取得すると、Basicが認証プロトコルとして認識され、ダイアログが表示されます。このダイアログはブラウザがポップアップし、リモートリソースに対して認証できるようにパスワードを要求します。その後、そのタブまたはブラウザの存続期間(ブラウザ自体に依存します)に、すでに認証を覚えて送信します。 Hereが質問番号2についてのブラウザは(終値が面倒である参照)ことを忘れすることについて議論

です...それは基本的にthis

の複製である。しかし要約では、あなたは資格情報をクライアントに依頼する必要がありますネゴシエーションを実行します。一部のフレームワークでは、静かな基本認証が可能です。したがって、ユーザ名/パスワードを取得した場合、base64でエンコードし、ヘッダーにそれを入れてから、サーバに情報があります。にはの認証が必要です。他のフレームワークはトークンを使用してセッションの認証を維持します。したがって、保護されていないリソース/login.htmlを持っていて、そのフォームをログインエンドポイントに投稿することができます。 Thisは、フラスコベースのログインページをカバーすると思われる。

もちろん、これはhttpsなどで行う必要があります。

関連する問題