0

私は 2 つの Web2Py アプリケーションを持っています。それらをProviderReceiverと呼びましょう。Providerは基本的な認証機能を提供し、Receiverはそれを使用してログインします。ユーザーはProviderのローカル データベースに作成されており、Receiverはそれらのユーザー資格情報を使用して正常にログインしています。しかし、コントローラーに RESTful メソッドがある場合、jQuery-Ajax 呼び出しは、同じユーザー名を使用して同じブラウザー セッションから手動でプロバイダーにログインした場合にのみ機能します。それを行わずにReceiverからのみログインすると、正常にログインしたと表示されますが、Ajax GET 呼び出しは正常に実行されません。レシーバーにログインするとあるユーザー名を使用してProviderに、別のユーザー名を使用して Provider に、Ajax GET はProviderにログインしているユーザーの情報を取得します。これをスクリプトとして Receiver に入れindex.htmlまし:

var gBaseUrl="http://127.0.0.1:8000/Provider/sites/";
$(document).ready(function(){
  $.ajax({
      type: "GET",
      async: true,
      url: gBaseUrl+"get_username",
      dataType: "text",
      success: function(data){
        $('#ContentView').append('<p> succeeded '+data+'</p>');
      }
      failure: function(data){
        $('#ContentView').append('<p> failed '+data+'</p>');
      }
    });
});

Providerにローカルでログインしない場合、ContentView には何も追加されません。Providerは次のdb.pyようになります。

## configure auth policy
auth.settings.registration_requires_verification = True
auth.settings.registration_requires_approval = True
auth.settings.reset_password_requires_verification = True
auth.settings.allow_basic_login = True
auth.settings.controller = 'default'
auth.settings.hmac_key = None
auth.settings.mailer = None
auth.settings.login_after_registration = False

基本認証を実現するために、Providerには次のdefault.pyものがあります。

def basic_auth():
    """
    checks if the user is logged in and returns True/False.
    if so user is in auth.user as well as in session.auth.user
    """
    auth.basic()
    if auth.user:
        print("login success!")
        print(auth.user.username, " is logging in!")
        session.forget()
        return True
    else:
        print("login failed!")
        return False

そして、ユーザー名を返すために、Providersiteコントローラーで、次のようにします。

@request.restful()
@auth.requires_login()
def get_username():
    def GET():
        return str(auth.user.username)
    return locals()

ContentView はdiv、私が持っている空に他なりませんindex.html

また、次のrequiresデコレータの実装を少し変更しましたgluon/tools.py

if current.request.ajax:
    raise HTTP(401)
...
elif self.settings.allow_basic_login_only or \
        basic_accepted or current.request.is_restful:
    raise HTTP(401, **{'WWW-Authenticate': 'Basic realm="My Realm"'})
...
4

1 に答える 1

1

基本認証を介してログインする場合は、リクエストのHTTPヘッダーでログイン資格情報を提供する必要がありますが、Ajaxコードでは提供されません。いずれにせよ、より良いオプションは、おそらく組み込みの中央認証サービス機能を使用することです。ブラウザからAjaxリクエストを作成しているため、セッションCookieがリクエストとともに送信されるため、基本認証に制限する必要はありません。

更新:基本認証を使用する必要がある場合は、jQuery.ajax()メソッドが引数usernameを取ることに注意してください。passwordまた、ヘッダーを直接設定することもできます。サーバーに401応答を送信させ、ブラウザーに資格情報のプロンプトを処理させることもできますが、これは最高のユーザーエクスペリエンスではありません。

また、プロバイダーアプリが別のドメインで実行される場合は、ブラウザーがAjaxリクエストに同じオリジンポリシーを課すことに注意してください。その場合、JSONPまたはCORSを実装する必要があります。

于 2013-03-18T15:54:21.433 に答える