web-dev-qa-db-ja.com

CSRF検証はDjango HTTPSを使用)では機能しません

フロントエンドがAngularJSAPIであり、Django RestFrameworkで開発されたバックエンドAPIにリクエストを送信するアプリケーションを開発しています。

The frontend is on the domain: https://front.bluemix.net
And my backend is on the domain: https://back.bluemix.net

フロントエンドAPIからバックエンドAPIへのリクエストに問題があります。エラーはこれです:

Error: CSRF Failed: Referer checking failed - https://front.bluemix.net does not match any trusted origins.

私はCORSを使用しており、DjangoバックエンドAPIのsettings.pyに次の行をすでに含めています:

ALLOWED_HOSTS = []

CORS_ALLOW_CREDENTIALS = True

CORS_Origin_ALLOW_ALL = True

CORS_ALLOW_CREDENTIALS = True


CSRF_TRUSTED_ORIGINS = ['https://front.bluemix.net/']

CORS_REPLACE_HTTPS_REFERER = True

CSRF_COOKIE_DOMAIN = 'bluemix.net'

CORS_Origin_WHITELIST = (
    'https://front.bluemix.net/',
    'front.bluemix.net',
    'bluemix.net',
)

誰もがこの問題を解決する方法を知っていますか?

9
ccr

CSRF_TRUSTED_ORIGINSの設定が間違っています-次のように変更してください:

CSRF_TRUSTED_ORIGINS = ['front.bluemix.net']

設定には、スキームではなく、 ホスト名のみ が必要です。設定はHTTPS経由で接続する場合にのみ効果があるため、スキームはとにかく冗長です。

おそらくALLOWED_HOSTS ..にも何かを入れる必要があります。

26
solarissmoke

これに従う人は、CORS_Origin_ALLOW_ALLTrueに設定している場合、すべてのホストをすでに許可しているため、CORS_Origin_WHITELIST変数を設定する必要はありません。

私の問題の解決策-誰かを助けるかもしれません

私たちが抱えていた問題は独特なものでした。クライアントアプリケーションがTokenAuthenticationを使用してリクエストを別のアプリケーションに送信し、CRMがDjango Adminとしたがって、SessionAuthenticationを使用します。Django管理アプリケーションを開くと、SessionMiddlewareが自動的に作成されていました。そのドメインのsession_idCookie。クライアントアプリケーションを開いてリクエストを実行しようとすると、次のエラーが発生しました。

Error: CSRF Failed: Referer checking failed - https://domainofthedjangoadminapp.com does not match any trusted origins.

これは、session_idCookieが既にブラウザに設定されているため、SessionAuthenticationではなくSessionAuthenticationを使用してリクエストが行われたためです。 /// =)TokenAuthentication(---)そして失敗します。

クッキーを削除することで明らかに問題が解決しました。

5
Tyson Rodez