web-dev-qa-db-fra.com

La redirection n'est pas autorisée pour une demande de contrôle en amont

J'ai ce problème où j'obtiens la réponse lorsque j'essaie d'utiliser une api de repos: "Accès pour récupérer à ' https://kollektivet.app:8082/api/login/ ' depuis Origin '- https://kollektivet.app 'a été bloqué par la stratégie CORS: la réponse à la demande de contrôle en amont ne passe pas la vérification du contrôle d'accès: la redirection n'est pas autorisée pour une demande de contrôle en amont. "

Image de la réponse lors de la tentative de récupération

Cela se produit lorsque j'essaie l'une des autres API que j'utilise. D'après ce que j'ai lu, cette erreur signifie que j'essaie de rediriger, ce que je ne suis pas.

Le backend est Django et ressemble à ceci:

    @csrf_exempt
@api_view(["POST"])
@permission_classes((AllowAny,))
def register(request,):
        password = request.data.get("password", "")
        email = request.data.get("email", "")
        if not email and not password and not email:
            return Response(
                data={
                    "message": "username, password and email is required to register a user"
                },
                status=status.HTTP_400_BAD_REQUEST
            )
        new_user = User.objects.create_user(
            email=email, password=password
        )
        return Response(status=status.HTTP_201_CREATED)

Et le front-end est en réaction qui ressemble à ceci:

createUser(event) {
        event.preventDefault();

        let data = {
            name: this.state.name,
            password: this.state.password,
            repeatPassword: this.state.repeatPassword,
            email: this.state.email
        };

        if (this.state.name !== '' && this.state.password !== '' && this.state.email !== '' && this.checkPasswords()) {
            console.log('name', this.state.name, 'password ', this.state.password, 'email ', this.state.email);
                fetch("https://kollektivet.app:8082/api/register/", {
                    method: 'POST',
                    headers: {
                        'Accept': 'application/json',
                        'Content-Type': 'application/json',
                    },
                    mode: "cors",
                    body: JSON.stringify(data)
                })
                    .then(response => response.json())
                    .then(data => console.log(data))
                    .catch(error => console.log(error));
            this.setState({message: "Du er nå registrert! For å aktivere din konto trykk på linken som vi har sendt til deg på epost"});
            this.setState({name: ""});
            this.setState({password: ""});
            this.setState({repeatPassword: ""});
            this.setState({email: ""});

        }
    }

J'ai ceci est le fichier de paramètres Django:

CORS_Origin_ALLOW_ALL = True
CORS_ALLOW_HEADERS = (
    'accept',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'Origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
)

Je lance ceci sur Apache2 si cela est pertinent. Le port 8082 est également fermé. Doit-il être ouvert lorsqu'il se trouve sur le même serveur?

Merci!

6
Frank even Valde

Vous êtes redirigé vers site.site.comapi/register /

Avez-vous un autre middleware qui fait cela? Peut-être dans la configuration Apache?

Notez qu'il s'agit d'un 1 donc votre navigateur a mis en cache cette réponse et y redirigera désormais toujours même si votre rove le code qui a entraîné cette redirection, ou même si vous arrêtez Django = de courir.

Vous devrez donc également vider votre cache de redirection dans le navigateur.

C'est pourquoi je n'aime pas les réponses 1. 2 sont beaucoup plus polis.

3
rich tier

J'ai eu le même problème jusqu'à ce que je découvre que la redirection était causée par le cadre d'internationalisation Django, où toutes les URL reçoivent une extension d'URL i18n telle que /en/path_to_resource quand en fait path_to_resource a été demandé. Le cadre d'internationalisation y parvient grâce à une redirection 302.

La solution à ce problème est de conserver les URL rest-api en dehors de la section avec les i18n_patterns. L'urls.py résultant pourrait alors ressembler à

urlpatterns = [
    path('i18n/', include('Django.conf.urls.i18n')),
    path('rest/', include(('rest.urls', 'rest'), namespace='rest')),
]

urlpatterns += i18n_patterns(
    path('admin/', admin.site.urls),
    path('jsi18n/', JavaScriptCatalog.as_view(), name='javascript-catalog'),
    path('my_app/', include(('my_app.urls', 'my_app'), namespace='my_app')),
)
0
Nechoj