2016-01-14 10 views
14

पर प्रमाणीकरण और विशेषाधिकार फेसबुक उनके ग्राफक्लुएल लाइब्रेरी के लिए प्रमाणीकरण का उल्लेख नहीं करता है।रिले/ग्राफQL

मान लीजिए कि मेरे पास ग्राफ़क्यूएल से उपयोगकर्ता तालिका लाने योग्य है और मैं उपयोगकर्ता की जानकारी को किसी भी व्यक्ति को प्रकट नहीं करना चाहता हूं जो लॉग इन उपयोगकर्ता को छोड़कर मांगता है, मुझे किस स्तर पर प्रमाणीकरण परत जोड़नी चाहिए?

"लॉग-इन" स्थिति को बदलकर स्कीमा स्तर पर?

या शायद graphql फ़ंक्शन पर अतिरिक्त पैरामीटर पारित करके जो वर्तमान में केवल query और schema लेता है?

उत्तर

10

अपने ग्राफ़क्यूएल प्रश्नों के लिए टोकन के साथ ऑथ हेडर जोड़ना संभव है।

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

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

हालांकि यह वास्तव में दस्तावेज में स्पष्ट नहीं है, schema और query (या requestString के रूप में यह डॉक्स में कहा जाता है) के अलावा, आप भी एक rootValue पारित कर सकते हैं। यह मान आपके ग्राफ़ल्यूएल स्कीमा में प्रत्येक संकल्प फ़ंक्शन को पास कर दिया जाएगा, इसलिए यह अनुरोध है कि आप अनुरोध के साथ जोड़े गए किसी भी प्रमाणीकरण जानकारी को रखना चाहते हैं।

उदाहरण के लिए यदि आप के साथ graphql फोन:

graphql(schema, query, auth, variables) 

अपने संकल्प कार्यों में आप 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) - यह एक मापता बेहतर \ o/

2 - rootValue के आधार पर (https://stackoverflow.com/a/36001558/2628278)

3 - केवल रिले और GraphQL

का इन आधारित पहले दो दृष्टिकोणों में समस्या यह है कि आपको इसे संभालने के लिए गैर-रिले/ग्राफ़क्ल कोड का उपयोग करने की आवश्यकता है।

तीसरे दृष्टिकोण इस तरह है:

{ 
    viewer(token: String) { 
    name 
    } 
} 

पारित दर्शक को प्रमाणीकरण टोकन, और graphql यह

संभालती है आप के साथ-साथ एक परिवर्तन की आवश्यकता होगी:

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

कि टोकन या एक त्रुटि वापस कर देगा। टोकन कुकी या वेब पर स्थानीय भंडारण में संग्रहित किया जाना चाहिए, और AsyncStorage

1

पर React Native एक अन्य विकल्प पर nodkz/react-relay-network-layer के रूप में एक रिले नेटवर्क परत डिफ़ॉल्ट एक के अलावा अन्य, इस तरह का प्रयोग है।

यह नेटवर्क परत मध्यवर्ती समर्थन करता है, और आप प्रत्येक रिले अनुरोध के लिए ऑथ टोकन निर्दिष्ट करने के लिए authMiddleware इंजेक्ट कर सकते हैं। यदि आप अनुरोध को अधिकृत करने में विफल रहता है तो आप यह भी निर्दिष्ट कर सकते हैं कि क्या करना है (यानी।लॉगिन स्क्रीन पर उपयोगकर्ता भेजें)। एक उदाहरण देखें कि आप इसे कैसे सेट अप कर सकते हैं:

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

यह अनुरोध हेडर में ऑथ टोकन भेज देगा। अधिक जानकारी के लिए nodkz/react-relay-network-layer गीथब पेज पर जाएं।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^