Аутентификация пользователя Relayjs Graphql

Можно ли аутентифицировать пользователей с разными ролями исключительно через сервер graphql в сочетании с ретрансляцией и реакцией?

Я посмотрел вокруг, и не мог найти много информации по этой теме.

В моей текущей настройке функции входа в систему с разными ролями по-прежнему проходят через традиционный REST API... («защищенный» с помощью веб-токенов json).


person Seneca    schedule 10.10.2015    source источник


Ответы (1)


Я сделал это в одном из своих приложений, в основном вам просто нужен пользовательский интерфейс, этот возвращает ноль при первом корневом запросе, если никто не вошел в систему, и вы можете затем обновить его с помощью мутации входа в систему, передавая учетные данные. Основная проблема заключается в том, чтобы получить файлы cookie или сеанс внутри запроса ретрансляции сообщений, поскольку он не обрабатывает поле файла cookie в запросе.

Вот моя клиентская мутация:

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

и вот моя побочная мутация схемы

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

чтобы мои пользователи регистрировались через обновление страницы, я отправляю свой собственный запрос и заполняю его полем cookie... На данный момент это единственный способ заставить его работать...

person Duduche    schedule 10.10.2015
comment
Спасибо, завтра попробую. Вы инкапсулируете «я отправляю свой собственный запрос и заполняю его полем cookie» в функции getUserByCredentials? - person Seneca; 10.10.2015
comment
на самом деле это действительно проблема с реле, у вас нет доступа к файлам cookie по почтовому запросу. Я жду, пока мутация вернет клиентскую сторону, и отправлю новый домашний запрос на получение с учетными данными для заполнения моего файла cookie..., затем при обновлении вы отправляете идентификатор пользователя через свой html, а в своем корневом запросе вы передаете этот идентификатор пользователя. - person Duduche; 10.10.2015
comment
При отсутствии функции сброса (которой в настоящее время Relay нет), выполнение этого через Relay само по себе, вероятно, не очень хорошая идея. Поскольку Relay кэширует данные GraphQL внутри, и эти данные могут быть специфичными для пользователя, вам нужен способ аннулировать этот кеш при выходе или входа. На данный момент мы рекомендуем пользователям выполнять полное обновление страницы при возникновении любого из этих событий. - person wincent; 12.10.2015