ग्राफक्यूएल पारंपरिक रेस्टफुल एपीआई आर्किटेक्चर का एक लोकप्रिय विकल्प है, जो एपीआई के लिए एक लचीली और कुशल डेटा क्वेरी और हेरफेर भाषा की पेशकश करता है। के साथ बढ़ती स्वीकार्यता के कारण, अनुप्रयोगों को अनधिकृत पहुंच और संभावित डेटा से बचाने के लिए ग्राफक्यूएल एपीआई की सुरक्षा को प्राथमिकता देना महत्वपूर्ण हो गया है। उल्लंघन.

ग्राफक्यूएल एपीआई को सुरक्षित करने के लिए एक प्रभावी तरीका JSON वेब टोकन (JWTs) को लागू करना है। JWTs संरक्षित संसाधनों तक पहुंच प्रदान करने और अधिकृत कार्यों को करने के लिए एक सुरक्षित और कुशल तरीका प्रदान करते हैं, जिससे ग्राहकों और एपीआई के बीच सुरक्षित संचार सुनिश्चित होता है।

ग्राफक्यूएल एपीआई में प्रमाणीकरण और प्राधिकरण

भिन्न बाकी एपीआई, ग्राफक्यूएल एपीआई में आम तौर पर एक एकल समापन बिंदु होता है जो ग्राहकों को उनके प्रश्नों में गतिशील रूप से अलग-अलग मात्रा में डेटा का अनुरोध करने की अनुमति देता है। जबकि यह लचीलापन इसकी ताकत है, यह संभावित सुरक्षा हमलों जैसे टूटी हुई पहुंच नियंत्रण कमजोरियों का खतरा भी बढ़ाता है।

इस जोखिम को कम करने के लिए, पहुंच अनुमतियों को उचित रूप से परिभाषित करने सहित मजबूत प्रमाणीकरण और प्राधिकरण प्रक्रियाओं को लागू करना महत्वपूर्ण है। ऐसा करके, आप गारंटी देते हैं कि केवल अधिकृत उपयोगकर्ता ही संरक्षित संसाधनों तक पहुंच सकते हैं, और अंततः, संभावित सुरक्षा उल्लंघनों और डेटा हानि के जोखिम को कम कर सकते हैं।

instagram viewer

आप इस प्रोजेक्ट का कोड इसमें पा सकते हैं GitHub भण्डार.

एक Express.js अपोलो सर्वर सेट करें

अपोलो सर्वर ग्राफक्यूएल एपीआई के लिए व्यापक रूप से इस्तेमाल किया जाने वाला ग्राफक्यूएल सर्वर कार्यान्वयन है। आप इसका उपयोग आसानी से ग्राफक्यूएल स्कीमा बनाने, रिज़ॉल्वर को परिभाषित करने और अपने एपीआई के लिए विभिन्न डेटा स्रोतों को प्रबंधित करने के लिए कर सकते हैं।

Express.js अपोलो सर्वर स्थापित करने के लिए, एक प्रोजेक्ट फ़ोल्डर बनाएं और खोलें:

mkdir graphql-API-jwt
cd graphql-API-jwt

इसके बाद, एक नए Node.js प्रोजेक्ट का उपयोग करके आरंभ करने के लिए इस कमांड को चलाएँ एनपीएम, नोड पैकेज मैनेजर:

npm init --yes

अब, इन पैकेजों को स्थापित करें।

npm install apollo-server graphql mongoose jsonwebtokens dotenv

अंत में, एक बनाएं सर्वर.जे.एस रूट निर्देशिका में फ़ाइल करें, और इस कोड के साथ अपना सर्वर सेट करें:

const { ApolloServer } = require('apollo-server');
const mongoose = require('mongoose');
require('dotenv').config();

const typeDefs = require("./graphql/typeDefs");
const resolvers = require("./graphql/resolvers");

const server = new ApolloServer({
typeDefs,
resolvers,
context: ({ req }) => ({ req }),
});

