2016-05-09 6 views
0

Ich versuche accounts-facebook mit der Ionic CLI zu verwenden. Ich benutze eine client side bundler script, aber ich kann nicht den gesamten oauth Workflow zum Abschluss bringen.Wie funktioniert der Meteor-Accounts oauth Workflow passieren

Ich habe eine Standard-account-facebook-Konfiguration aus dem meteor-angular-socially-Projekt eingerichtet und festgestellt, dass ich bei der oauth Weiterleitungs-URI stecken bleibe. Das folgende Verfahren wird nie

in meinem clientseitige Bündel genannt
// in script: oauth/oauth_client.js 
// Called by the popup when the OAuth flow is completed, right before 
// the popup closes. 
OAuth._handleCredentialSecret = function (credentialToken, secret) { 
    check(credentialToken, String); 
    check(secret, String); 
    if (! _.has(credentialSecrets,credentialToken)) { 
    credentialSecrets[credentialToken] = secret; 
    } else { 
    throw new Error("Duplicate credential token from OAuth login"); 
    } 
}; 

ich die folgenden Umleitungs-URL von oauth erhalten, die diese Seite

# http://localhost:3000/_oauth/facebook/?code=[...]&state=[...] 
<!DOCTYPE html> 
<html> 
<body> 
    <p id="completedText" style="display:none;"> 
    Login completed. <a href="#" id="loginCompleted"> 
     Click here</a> to close this window. 
    </p> 

    <div id="config" style="display:none;">{ 
    "setCredentialToken":false, 
    "storagePrefix":"Meteor.oauth.credentialSecret-", 
    "isCordova":false 
    }</div> 
    <script type="text/javascript" src="/_oauth/facebook/end_of_popup_response.js"> 
    # script included inline for ease of reading 
    (function() { 

     var config = JSON.parse(document.getElementById("config").innerHTML); 

     if (config.setCredentialToken) { 
     var credentialToken = config.credentialToken; 
     var credentialSecret = config.credentialSecret; 

     if (config.isCordova) { 
      var credentialString = JSON.stringify({ 
      credentialToken: credentialToken, 
      credentialSecret: credentialSecret 
      }); 

      window.location.hash = credentialString; 
     } 

     if (window.opener && window.opener.Package && 
       window.opener.Package.oauth) { 
      window.opener.Package.oauth.OAuth._handleCredentialSecret(
      credentialToken, credentialSecret); 
     } else { 
      try { 
      localStorage[config.storagePrefix + credentialToken] = credentialSecret; 
      } catch (err) { 
      // We can't do much else, but at least close the popup instead 
      // of having it hang around on a blank page. 
      } 
     } 
     } 

     if (! config.isCordova) { 
     document.getElementById("completedText").style.display = "block"; 
     document.getElementById("loginCompleted").onclick = function(){ window.close(); }; 
     window.close(); 
     } 
    })(); 
    </script> 
</body> 
</html> 

In dem Standard meteor CLI Config laden soll, irgendwie/somwhere config.setCredentialToken === true und config.setCredentialToken und config.credentialSecret sind gesetzt. Aber ich kann nicht herausfinden, wo/wann das passiert.

In meinem accounts-facebook-client-side.bundle.js passiert nichts davon.

Update

erkannte ich, dass die Magie auf der Meteor Server-Seite geschieht. Wenn ich meine oauth gesetzt redirect_uri zum Hafen, wo der Meteor-Server läuft, dann bekomme ich die folgenden in der ./_oauth/facebook Seite:

<div id="config" style="display:none;">{ 
"setCredentialToken":true, 
"credentialToken":"bsgEZrFbK-UruR1iX81dEitIR0t5nC_a1HM4-EGSGx5", 
"credentialSecret":"hi8rJxbyOsI0gVaoIHrr7N9kH9k2Fku1DYQXP5BmQMt", 
"storagePrefix":"Meteor.oauth.credentialSecret-", 
"isCordova":false 
}</div> 

ABER, ich bin zu raten, wenn ich das tue, ich werde nicht in der Lage sein, Lesen Sie diese Werte von localstorage(?) auf meiner Web-Browser-Client-Seite (Port 3000)

irgendwelche Ideen für eine Problemumgehung?

Antwort

0

einfachste Art und Weise zu fixieren nginx vor Ihrer App zu setzen ist und proxy_pass verwenden, um Anrufe zu Ionic des Server und Meteor-Server basierend auf dem Weg zu sortieren:

server { 
    listen  80; 
    server_name domain.tld; 

    location/{ 
     proxy_pass http://domain.tld:8100; 
    } 
    location /_oauth { 
     proxy_pass http://domain.tld:3000; 
    } 
    location /packages { 
     proxy_pass http://domain.tld:3000; 
    } 
} 

ich diese Methode gerade versucht, mit Konten-facebook und funktioniert einwandfrei (Sie müssen Ihren Browser auf http://domain.tld:80 statt http://domain.tld:8100 zeigen), aber ich habe bereits begonnen, tiefer in Meteor Code zu graben, um zu sehen, ob ich etwas besser erreichen kann. Ich werde diese Antwort bearbeiten, wenn ich eine bessere Lösung finden werde.

Verwandte Themen