2016-05-06 9 views
2

Ich hoffe wirklich, das ist meine letzte Frage auf der Stormpath API für eine Weile. Der Wechsel von C# und PHP zu Node war etwas schwierig.Social Login auf der Registrierungsseite für Stormpath

Ich versuche Social Login auf der Registrierungsseite zu implementieren. Die vordefinierte Option platziert sie nur auf der Anmeldeseite.

Rendern der Seite und Hinzufügen von Elementen zur Jade-Ansicht ist einfach genug, aber ich brauche einen oauthStateToken. Jetzt sah ich, wie der login.js Code tut dies:

 var oauth = require('../oauth');   
     var oauthStateToken = oauth.common.resolveStateToken(req, res); 
     var formActionUri = (config.web.login.uri + (nextUri ? ('?next=' + nextUri) : '')); 

     var hasSocialProviders = _.some(config.web.social, function (socialProvider) { 
      return socialProvider.enabled; 
     }); 

     extend(options, { 
      form: form, 
      formActionUri: formActionUri, 
      oauthStateToken: oauthStateToken, 
      hasSocialProviders: hasSocialProviders 
     }); 

So im Wesentlichen nennt es die Eid-Dateien und geht durch den Code, theoretisch, ich etwas ähnliches auf Register.js tun konnte - im Wesentlichen (nur Beispielcode):

var oauth = require('../oauth'); 
    var _ = require('lodash'); 
    var hasSocialProviders = _.some(config.web.social, function (socialProvider) { 
      return socialProvider.enabled; 
    }); 
    var oauthStateToken = ''; 
    if (hasSocialProviders) { 
      oauthStateToken = oauth.common.resolveStateToken(req, res); 
    } 

    helpers.render(req, res, view, { 
     form: helpers.sanitizeFormData(req.body), 
     formModel: viewModel.form 
     oauthStateToken : oauthStateToken, 
     hasSocialProviders: hasSocialProviders 
    }); 

aber natürlich würde ich nicht mit den Core-Dateien einmischen will, und dachte über eine Middleware-Funktion, so etwas wie app.use('/register', callFunction, router); zu schaffen, aber ich in Konzeptualisierung einige Schwierigkeiten habe, wie das funktionieren würde. Ich verstehe, wie Stormpath mir erlaubt, ein OAuth-Token zu generieren, das ich als Cookie mit JWT speichern kann, aber es fällt mir schwer, es in Arbeitscode zusammenzufassen, ohne viel Code zu replizieren, der bereits in der Bibliothek vorhanden ist.

Ich kann sogar irgendwie funktionieren, indem ich die REST-API benutze, aber ich möchte sie in der Express-Stormpath-Bibliothek verwenden. Eine Erklärung im Kontext der Express-Stormpath-Bibliothek wäre also auch aufschlussreich. ODER überlege ich das, sollte ich einfach die Bibliothek ausbuchen, die Änderungen an register.js vornehmen und einen Push Upstream versuchen?

Danke wieder Leute,

Antwort

1

danke für die Frage!

Ich habe einen Weg gefunden, um dies in Ihrer Anwendung zu umgehen, ohne die Express-Stormpath-Bibliothek zu ändern. Sie müssen einen Routenhandler für Ihre Registrierungsroute hinzufügen, und in diesem Routenhandler müssen Sie manuell die Arbeit erledigen, um die oAuthStateToken Einrichtung zu erhalten, und dann next() anrufen, damit Express-Stormpath die Anfrage für die Registrierungsseite weiter bearbeitet . Hier ist, wie das aussieht:

var cookieParser = require('cookie-parser'); 
var oauth = require('express-stormpath/lib/oauth'); 

// create your express server, 'app' 

app.use('/register', cookieParser(), function (req, res, next) { 
    var oauthStateToken = oauth.common.resolveStateToken(req, res); 
    req.app.get('stormpathConfig').templateContext = { 
    oauthStateToken: oauthStateToken 
    }; 
    next(); 
}); 

app.use(stormpath.init(app, { 
    // .. other config options 
    web: { 
    register: { 
     view: 'views/register.jade' // path to your custom registration file 
    } 
    } 
})); 

Ich hoffe, das hilft! Dies könnte sicherlich einfacher sein, das ist eine gute Feature-Anforderung für die Bibliothek.

+0

Hey, also yep - Ich hatte etwas ähnliches versucht, aber es schien keine gute Idee zu sein, Funktionen in der Bibliothek so zu referenzieren (speziell die oauth Bibliothek direkt und nicht über eine dokumentierte API). Ich werde es ausprobieren und Bericht sehen zurück. Ich werde auch den Code abzweigen und eine Pull-Anfrage mit euch Leuten versuchen (zögern Sie nicht, da Sie wahrscheinlich an bessere Möglichkeiten gedacht haben). Es scheint, als wäre es ein häufiger Anwendungsfall, bei dem Sie sichergehen möchten, dass Ihre Benutzer sich bewusst sind, dass sie sich nicht anmelden müssen und sich einfach direkt mit Social Logins einloggen können. Auch danke! Ihr seid Champions. –

+0

Zwei Dinge, die ich ändern musste: 'oauthStateToken' anstelle von' oAuthStateToke' Und 'app.use' statt' app.get' - obwohl ich denke, dass das in diesem Fall überhaupt keine Rolle spielt. Danke nochmal! –

+0

Danke für die Antwort, ich habe das Beispiel entsprechend korrigiert.Ich bin froh, dass Sie es geschafft haben zu arbeiten :) – robertjd

Verwandte Themen