const MONGO_URI = process.env.MONGO_URI;

mongoose
.connect(MONGO_URI, {
useNewUrlParser: true,
useUnifiedTopology: true,
})
.then(() => {
console.log("Connected to DB");
return server.listen({ port: 5000 });
})
.then((res) => {
console.log(`Server running at ${res.url}`);
})
.catch(err => {
console.log(err.message);
});

GraphQL सर्वर के साथ स्थापित किया गया है टाइपडेफ़्स और समाधानकर्ता पैरामीटर, स्कीमा और संचालन निर्दिष्ट करते हैं जिन्हें एपीआई संभाल सकता है। प्रसंग विकल्प प्रत्येक रिज़ॉल्वर के संदर्भ में req ऑब्जेक्ट को कॉन्फ़िगर करता है, जो सर्वर को हेडर मान जैसे अनुरोध-विशिष्ट विवरण तक पहुंचने की अनुमति देगा।

एक MongoDB डेटाबेस बनाएं

सबसे पहले डेटाबेस कनेक्शन स्थापित करने के लिए एक MongoDB डेटाबेस बनाएं या MongoDB एटलस पर एक क्लस्टर स्थापित करें. फिर, दिए गए डेटाबेस कनेक्शन यूआरआई स्ट्रिंग को कॉपी करें, एक बनाएं .env फ़ाइल बनाएं और कनेक्शन स्ट्रिंग इस प्रकार दर्ज करें:

MONGO_URI=""

डेटा मॉडल को परिभाषित करें

Mongoose का उपयोग करके डेटा मॉडल को परिभाषित करें। कोई नया बनाएं मॉडल/उपयोगकर्ता.जे.एस फ़ाइल बनाएं और निम्नलिखित कोड शामिल करें:

const {model, Schema} = require('mongoose');

const userSchema = new Schema({
name: String,
password: String,
role: String
});

module.exports = model('user', userSchema);

ग्राफक्यूएल स्कीमा को परिभाषित करें

ग्राफक्यूएल एपीआई में, स्कीमा उस डेटा की संरचना को परिभाषित करता है जिसे क्वेरी किया जा सकता है, साथ ही रूपरेखा भी तैयार की जा सकती है उपलब्ध ऑपरेशन (प्रश्न और उत्परिवर्तन) जिन्हें आप डेटा के साथ इंटरैक्ट करने के लिए कर सकते हैं एपीआई.

स्कीमा को परिभाषित करने के लिए, अपने प्रोजेक्ट की रूट डायरेक्टरी में एक नया फ़ोल्डर बनाएं और उसे नाम दें ग्राफ़िकल. इस फ़ोल्डर के अंदर, दो फ़ाइलें जोड़ें: typeDefs.js और रिज़ॉल्वर.जे.एस.

में typeDefs.js फ़ाइल में निम्नलिखित कोड शामिल करें:

const { gql } = require("apollo-server");

const typeDefs = gql`
type User {
id: ID!
name: String!
password: String!
role: String!
}
input UserInput {
name: String!
password: String!
role: String!
}
type TokenResult {
message: String
token: String
}
type Query {
users: [User]
}
type Mutation {
register(userInput: UserInput): User
login(name: String!, password: String!, role: String!): TokenResult
}
`;

module.exports = typeDefs;

ग्राफक्यूएल एपीआई के लिए रिज़ॉल्वर बनाएं

रिज़ॉल्वर फ़ंक्शंस यह निर्धारित करते हैं कि क्लाइंट क्वेरीज़ और म्यूटेशन के साथ-साथ स्कीमा में परिभाषित अन्य फ़ील्ड के जवाब में डेटा कैसे पुनर्प्राप्त किया जाता है। जब कोई क्लाइंट कोई क्वेरी या म्यूटेशन भेजता है, तो ग्राफक्यूएल सर्वर डेटाबेस या एपीआई जैसे विभिन्न स्रोतों से आवश्यक डेटा को संसाधित करने और वापस करने के लिए संबंधित रिज़ॉल्वर को ट्रिगर करता है।

