গ্রাফকিউএল (GraphQL) এবং JWT (JSON Web Tokens)-এর সংমিশ্রণ সাধারণত একটি নিরাপদ অথেনটিকেশন ব্যবস্থা তৈরি করতে ব্যবহৃত হয়। JWT হল একটি কমপ্যাক্ট এবং স্ব-সন্তুষ্ট অথেনটিকেশন টোকেন যা ব্যবহারকারীর তথ্য সংরক্ষণ করে এবং সার্ভারের সাথে যোগাযোগের জন্য ব্যবহার করা হয়। এটি একটি স্ট্যাটলেস অথেনটিকেশন পদ্ধতি যা সার্ভারের উপর অতিরিক্ত লোড না বাড়িয়ে নিরাপদভাবে ক্লায়েন্ট-সার্ভার কমিউনিকেশন পরিচালনা করতে সাহায্য করে।
GraphQL এবং JWT একসাথে ব্যবহার করা হলে, আপনি একটি নিরাপদ GraphQL API তৈরি করতে পারেন যেখানে ব্যবহারকারীরা একটি JWT টোকেন পাঠিয়ে সিস্টেমে প্রবেশ করতে পারে এবং তারপর তারা সুরক্ষিত রিসোর্সে অ্যাক্সেস পেতে পারে।
JWT কী?
JWT (JSON Web Token) একটি ওপেন স্ট্যান্ডার্ড যা ব্যবহারকারীর পরিচয় নিশ্চিত করতে ব্যবহৃত হয়। এটি তিনটি অংশে বিভক্ত থাকে:
- Header: টোকেনের ধরন এবং সিগনেচার এলগরিদমের তথ্য ধারণ করে।
- Payload: ব্যবহারকারীর তথ্য (claims) ধারণ করে, যেমন ব্যবহারকারীর নাম বা অনুমতি।
- Signature: নিরাপত্তার জন্য, একটি সিক্রেট কী দ্বারা তৈরি সিগনেচার যা টোকেনের অখণ্ডতা নিশ্চিত করে।
এটি সার্ভারকে একাধিক রিকোয়েস্টের জন্য একইভাবে অথেনটিকেট করতে সাহায্য করে এবং স্টেটলেস সিস্টেম তৈরি করতে সহায়ক।
JWT Authentication-এ GraphQL ব্যবহার
গ্রাফকিউএল-এর মধ্যে JWT Authentication সেটআপ করার জন্য, সাধারণত তিনটি প্রধান ধাপ অনুসরণ করতে হয়:
- Login: ব্যবহারকারী তার পরিচয় নিশ্চিত করতে লগইন করবে এবং একটি JWT টোকেন পাবে।
- Token Validation: প্রতি গ্রাফকিউএল রিকোয়েস্টের সাথে টোকেন পাঠানো হবে, এবং সার্ভার টোকেনটি যাচাই করবে।
- Access Control: ব্যবহারকারীর অনুমতি চেক করার জন্য টোকেনের ডেটা ব্যবহার করা হবে, এবং সঠিক অ্যাক্সেস প্রদান করা হবে।
ধাপ ১: JWT টোকেন তৈরি করা
প্রথমে, আপনি একটি ব্যবহারকারী সিস্টেম তৈরি করবেন যেখানে ব্যবহারকারী লগইন করলে একটি JWT টোকেন জেনারেট হবে। এতে jsonwebtoken লাইব্রেরি ব্যবহার করা হয়।
npm install jsonwebtoken
Token Generation Example:
const jwt = require('jsonwebtoken');
const SECRET_KEY = 'your_secret_key';
function generateToken(user) {
const payload = {
userId: user.id,
username: user.username
};
const token = jwt.sign(payload, SECRET_KEY, { expiresIn: '1h' });
return token;
}
এখানে:
- payload: এই অংশে ব্যবহারকারীর আইডি, নাম ইত্যাদি তথ্য রাখা হয়।
- SECRET_KEY: এটি একটি সিক্রেট কী যা সিগনেচার তৈরি করতে ব্যবহৃত হয়।
- expiresIn: টোকেনের মেয়াদ নির্ধারণ করে (এখানে ১ ঘণ্টা)।
ধাপ ২: Token Validation
ব্যবহারকারী যখন কোনো গ্রাফকিউএল রিকোয়েস্ট পাঠায়, তখন টোকেনটি সার্ভারের কাছে যাচাই করতে হবে। Authorization Header-এ JWT টোকেন পাঠানো হয় এবং সার্ভার সেই টোকেন যাচাই করে ব্যবহারকারীর অনুমতি চেক করে।
Token Validation Example:
const jwt = require('jsonwebtoken');
const SECRET_KEY = 'your_secret_key';
function verifyToken(token) {
try {
const decoded = jwt.verify(token, SECRET_KEY);
return decoded; // return decoded token data
} catch (error) {
throw new Error('Invalid or expired token');
}
}
এখানে, jwt.verify() ফাংশনটি JWT টোকেনের ভ্যালিডিটি চেক করে এবং decoded payload ফেরত দেয়।
ধাপ ৩: Authorization Middleware
GraphQL এ টোকেন যাচাই করার জন্য সাধারণত একটি middleware ব্যবহার করা হয় যা প্রতিটি রিকোয়েস্টে চলবে এবং টোকেন যাচাই করবে।
Middleware Example:
const { ApolloServer } = require('apollo-server');
const jwt = require('jsonwebtoken');
const SECRET_KEY = 'your_secret_key';
// Middleware to check token in the request
const checkAuth = (req) => {
const token = req.headers.authorization || '';
if (!token) {
throw new Error('Authorization token is required');
}
try {
const decoded = jwt.verify(token, SECRET_KEY);
req.user = decoded;
} catch (error) {
throw new Error('Invalid or expired token');
}
};
const server = new ApolloServer({
schema,
context: ({ req }) => {
checkAuth(req);
return { user: req.user };
},
});
এখানে:
- Authorization Header: টোকেনটি
Authorizationহেডারে পাঠানো হয়। - checkAuth ফাংশনটি রিকোয়েস্টের টোকেন যাচাই করে এবং ব্যবহারকারীর তথ্য context-এ পাস করে।
ধাপ ৪: Secure GraphQL Resolvers
একবার টোকেনটি যাচাই করা হলে, আপনি বিভিন্ন GraphQL resolvers এ ব্যবহারকারীর অ্যাক্সেস অনুমতি যাচাই করতে পারেন। উদাহরণস্বরূপ, আপনি একটি protected রিসোর্স তৈরি করতে পারেন যেটি শুধুমাত্র অথেনটিকেটেড ব্যবহারকারীদের জন্য অ্যাক্সেসযোগ্য হবে।
Resolver Example:
const resolvers = {
Query: {
getUser: async (parent, args, context) => {
if (!context.user) {
throw new Error('Not authenticated');
}
// এখানে context.user থেকে ব্যবহারকারীর তথ্য পাওয়া যাবে
return await getUserFromDatabase(context.user.userId);
}
}
};
এখানে:
- context.user: এটি
checkAuthমিডলওয়্যার থেকে প্রাপ্ত ব্যবহারকারীর তথ্য। - getUser: এটি শুধুমাত্র অথেনটিকেটেড ব্যবহারকারীদের জন্য উপলব্ধ থাকবে।
ধাপ ৫: GraphQL Request Example
একটি ব্যবহারকারী লগইন করলে, তিনি একটি JWT টোকেন পাবেন এবং তার পরবর্তী রিকোয়েস্টে এটি Authorization Header-এ পাঠাবেন।
Client Request Example (Apollo Client):
const token = 'your-jwt-token'; // The token you received after login
const client = new ApolloClient({
uri: 'http://localhost:4000/graphql',
headers: {
Authorization: `Bearer ${token}`,
},
});
client.query({
query: GET_USER_QUERY,
})
.then(response => console.log(response))
.catch(error => console.error(error));
এখানে, Authorization header-এ Bearer ${token} পাঠানো হচ্ছে, যা সার্ভারে যাচাই করার জন্য পাঠানো হবে।
সারাংশ
JWT (JSON Web Token) ব্যবহার করে GraphQL Authentication একটি স্ট্যাটলেস অথেনটিকেশন প্রক্রিয়া প্রদান করে যা নিরাপদ এবং স্কেলেবল। আপনি যখন GraphQL API তৈরি করেন, তখন ব্যবহারকারী লগইন করে JWT টোকেন পায় এবং তার পরবর্তী রিকোয়েস্টে এই টোকেন পাঠায়। সার্ভার টোকেন যাচাই করে এবং অনুমতি চেক করে সঠিক ডেটা ফেরত দেয়। Apollo Server এবং jsonwebtoken এর মাধ্যমে এটি সহজেই বাস্তবায়িত করা যায়, এবং এর মাধ্যমে একটি সুরক্ষিত অথেনটিকেশন ব্যবস্থা তৈরি করা সম্ভব হয়।
Read more