2016-06-05 13 views
0

Wir versuchen, Github oAuth in unserer App mit Passport.js zu implementieren. Wenn der Benutzer den Endpunkt durch Klicken auf ein Anchor-Tag/href erreicht, funktioniert es einwandfrei. Wenn wir jedoch stattdessen einen Click-Handler verwenden, um eine Ajax-Anfrage zu initiieren, erhalten wir einen CORS-Fehler vom Github-Server. Warum?Klicken Sie auf einen href zu unserem Github oAuth-Endpunkt, aber eine AJAX-Anforderung an denselben Endpunkt verursacht einen CORS-Fehler?

Server-Side-Code:

app.get('/auth/github', 
    passport.authenticate('github', { scope: [ 'user:email' ] })); 

app.get('/auth/github/callback', 
    passport.authenticate('github', { failureRedirect: '/login' }), 
    function(req, res) { 
    console.log('Github authentication successful!'); 
    res.redirect('/'); 
}); 

Client-Seite Code (wir verwenden Reagieren):

-> Werke:

<a href='/auth/github'>Contact</a>; 

-> funktioniert nicht - CORS Fehler :

handleContactAuth(event) { 
    $.ajax({ 
    url: '/auth/github', 
    method: 'GET', 
    success: data => console.log('Contact Auth response: ', data), 
    error: err => console.log('Error connecting to GitHub.', err) 
    }); 
} 

HINWEIS: Dies ist a Click-Handler auf die React-Komponente und funktioniert gut, da die Ajax-Anfrage ausgelöst wird. Ich bin mir bewusst, dass wir die Antwort derzeit nicht behandeln, abgesehen von nur einer console.log.

-> CORS Fehler wir auf der Client-Seite zu sehen, wenn statt href AJAX-Methode:

XMLHttpRequest cannot load https://github.com/login/oauth/authorize? response_type=code&redirect_uri=ht…auth%2Fgithub%2Fcallback&scope=user%3Aemail&client_id=our_client_code. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access.

Irgendwelche Ideen? Würde mich über Einsichten freuen - vielen Dank.

+0

... Ich habe genau das gleiche Problem. Hast du eine Lösung gefunden? – roberto

Antwort

0

Der CORS-Fehler ist kein vom Server zurückgegebener Fehler, sondern ein vom Browser ausgelöster Fehler, wenn die Antwort keine HTTP-Header enthält, die signalisieren, dass crossursprüngliche Anfragen zulässig sind. Der Endpunkt, auf den Sie treffen, ist offensichtlich nicht für den Zugriff auf diese Weise ausgelegt.

0

Ich hatte das gleiche Problem und ich fand, dass zumindest in Google Chrome XMLHttpRequest Objekt auf die gleiche Herkunft Richtlinie beschränkt ist. Sie müssen also möglicherweise ein Anker-Tag verwenden.

Regular web pages can use the XMLHttpRequest object to send and receive data from remote servers, but they're limited by the same origin policy. Extensions aren't so limited. An extension can talk to remote servers outside of its origin, as long as it first requests cross-origin permissions.

-Link: https://developer.chrome.com/extensions/xhr