0

J'essaie de créer un service Web qui se connecte à l'API Google Calendar. En essayant d'autoriser mon application, j'ai généré une URL avec les étendues nécessaires. Le problème est lorsque je tente de rediriger le client vers l'URL générée, je reçois une erreur 405 avec le message suivant:Essayer de rediriger le client vers Google OAuth, obtenir l'erreur 405

Réponse à la demande prévol ne passe pas vérification de contrôle d'accès: Contrôle d'accès » Non L'en-tête -Allow-Origin 'est présent sur la ressource demandée. L'origine 'http://localhost:8080' n'est donc pas autorisée accès. La réponse a un code d'état HTTP 405.

Pour la plupart, je suis ce guide: https://developers.google.com/identity/protocols/OAuth2WebServer en utilisant la bibliothèque cliente Node.js. D'après ce que je comprends, il semble que Google n'a pas configuré leur serveur pour accepter les demandes d'origine croisée, ce que je ne comprends pas, c'est comment je suis censé rediriger mes utilisateurs vers leur page d'autorisation si je ne peux pas envoyer une demande mon domaine.

Voici le code correspondant:

export function authorize(req, res, callback): any { 
    let auth = new googleAuth(); 
    let oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl); 
    if (// Check if we have previously stored a token.) { 
    oauth2Client.credentials = //get token; 
    callback(oauth2Client); 
    } else { 
    //redirect to google authentication page 
    let authUrl = oauth2Client.generateAuthUrl({ 
     access_type: 'offline', 
     state: '/', 
     scope: SCOPES 
    }); 
    res.redirect(authUrl); 
    } 
} 
+1

Un 405 signifie «méthode non autorisée» et, dans ce contexte, le serveur n'autorise pas du tout les requêtes OPTIONS vers l'URL 'authUrl' que vous essayez d'atteindre. Je pense que cela n'a probablement rien à voir avec le fait que le serveur accepte les demandes d'origine croisée ou non, mais vous pouvez confirmer en utilisant curl ou posman ou un autre outil pour envoyer une requête OPTIONS à cette URL 'authUrl' et voir ce que vous revenir. Je parie que vous allez obtenir un 405. – sideshowbarker

+0

Quoi qu'il en soit, tant que ce serveur donne une requête 405 à OPTIONS, il n'y a aucun moyen que vous puissiez accéder avec succès à ses réponses à partir de votre code JavaScript. Vous aurez besoin de faire la demande à partir de votre code backend à la place. Pour les services basés sur OAuth, cela semble être toujours le cas: vous ne pourrez pas utiliser XHR ou l'API Fetch pour obtenir des réponses de votre part auxquelles votre code JavaScript frontal peut accéder. – sideshowbarker

+0

@sideshowbarker La requête OPTIONS est une demande de contrôle en amont du navigateur, pas quelque chose que je fais délibérément. Vous avez raison, j'ai le même problème en utilisant le facteur, mais les requêtes 405 à OPTIONS sont toujours un problème que je devrai naviguer puisque je fais une requête CORS, n'est-ce pas? Si je demande le côté serveur, comment l'utilisateur s'authentifie-t-il? Par exemple, si le lien de l'exemple google vous demande de vous connecter et d'accorder l'accès à la portée de l'exemple. J'ai toujours besoin des utilisateurs pour se connecter/accorder l'accès à mon application. –

Répondre

0

Transforme quand AJAX reçoit un code d'état 300, le navigateur envoie automatiquement une autre requête GET à l'emplacement retourné au nom du client. Même si j'avais contourné mon problème CORS, j'aurais dû charger manuellement la page html depuis que la demande avait été faite au nom du client. Ce que je veux vraiment, c'est que le navigateur fasse la demande à l'utilisateur authentifié. Donc, ma solution à ce problème est de détecter les redirections sur le frontal et de faire en sorte que le navigateur émette une nouvelle requête GET. Cela me semble toujours être un problème, alors si quelqu'un d'autre a une meilleure solution, j'aimerais l'entendre.