2015-10-10 20 views
9

Czy możliwe jest uwierzytelnienie użytkowników o różnych rolach wyłącznie za pośrednictwem serwera grafql w połączeniu z przekaźnikiem &?Autoryzacja użytkownika Relayjs Graphql

Rozejrzałem się i nie mogłem znaleźć wiele informacji na ten temat.

W mojej obecnej konfiguracji, funkcje logowania z różnymi rolami, wciąż przechodzą przez tradycyjny interfejs REST API ... ("zabezpieczony" jsonowymi tokenami sieciowymi).

Odpowiedz

6

Zrobiłem to w jednej z moich aplikacji, po prostu potrzebujesz interfejsu użytkownika, ten zwraca zero na pierwszym zapytaniu głównym, jeśli nikt nie jest zalogowany, a następnie możesz go zaktualizować mutacją logowania przechodzącą w dane uwierzytelniające . Głównym problemem jest pobranie plików cookie lub sesji wewnątrz żądania przekazywania postu, ponieważ nie obsługuje ono pola cookie w żądaniu.

Oto moja mutacja klient:

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

i tu jest mój schemat boczny mutacja

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

aby moje użytkowników zalogowanych poprzez odświeżenie strony mogę wysłać moje własne żądanie i wypełnić go z cookie pole ... To na razie jedyny sposób, żeby to zadziałało ...

+0

Dzięki, spróbuję jutro. Czy załączasz "Wysyłam własne żądanie i wypełniam je polem cookie" w funkcji getUserByCredentials? – Seneca

+0

tak naprawdę to jest problem z przekaźnikiem, nie masz dostępu do plików cookie w ramach żądania postu. Czekam, aż mutacja zwróci stronę klienta, a ja wyślę zupełnie nowe domowe żądanie pobierania z poświadczeniami, aby wypełnić mój plik cookie ..., a następnie odśwież, wyślij identyfikator użytkownika za pomocą html i w kwerendzie głównej przekazujesz ten identyfikator użytkownika. – Duduche

+2

W przypadku braku funkcji resetowania (która [obecnie nie ma przekaźnika] (https://github.com/facebook/relay/issues/233)), zrobienie tego za pośrednictwem samego przekaźnika prawdopodobnie nie jest dobrym pomysłem. Ponieważ Relay buforuje dane GraphQL wewnętrznie, a dane mogą być specyficzne dla użytkownika, potrzebny jest sposób unieważnienia tej pamięci podręcznej przy wylogowaniu _ lub _ login. W tej chwili zalecamy, aby ludzie odświeżali całą stronę, gdy wystąpi jedno z tych zdarzeń. – wincent