JSON वेब टोकन (JWTs) का उपयोग करके प्रमाणीकरण और प्राधिकरण को लागू करने के लिए, रजिस्टर और लॉगिन म्यूटेशन के लिए रिज़ॉल्वर को परिभाषित करें। ये उपयोगकर्ता पंजीकरण और प्रमाणीकरण की प्रक्रियाओं को संभालेंगे। फिर, एक डेटा फ़ेच क्वेरी रिज़ॉल्वर बनाएं जो केवल प्रमाणित और अधिकृत उपयोगकर्ताओं के लिए ही पहुंच योग्य होगा।

लेकिन पहले, जेडब्ल्यूटी उत्पन्न करने और सत्यापित करने के लिए कार्यों को परिभाषित करें। में रिज़ॉल्वर.जे.एस फ़ाइल, निम्नलिखित आयात जोड़कर प्रारंभ करें।

const User = require("../models/user");
const jwt = require('jsonwebtoken');
const secretKey = process.env.SECRET_KEY;

उस गुप्त कुंजी को जोड़ना सुनिश्चित करें जिसका उपयोग आप .env फ़ाइल में JSON वेब टोकन पर हस्ताक्षर करने के लिए करेंगे।

SECRET_KEY = '';

प्रमाणीकरण टोकन उत्पन्न करने के लिए, निम्नलिखित फ़ंक्शन शामिल करें, जो JWT टोकन के लिए अद्वितीय विशेषताओं को भी निर्दिष्ट करता है, उदाहरण के लिए, समाप्ति समय। इसके अतिरिक्त, आप अपनी विशिष्ट एप्लिकेशन आवश्यकताओं के आधार पर समय पर जारी की गई अन्य विशेषताओं को भी शामिल कर सकते हैं।

functiongenerateToken(user) {
const token = jwt.sign(
{ id: user.id, role: user.role },
secretKey,
{ expiresIn: '1h', algorithm: 'HS256' }
 );

return token;
}

अब, बाद के HTTP अनुरोधों में शामिल JWT टोकन को मान्य करने के लिए टोकन सत्यापन तर्क लागू करें।

functionverifyToken(token) {
if (!token) {
thrownewError('Token not provided');
}

try {
const decoded = jwt.verify(token, secretKey, { algorithms: ['HS256'] });
return decoded;
} catch (err) {
thrownewError('Invalid token');
}
}

यह फ़ंक्शन इनपुट के रूप में एक टोकन लेगा, निर्दिष्ट गुप्त कुंजी का उपयोग करके इसकी वैधता को सत्यापित करेगा, और यदि यह वैध है तो डिकोड किए गए टोकन को वापस कर देगा, अन्यथा अमान्य टोकन का संकेत देने वाली त्रुटि फेंक देगा।

एपीआई रिज़ॉल्वर को परिभाषित करें

ग्राफक्यूएल एपीआई के लिए रिज़ॉल्वर को परिभाषित करने के लिए, आपको उन विशिष्ट परिचालनों की रूपरेखा तैयार करने की आवश्यकता है जो इसे प्रबंधित करेंगे, इस मामले में, उपयोगकर्ता पंजीकरण और लॉगिन संचालन। सबसे पहले, एक बनाएं समाधानकर्ता वह ऑब्जेक्ट जो रिज़ॉल्वर फ़ंक्शंस को धारण करेगा, फिर, निम्नलिखित उत्परिवर्तन संचालन को परिभाषित करेगा:

