3

サービスで奇妙な問題が発生しました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

4

2 に答える 2