2015-10-10 15 views
9

Ist es möglich, Benutzer mit verschiedenen Rollen ausschließlich über einen graphql Server in Verbindung mit Relais & zu authentifizieren?Relayjs Graphql Benutzerauthentifizierung

Ich sah mich um und konnte nicht viele Informationen zu diesem Thema finden.

In meinem aktuellen Setup, die Login-Funktionen mit verschiedenen Rollen, gehen immer noch durch eine traditionelle REST-API ... ("gesichert" mit JSON Web-Token).

Antwort

6

Ich habe es in einer meiner App, im Grunde brauchen Sie nur eine Benutzeroberfläche, diese eine Null auf die erste Root-Abfrage, wenn niemand eingeloggt ist, und Sie können dann aktualisieren sie mit einer Login-Mutation die Anmeldeinformationen übergeben . Das Hauptproblem besteht darin, Cookies oder Sitzungen innerhalb der Post-Relay-Anfrage abzurufen, da das Cookie-Feld in der Anfrage nicht behandelt wird.

Hier ist meine Client-Mutation:

export default class LoginMutation extends Relay.Mutation { 
    static fragments = { 
    user:() => Relay.QL` 
     fragment on User { 
     id, 
     mail 
     } 
    `, 
    }; 
    getMutation() { 
    return Relay.QL`mutation{Login}`; 
    } 

    getVariables() { 
    return { 
     mail: this.props.credentials.pseudo, 
     password: this.props.credentials.password, 
    }; 
    } 
    getConfigs() { 
    return [{ 
     type: 'FIELDS_CHANGE', 
     fieldIDs: { 
     user: this.props.user.id, 
     } 
    }]; 
    } 
    getOptimisticResponse() { 
    return { 
     mail: this.props.credentials.pseudo, 
    }; 
    } 
    getFatQuery() { 
    return Relay.QL` 
    fragment on LoginPayload { 
     user { 
     userID, 
     mail 
     } 
    } 
    `; 
    } 
} 

und hier ist mein Schema Seite Mutation

var LoginMutation = mutationWithClientMutationId({ 
    name: 'Login', 
    inputFields: { 
    mail: { 
     type: new GraphQLNonNull(GraphQLString) 
    }, 
    password: { 
     type: new GraphQLNonNull(GraphQLString) 
    } 
    }, 
    outputFields: { 
    user: { 
     type: GraphQLUser, 
     resolve: (newUser) => newUser 
    } 
    }, 
    mutateAndGetPayload: (credentials, { 
    rootValue 
    }) => co(function*() { 
    var newUser = yield getUserByCredentials(credentials, rootValue); 
    console.log('schema:loginmutation'); 
    delete newUser.id; 
    return newUser; 
    }) 
}); 

meine Benutzer durch Aktualisierung der Seite angemeldet halte ich meine eigenen Wunsch und füllen Sie es mit einem Cookie senden Feld ... Dies ist für jetzt der einzige Weg, um es zum Laufen zu bringen ...

+0

Danke, ich werde es morgen versuchen. Verkapseln Sie die Funktion "Ich sende meine eigene Anfrage und fülle sie mit einem Cookie-Feld" in der Funktion getUserByCredentials? – Seneca

+0

eigentlich ist dies wirklich das Problem mit Relais, Sie haben keinen Zugriff auf Cookies unter der Post-Anfrage. Ich warte, bis die Mutation Clientseite zurücksendet, und ich sende eine nagelneue hausgemachte get-Anfrage mit Anmeldeinformationen, um meinen Cookie zu füllen ..., dann bei Aktualisierung sendest du die userID über dein html und in deiner root-Abfrage gibst du diese userID weiter. – Duduche

+2

In Abwesenheit von Reset-Funktionalität (die [Relay hat derzeit nicht] (https://github.com/facebook/relay/issues/233)), dies über Relay selbst tun ist wahrscheinlich keine gute Idee. Da Relay Daten von GraphQL intern zwischenspeichert und diese Daten möglicherweise benutzerspezifisch sind, müssen Sie diesen Cache beim Abmelden oder Anmelden deaktivieren. Im Moment empfehlen wir, dass Personen eine vollständige Seite aktualisieren, wenn eines dieser Ereignisse auftritt. – wincent