const resolvers = {
Mutation: {
register: async (_, { userInput: { name, password, role } }) => {
if (!name || !password || !role) {
thrownewError('Name password, and role required');
}

const newUser = new User({
name: name,
password: password,
role: role,
});

try {
const response = await newUser.save();

return {
id: response._id,
...response._doc,
};
} catch (error) {
console.error(error);
thrownewError('Failed to create user');
}
},
login: async (_, { name, password }) => {
try {
const user = await User.findOne({ name: name });

if (!user) {
thrownewError('User not found');
}

if (password !== user.password) {
thrownewError('Incorrect password');
}

const token = generateToken(user);

if (!token) {
thrownewError('Failed to generate token');
}

return {
message: 'Login successful',
token: token,
};
} catch (error) {
console.error(error);
thrownewError('Login failed');
}
}
},

पंजीकरण करवाना उत्परिवर्तन डेटाबेस में नए उपयोगकर्ता डेटा को जोड़कर पंजीकरण प्रक्रिया को संभालता है। जब लॉग इन करें उत्परिवर्तन उपयोगकर्ता लॉगिन का प्रबंधन करता है - सफल प्रमाणीकरण पर, यह एक JWT टोकन उत्पन्न करेगा, साथ ही प्रतिक्रिया में एक सफलता संदेश लौटाएगा।

अब, उपयोगकर्ता डेटा पुनर्प्राप्त करने के लिए क्वेरी रिज़ॉल्वर शामिल करें। यह सुनिश्चित करने के लिए कि यह क्वेरी केवल प्रमाणित और अधिकृत उपयोगकर्ताओं के लिए ही पहुंच योग्य होगी, केवल ऐसे उपयोगकर्ताओं तक पहुंच को प्रतिबंधित करने के लिए प्राधिकरण तर्क शामिल करें व्यवस्थापक भूमिका।

अनिवार्य रूप से, क्वेरी पहले टोकन की वैधता और फिर उपयोगकर्ता की भूमिका की जांच करेगी। यदि प्राधिकरण जांच सफल होती है, तो रिज़ॉल्वर क्वेरी डेटाबेस से उपयोगकर्ताओं का डेटा लाने और वापस करने के लिए आगे बढ़ेगी।

 Query: {
users: async (parent, args, context) => {
try {
const token = context.req.headers.authorization || '';
const decodedToken = verifyToken(token);

if (decodedToken.role !== 'Admin') {
thrownew ('Unauthorized. Only Admins can access this data.');
}

const users = await User.find({}, { name: 1, _id: 1, role:1 });
return users;
} catch (error) {
console.error(error);
thrownewError('Failed to fetch users');
}
},
},
};

अंत में, विकास सर्वर प्रारंभ करें:

node server.js

बहुत बढ़िया! अब, आगे बढ़ें, और अपने ब्राउज़र में अपोलो सर्वर एपीआई सैंडबॉक्स का उपयोग करके एपीआई की कार्यक्षमता का परीक्षण करें। उदाहरण के लिए, आप इसका उपयोग कर सकते हैं पंजीकरण करवाना डेटाबेस में नया उपयोगकर्ता डेटा जोड़ने के लिए उत्परिवर्तन, और फिर, लॉग इन करें उपयोगकर्ता को प्रमाणित करने के लिए उत्परिवर्तन।

अंत में, प्राधिकरण हेडर अनुभाग में JWT टोकन जोड़ें और उपयोगकर्ता डेटा के लिए डेटाबेस को क्वेरी करने के लिए आगे बढ़ें।

ग्राफक्यूएल एपीआई को सुरक्षित करना

ग्राफक्यूएल एपीआई को सुरक्षित करने के लिए प्रमाणीकरण और प्राधिकरण महत्वपूर्ण घटक हैं। बहरहाल, यह पहचानना महत्वपूर्ण है कि व्यापक सुरक्षा सुनिश्चित करने के लिए वे अकेले पर्याप्त नहीं हो सकते हैं। आपको इनपुट सत्यापन और संवेदनशील डेटा के एन्क्रिप्शन जैसे अतिरिक्त सुरक्षा उपाय लागू करने चाहिए।

व्यापक सुरक्षा दृष्टिकोण अपनाकर, आप अपने एपीआई को विभिन्न संभावित हमलों से सुरक्षित रख सकते हैं।