2016-01-14 11 views
14

Facebook erwähnt keine Authentifizierung für ihre GraphQLibliothek.Authentifizierung und Berechtigungen auf Relay/GraphQL

Angenommen, ich habe eine Benutzertabelle, die aus GraphQL abgerufen werden kann, und ich möchte die Benutzerinformationen niemandem offenbaren, der sie außer dem angemeldeten Benutzer benötigt. Auf welcher Ebene sollte ich die Authentifizierungsschicht hinzufügen?

Auf der Schema-Ebene durch Mutation eines "eingeloggten" Zustandes?

Oder vielleicht durch die Übergabe zusätzlicher Parameter an die graphql Funktion, die derzeit nur query und schema dauert?

Antwort

10

Es ist möglich, Auth-Header mit Token zu Ihren GraphQL-Abfragen hinzuzufügen.

var token = localStorage.getItem('id_token'); 

Relay.injectNetworkLayer(
    new Relay.DefaultNetworkLayer('http://pathtohost/graphql', { 
    headers: { 
     Authorization: token 
    } 
    }) 
); 
1

Obwohl es in der Dokumentation wirklich unklar ist, zusätzlich zu schema und query (oder requestString, wie es in der Dokumentation genannt), können Sie auch ein rootValue passieren. Dieser Wert wird an jede Auflösungsfunktion in Ihrem GraphQL-Schema übergeben. Daher müssen Sie hier alle Authentifizierungsinformationen einfügen, die mit der Anforderung verknüpft sind. wenn

Zum Beispiel rufen Sie graphql mit:

graphql(schema, query, auth, variables) 

In Ihre Entschlossenheit Funktionen haben Sie Zugriff auf auth haben:

async user(auth, args) { 
    return await db.users.find(auth, args.id) 
} 
3

Dieser Blog-Eintrag beschreibt https://medium.com/the-graphqlhub/graphql-and-authentication-b73aed34bbeb#.cpmrcqcyt 3 Arten der Authentifizierung mit Relais.

1 - basierend auf einem Token (https://stackoverflow.com/a/34843562/2628278) - diese skaliert besser \ o/

2 - basierend auf rootValue (https://stackoverflow.com/a/36001558/2628278)

3 - basierend nur in Relais und GraphQL

The Problem mit den ersten beiden Ansätzen ist, dass Sie Nicht-Relay/Graphql-Code verwenden müssen, um dies zu behandeln.

Der dritte Ansatz ist wie folgt:

{ 
    viewer(token: String) { 
    name 
    } 
} 

die Auth-Token passieren zum Betrachter und lassen graphql behandelt es

Sie werden auch eine Mutation benötigen:

mutation { 
    createToken(username: String!, password: String!) { 
    token 
    error 
    } 
} 

dass wird das Token oder einen Fehler zurückgeben. Das Token sollte in einem Cookie oder lokalen Speicher auf Internet und auf AsyncStorage auf React Native

1

Eine weitere Option gespeichert werden ist eine Relay Network Layer außer dem Standard ein, wie nodkz/react-relay-network-layer zu verwenden.

Diese Netzwerkschicht unterstützt Middlewares, und Sie können eine authMiddleware injizieren, um den Auth Token für jede Relay-Anfrage anzugeben. Sie können auch angeben, was zu tun ist, wenn der Server die Anforderung nicht autorisiertBenutzer zum Anmeldebildschirm senden). Ein Beispiel, wie Sie es einrichten können:

import { RelayNetworkLayer, urlMiddleware, authMiddleware } from 'react-relay-network-layer'; 

const middlewares = [ 
    urlMiddleware({ 
    url:() => `${graphqlAPIHost}/dragon/v2/graph` 
    }), 
    authMiddleware({ 
    token:() => auth.accessToken(), // Here you retrieve the Auth Access Token 
    tokenRefreshPromise: (req) => { 
     loginActions.logout(); // Here you specify what to do if the server returns 401 
     return req; 
    } 
    }) 
]; 
Relay.injectNetworkLayer(new RelayNetworkLayer(middlewares, { disableBatchQuery: true })); 

Dies wird das Authentifizierungs-Token in den Anfrage-Headern senden. Für weitere Informationen besuchen Sie die nodkz/react-relay-network-layer Github-Seite.