2016-01-14 3 views
14

В Facebook не упоминается аутентификация для их библиотеки GraphQL.Аутентификация и привилегии на Relay/GraphQL

Предположим, у меня есть таблица пользователей, извлекаемая из GraphQL, и я не хочу раскрывать информацию о пользователях всем, кто ее требует, кроме зарегистрированного пользователя, на каком уровне я должен добавить уровень аутентификации?

На уровне схемы, изменяя состояние «вошедшего в систему»?

Возможно, передав дополнительные параметры функции graphql, которая в настоящее время принимает только query и schema?

ответ

10

К вашим запросам GraphQL можно добавить заголовок auth с токеном.

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

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

Хотя это действительно неясно, в документации, в дополнение к schema и query (или requestString, как это называется в документации), вы можете также передать rootValue. Это значение будет передано каждой функции разрешения в вашей схеме GraphQL, поэтому вы хотите поместить любую информацию аутентификации, связанную с запросом.

Например, если вы звоните graphql с:

graphql(schema, query, auth, variables) 

В ваши функции Resolve вы будете иметь доступ к auth:

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

Этот блог https://medium.com/the-graphqlhub/graphql-and-authentication-b73aed34bbeb#.cpmrcqcyt описывает 3 типа аутентификации с реле.

1 - на основе маркера (https://stackoverflow.com/a/34843562/2628278) - это один лучше масштабируется \ о/

2 - на основе rootValue (https://stackoverflow.com/a/36001558/2628278)

3 - на основе только реле и GraphQL

The проблема с первыми двумя подходами заключается в том, что для этого вам необходимо использовать код non-relay/graphql.

Третий подход таков:

{ 
    viewer(token: String) { 
    name 
    } 
} 

передать маркер аутентификации для зрителя, и пусть graphql обрабатывает его

вам потребуется мутацию, а:

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

что вернет токен или ошибку. Маркер должен храниться в куки или локального хранения на сети, и на AsyncStorage на React Native

1

Другой вариант заключается в использовании реле Network Layer, кроме установленного по умолчанию, такие, как nodkz/react-relay-network-layer.

Этот сетевой уровень поддерживает средние сети, и вы можете ввести authMiddleware, чтобы указать Auth Token для каждого запроса на Relay. Вы также можете указать, что делать, если сервер не авторизует запрос (т.отправьте пользователя на экран входа в систему). Смотрите пример того, как можно настроить:

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 })); 

Это будет посылать маркер аутентификации в заголовках запроса. Для получения дополнительной информации перейдите на страницу gitub nodkz/react-relay-network-layer.

Смежные вопросы