サービスで奇妙な問題が発生しましたngCookies
。/api/auth/login/
主に、エンドポイントからヘッダー付きの応答を受信した後:
Set-Cookie csrftoken=gxCld8gEga71MuQPQbjDujDBvR4HwPvu; expires=Sun, 28-Dec-2014 15:31:38 GMT; Max-Age=31449600; Path=/
これ$cookies['csrftoken']
は、不特定の時間の経過後に更新されます。この事実はdocsに記載されています:
Only a simple Object is exposed and by adding or removing properties to/from this object, new cookies are created/deleted at the end of current $eval.
それを知って、私は を使用して$timeout
、コードの評価を前述の$eval
.
次のようになりました(CoffeeScript):
login = () ->
deferred = $q.defer()
$http.post('/api/accounts/login/', data)
.success((data) ->
args = arguments
$timeout(() ->
do_fancy_stuff()
deferred.resolve.apply(deferred, args)
)
return
).error(() ->
args = arguments
$timeout(() ->
deferred.reject.apply(deferred, args)
)
return
)
promise = deferred.promise
promise.success = promise.then
promise.error = promise.catch
promise
しかし、上記のコードにはまだ問題があります。Cookie は、キックイン後の応答方法からの値で更新さ$timeout
れます。
console.log('cookies push', $browser.cookies().csrftoken, cookies.csrftoken);
ここに追加した後 (if
ステートメントの後)。私はこのようなものになってしまいました:
ご覧のとおり、トークンは 7 回印刷した後も同じでした。
yhQqT6KOfSKYCNB3Ag4sEPllMgkLrVj1
トークンは前のセッションから取得されます。ページを更新せずに、アプリへのログアウトとログインをテストしています。はSetting X-CSRFToken
私の関数で直接呼び出されdo_fancy_stuff()
ます(非同期のものはなく、ベア$cookies['csrftoken']
アクセスのみです)。
また、戻り値として -like promise$q
を提供するために を使用する必要があります ( Cookie が正常に機能している場合$http
はありません)。$q