Django アプリ テンプレートに典型的なログイン フォームがあります (これは、プラグインではなくBootstrapを直接使用します)。
<form class="form-signin" method="post" action="/site_manager/login/" id="form-signin"> {% csrf_token %}
<h2 class="form-signin-heading">Please sign in</h2>
<div class="control-group">
<label class="control-label" for="login">Login:</label>
<div class="controls">
<input size="50" name="username" id="username" required="true" type="text" class="form-control" placeholder="Login" intermediateChanges=false>
</div>
</div>
<div class="control-group">
<label class="control-label" for="password">Password:</label>
<div class="controls">
<input size="50" name="password" id="password" required="true" type="password" class="form-control" placeholder="Password" intermediateChanges=false>
</div>
</div>
<button name="submit" id="submit" value="Log in" type="submit" class="btn btn-primary pull-right">Sign in</button>
</form>
そして、リクエストモジュールを介してリモート認証を実行する対応するビューは次のとおりです。
def login_view(request):
if request.POST:
username = request.POST.get('username')
password = request.POST.get('password')
headers = {'content-type': 'application/json', 'username':username, 'password':password}
r = requests.get(remote_server_url, auth=(username, password), headers=headers)
if r.status_code == 200:
user = authenticate(username=username, password=password)
if user == None:
user = User.objects.create_user(username.encode('ascii', 'ignore'), "", password)
user = authenticate(username=username, password=password)
login(request, user)
request.session.set_expiry(0)
return HttpResponseRedirect('<index_page>')
else:
# redirects back to login page with some error message
このログインが成功したら、ここで説明されているように、Javascript を使用して CSRF トークンをクエリできます。私の計画は、他の目的 (たとえば、RESTful クエリ) でリモート サーバーに (SSL 経由で) Ajax 呼び出しを行うことです。上記のコードが示すように、そのサーバーは基本認証を使用します。したがって、すべての Ajax 呼び出しのヘッダーに CSRF トークンを設定したいのですが、これは同一生成元の原則に従っていません。
var csrftoken = $.cookie('csrftoken'); // using the jQuery Cookie plugin
$.ajaxSetup({
headers: {
'Authorization': "Basic XXXXX"
}
beforeSend: function(xhr, settings) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
});
$.ajax({
type: "GET",
dataType: "jsonp",
url: remote_server_url+'/api/v1/someRESTfulResource/',
contentType: 'application/json',
success: function(data){
// some operations with data
}
});
Ajax 呼び出しと認証で使用remote_server_url
される は同じであり、Django アプリケーションと同じドメインを共有しません。私が収集したように、これはセキュリティ上のリスクです。同じ理由で、プレーン テキストのパスワードを Javascript コードで使用できるようにしたくありません。ユーザー資格情報を使用してリモートサーバーへのAjax呼び出しを安全に行うにはどうすればよいですか?