GraphQL এবং Authentication

গ্রাফকিউএল (GraphQL) - Web Development

268

গ্রাফকিউএল (GraphQL) এবং Authentication একসাথে ব্যবহৃত হলে একটি শক্তিশালী API সুরক্ষা ব্যবস্থা তৈরি করতে পারে। Authentication হল ব্যবহারকারীদের শনাক্তকরণের প্রক্রিয়া, যেখানে তারা নিজেকে পরিচিত করে API এর মাধ্যমে বিভিন্ন তথ্য অ্যাক্সেস করতে পারে। GraphQL এর ক্ষেত্রে, Authentication সাধারণত Token-based authentication, যেমন JWT (JSON Web Token) ব্যবহার করে পরিচালিত হয়। এই প্রক্রিয়াটি অ্যাপ্লিকেশন এবং API এর মধ্যে নিরাপদে ডেটা পাঠানোর এবং অ্যাক্সেস করার জন্য ব্যবহৃত হয়।


GraphQL এবং Authentication এর মৌলিক ধারণা

Authentication এবং Authorization গ্রাফকিউএল অ্যাপ্লিকেশনের দুটি গুরুত্বপূর্ণ অংশ। Authentication ব্যবহারকারীর পরিচয় যাচাই করার প্রক্রিয়া, যেখানে Authorization হল নিশ্চিতকরণ যে, কোনো ব্যবহারকারী নির্দিষ্ট রিসোর্সে অ্যাক্সেস পাবে কিনা।

  • Authentication: API এর মাধ্যমে পরিচয় নিশ্চিত করা (যেমন, ইউজারের লগইন, পাসওয়ার্ড যাচাই)।
  • Authorization: ব্যবহারকারীকে কী কী তথ্য অ্যাক্সেস করার অনুমতি দেওয়া হবে তা নির্ধারণ করা।

GraphQL API এর মধ্যে Authentication পরিচালনার জন্য সাধারণত Bearer Token (যেমন JWT) ব্যবহৃত হয়, যা একটি HTTP Header এর মাধ্যমে প্রেরিত হয় এবং সার্ভার ব্যবহারকারীকে যাচাই করে।


GraphQL-এ Authentication কিভাবে কাজ করে?

গ্রাফকিউএল অ্যাপ্লিকেশনগুলিতে সাধারণত HTTP Request Headers বা Authorization headers-এ JWT (JSON Web Token) পাঠানো হয়, এবং সার্ভার সেই টোকেন যাচাই করে ব্যবহারকারীর পরিচয় নিশ্চিত করে। JWT এর মাধ্যমে Authentication প্রক্রিয়া সহজে ও নিরাপদে পরিচালনা করা যায়।

  1. Client থেকে Authorization HeaderJWT পাঠানো হয়।
  2. Server এই JWT যাচাই করে এবং সেটি বৈধ হলে ব্যবহারকারীকে সঠিক ডেটা রিটার্ন করে।
  3. যদি JWT অবৈধ হয়, তবে একটি Unauthorized ত্রুটি ফেরত পাঠানো হয়।

GraphQL এবং JWT (JSON Web Token) Authentication উদাহরণ

ধরা যাক, আপনি একটি গ্রাফকিউএল অ্যাপ্লিকেশন তৈরি করছেন যেখানে ব্যবহারকারী লগইন করতে পারে এবং তাদের ডেটা অ্যাক্সেস করতে JWT ব্যবহার করবে।

১. JWT এর মাধ্যমে Authentication প্রক্রিয়া:

JWT (JSON Web Token) হলো একটি স্ট্যান্ডার্ড যা দুটি পক্ষের মধ্যে নিরাপদে ডেটা আদান-প্রদান করতে সাহায্য করে। JWT এর মধ্যে সাধারণত একটি Header, Payload, এবং Signature থাকে যা ডেটা যাচাই ও নিরাপত্তা নিশ্চিত করে।

JWT তৈরি করা:

প্রথমে, একটি ব্যবহারকারী লগইন করলে, সার্ভার একটি JWT তৈরি করে এবং ক্লায়েন্টকে পাঠায়। এখানে একটি Node.js সার্ভারে JWT তৈরি করার উদাহরণ দেওয়া হলো:

npm install jsonwebtoken
const jwt = require('jsonwebtoken');

// Secret key
const secretKey = "yourSecretKey";

// JWT তৈরি করা
function generateToken(user) {
  return jwt.sign(
    {
      id: user.id,
      email: user.email,
      name: user.name
    },
    secretKey,
    { expiresIn: '1h' } // 1 ঘন্টার জন্য টোকেন বৈধ
  );
}

// উদাহরণ হিসেবে ইউজারের তথ্য
const user = {
  id: "1",
  name: "John Doe",
  email: "john.doe@example.com"
};

const token = generateToken(user);
console.log(token); // JWT টোকেন

এখানে generateToken ফাংশনটি ইউজারের তথ্য নিয়ে একটি JWT টোকেন তৈরি করছে এবং সেটা ক্লায়েন্টে পাঠানো হবে।

২. Client থেকে Token পাঠানো

ক্লায়েন্টে লগইন করার পরে, JWT সাধারণত Authorization header এর মাধ্যমে API রিকুয়েস্টে পাঠানো হয়।

fetch('https://yourapi.com/graphql', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${token}`, // JWT টোকেন এখানে পাঠানো হচ্ছে
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    query: `
      query {
        getUser {
          id
          name
        }
      }
    `
  })
})
.then(response => response.json())
.then(data => console.log(data))

৩. Server-এ Token যাচাই করা

এখন, GraphQL সার্ভারে JWT যাচাই করার জন্য একটি middleware ব্যবহার করা হবে যা রিকুয়েস্টের Authorization header থেকে টোকেন বের করে এবং সেটি যাচাই করে।

const jwt = require('jsonwebtoken');
const { ApolloServer, gql } = require('apollo-server');

// Secret key
const secretKey = "yourSecretKey";

// Authentication Middleware
const authenticate = (req) => {
  const token = req.headers.authorization || '';
  if (!token) {
    throw new Error('Authentication required');
  }
  try {
    const decoded = jwt.verify(token.split(' ')[1], secretKey);
    return decoded; // Token validated successfully
  } catch (error) {
    throw new Error('Invalid or expired token');
  }
};

// GraphQL Schema
const typeDefs = gql`
  type User {
    id: ID!
    name: String!
    email: String!
  }

  type Query {
    getUser: User
  }
`;

// Resolvers
const resolvers = {
  Query: {
    getUser: (parent, args, context) => {
      // Use context to access authenticated user data
      return { id: context.id, name: "John Doe", email: "john.doe@example.com" };
    }
  }
};

// Apollo Server setup with authentication middleware
const server = new ApolloServer({
  typeDefs,
  resolvers,
  context: ({ req }) => {
    const user = authenticate(req); // Authenticate the user based on the JWT token
    return { id: user.id }; // Add user data to context
  }
});

server.listen().then(({ url }) => {
  console.log(`Server ready at ${url}`);
});

এখানে:

  • authenticate ফাংশনটি Authorization header থেকে JWT টোকেন নিয়ে সেটি যাচাই করে।
  • যদি টোকেন বৈধ হয়, তবে contextuser এর তথ্য যুক্ত হয়, এবং getUser রেজোলভার সেই তথ্য ব্যবহার করে সঠিক ডেটা ফেরত দেয়।

Authentication এবং Authorization এর পার্থক্য

  1. Authentication:
    • ব্যবহারকারীকে শনাক্ত করা।
    • সাধারণত ইউজারের username, password, বা JWT ব্যবহার করে সম্পন্ন করা হয়।
    • উদাহরণ: লগইন করার সময় ব্যবহারকারী নিজের পরিচয় প্রমাণ করে।
  2. Authorization:
    • ব্যবহারকারীকে কোন রিসোর্স অ্যাক্সেস করার অনুমতি দেয়।
    • এটি roles বা permissions এর উপর ভিত্তি করে কাজ করে।
    • উদাহরণ: একটি অ্যাডমিন ইউজারের জন্য ডেটাবেসের সম্পূর্ণ অ্যাক্সেস, তবে সাধারণ ইউজারের জন্য শুধু তাদের নিজস্ব ডেটা।

সারাংশ

GraphQL এবং Authentication একত্রে ব্যবহৃত হলে এটি একটি নিরাপদ API তৈরি করতে সাহায্য করে, যেখানে JWT (JSON Web Token) এর মাধ্যমে ব্যবহারকারীর পরিচয় যাচাই করা হয়। Authorization-এর মাধ্যমে ব্যবহারকারীর পারমিশন নিশ্চিত করা হয়, যাতে তারা নির্দিষ্ট রিসোর্স বা ডেটাতে অ্যাক্সেস পেতে পারে। GraphQL সার্ভার JWT টোকেন যাচাই করে এবং সফলভাবে অ্যাক্সেস পাওয়া ব্যবহারকারীকে ডেটা সরবরাহ করে।

Content added By

গ্রাফকিউএল (GraphQL)-এ User Authentication অত্যন্ত গুরুত্বপূর্ণ, বিশেষত যখন আপনি একটি নিরাপদ এবং স্কেলেবল অ্যাপ্লিকেশন তৈরি করছেন। গ্রাফকিউএল এর মাধ্যমে ইউজার অটেন্টিকেশন সিস্টেম তৈরি করার জন্য কিছু সেরা প্র্যাকটিস অনুসরণ করা প্রয়োজন, যা শুধু নিরাপত্তা নিশ্চিত করবে না, বরং আপনার অ্যাপ্লিকেশনটিকে আরও দক্ষ এবং ব্যবহারে সহজ করে তুলবে।

এখানে গ্রাফকিউএল এর জন্য ইউজার অটেন্টিকেশন সম্পর্কিত সেরা প্র্যাকটিসগুলো আলোচনা করা হলো।


1. JWT (JSON Web Tokens) ব্যবহার করা

JWT একটি স্ট্যান্ডার্ড অথেন্টিকেশন টোকেন যা সার্ভার এবং ক্লায়েন্টের মধ্যে নিরাপদভাবে তথ্য আদান-প্রদান করতে ব্যবহৃত হয়। এটি সাধারণত ইউজার লগইন করার পর সার্ভার থেকে একটি টোকেন তৈরি করে ক্লায়েন্টকে পাঠানো হয় এবং পরবর্তীতে গ্রাফকিউএল কুয়েরি বা মিউটেশনের জন্য এই টোকেনটি ব্যবহৃত হয়।

JWT ব্যবহারের প্রক্রিয়া:

  1. ইউজার লগইন করলে সার্ভার একটি JWT টোকেন তৈরি করে।
  2. ক্লায়েন্ট এই টোকেনটি স্থানীয়ভাবে (যেমন, localStorage বা sessionStorage) সংরক্ষণ করে।
  3. পরবর্তীতে, ক্লায়েন্ট গ্রাফকিউএল API কল করার সময় টোকেনটি Authorization header-এ পাঠায়।
  4. সার্ভার টোকেন যাচাই করে, যদি এটি বৈধ হয়, তবে ইউজারকে প্রমাণিত হিসেবে চিহ্নিত করে কুয়েরি বা মিউটেশন প্রসেস করতে দেয়।
// JWT টোকেন তৈরি করার উদাহরণ
const jwt = require('jsonwebtoken');

const generateToken = (user) => {
  return jwt.sign({ userId: user.id }, 'your-secret-key', { expiresIn: '1h' });
};

JWT টোকেন পাঠানো:

query {
  getUserData {
    id
    name
  }
}

Authorization header:

Authorization: Bearer <your-jwt-token>

2. Token Expiry এবং Refresh Token ব্যবহারের ব্যবস্থা করা

JWT টোকেনের সাধারণত একটি expire time থাকে। টোকেনের মেয়াদ শেষ হলে ইউজারের আর কোনো রিকোয়েস্ট গ্রহণ করা যায় না। এর জন্য Refresh Tokens ব্যবহৃত হয়, যা ইউজারের পুরনো টোকেনটি অগ্রাহ্য করে নতুন টোকেন পেতে সাহায্য করে।

Refresh Token এর প্রক্রিয়া:

  1. ইউজারের JWT টোকেনের মেয়াদ শেষ হলে, ক্লায়েন্ট Refresh Token পাঠায়।
  2. সার্ভার এই Refresh Token যাচাই করে এবং নতুন JWT টোকেন প্রদান করে।

এটি সাধারণত একটি secure cookie অথবা HTTP-only cookie-এ সংরক্ষিত থাকে, যাতে টোকেন চুরি হওয়ার ঝুঁকি কমে।

const refreshToken = jwt.sign({ userId: user.id }, 'your-refresh-secret', { expiresIn: '7d' });

3. HTTPS ব্যবহার করা

HTTPS (Hypertext Transfer Protocol Secure) সব সময় ব্যবহার করা উচিত। এটি সব ধরনের ডেটা, বিশেষ করে Authorization Token বা JWT এর নিরাপত্তা নিশ্চিত করে। HTTPS ছাড়া ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা আদান-প্রদান করা অত্যন্ত ঝুঁকিপূর্ণ হতে পারে, কারণ ডেটা সহজেই man-in-the-middle attacks এর শিকার হতে পারে।


4. Role-based Access Control (RBAC) বাস্তবায়ন করা

গ্রাফকিউএল API এর মধ্যে Role-based Access Control (RBAC) বাস্তবায়ন করা গুরুত্বপূর্ণ, বিশেষত যখন বিভিন্ন ধরনের ইউজার (যেমন: অ্যাডমিন, সাধারণ ইউজার) বিভিন্ন স্তরের অ্যাক্সেস পায়। প্রতিটি কুয়েরি বা মিউটেশন এর জন্য নির্দিষ্ট রোলের ইউজারের অনুমতি দিতে পারেন।

RBAC উদাহরণ:

আপনার GraphQL রেজোলভারগুলিতে ইউজারের রোল চেক করতে পারেন।

const { AuthenticationError } = require('apollo-server');

// রেজোলভার উদাহরণ
const resolvers = {
  Query: {
    getAdminData: (parent, args, context) => {
      if (context.user.role !== 'admin') {
        throw new AuthenticationError('Access denied');
      }
      return getAdminDataFromDatabase();
    },
  },
};

এখানে:

  • context.user.role ইউজারের রোল চেক করে, যদি এটি admin না হয়, তবে অ্যাক্সেস অস্বীকার করা হবে।

5. Authorization Header যাচাই করা

আপনার গ্রাফকিউএল সার্ভারে একটি middleware ব্যবহার করে আপনি সহজেই Authorization Header যাচাই করতে পারেন, যা টোকেনের বৈধতা পরীক্ষা করবে এবং ইউজারকে অথেন্টিকেট করবে।

Middleware উদাহরণ:

const { AuthenticationError } = require('apollo-server');
const jwt = require('jsonwebtoken');

const authenticateUser = (req) => {
  const token = req.headers.authorization || '';
  if (!token) throw new AuthenticationError('Authentication token missing');
  
  try {
    const decoded = jwt.verify(token, 'your-secret-key');
    return decoded;
  } catch (error) {
    throw new AuthenticationError('Invalid or expired token');
  }
};

এটি গ্রাফকিউএল সার্ভারে প্রতিটি রিকোয়েস্টের সাথে ব্যবহার করতে পারবেন, যা সার্ভারের প্রতিটি কুয়েরি বা মিউটেশন প্রক্রিয়ার আগে ইউজারকে প্রমাণিত করবে।


6. Sensitive Information হ্যান্ডলিং

অটেন্টিকেশন প্রক্রিয়া এবং অন্যান্য সিকিউরিটি ফিচারগুলোর মধ্যে Sensitive Information (যেমন পাসওয়ার্ড) কখনো সরাসরি গ্রাফকিউএল কুয়েরির মাধ্যমে ক্লায়েন্ট থেকে সার্ভারে পাঠানো উচিত নয়। এর পরিবর্তে, পাসওয়ার্ড হ্যাশিং (যেমন bcrypt) এবং সঠিক নিরাপত্তা ব্যবস্থা ব্যবহার করতে হবে।

পাসওয়ার্ড হ্যাশিং:

const bcrypt = require('bcrypt');

const hashPassword = async (password) => {
  return await bcrypt.hash(password, 10);
};

const comparePassword = async (password, hash) => {
  return await bcrypt.compare(password, hash);
};

এটি সার্ভারে পাসওয়ার্ড যাচাই করার জন্য ব্যবহার করা হয়।


7. Secure Cookies ব্যবহার করা

এটি নিরাপত্তা নিশ্চিত করার একটি অত্যন্ত গুরুত্বপূর্ণ পদ্ধতি। আপনার JWT টোকেন বা Refresh Token নিরাপদে HTTP-only cookies তে সংরক্ষণ করা উচিত যাতে JavaScript অ্যাক্সেস না করতে পারে এবং Cross-site scripting (XSS) আক্রমণ থেকে রক্ষা পাওয়া যায়।

res.cookie('jwt', token, {
  httpOnly: true,
  secure: process.env.NODE_ENV === 'production',  // Only set secure cookies in production
  maxAge: 3600000  // 1 hour
});

সারাংশ

গ্রাফকিউএল অ্যাপ্লিকেশনে ইউজার অটেন্টিকেশন ব্যবস্থাপনার জন্য কিছু সেরা প্র্যাকটিসগুলো অন্তর্ভুক্ত করেছে JWT ব্যবহার, Refresh Token ব্যবস্থা, HTTPS প্রটোকল, Role-based Access Control, Token validation, এবং Secure Cookies। এগুলোর মাধ্যমে আপনি নিরাপদ, স্কেলেবল এবং কার্যকরী অথেন্টিকেশন সিস্টেম তৈরি করতে পারেন, যা আপনার অ্যাপ্লিকেশনকে নিরাপদ এবং শক্তিশালী করে তোলে।

Content added By

গ্রাফকিউএল (GraphQL) এবং JWT (JSON Web Tokens)-এর সংমিশ্রণ সাধারণত একটি নিরাপদ অথেনটিকেশন ব্যবস্থা তৈরি করতে ব্যবহৃত হয়। JWT হল একটি কমপ্যাক্ট এবং স্ব-সন্তুষ্ট অথেনটিকেশন টোকেন যা ব্যবহারকারীর তথ্য সংরক্ষণ করে এবং সার্ভারের সাথে যোগাযোগের জন্য ব্যবহার করা হয়। এটি একটি স্ট্যাটলেস অথেনটিকেশন পদ্ধতি যা সার্ভারের উপর অতিরিক্ত লোড না বাড়িয়ে নিরাপদভাবে ক্লায়েন্ট-সার্ভার কমিউনিকেশন পরিচালনা করতে সাহায্য করে।

GraphQL এবং JWT একসাথে ব্যবহার করা হলে, আপনি একটি নিরাপদ GraphQL API তৈরি করতে পারেন যেখানে ব্যবহারকারীরা একটি JWT টোকেন পাঠিয়ে সিস্টেমে প্রবেশ করতে পারে এবং তারপর তারা সুরক্ষিত রিসোর্সে অ্যাক্সেস পেতে পারে।


JWT কী?

JWT (JSON Web Token) একটি ওপেন স্ট্যান্ডার্ড যা ব্যবহারকারীর পরিচয় নিশ্চিত করতে ব্যবহৃত হয়। এটি তিনটি অংশে বিভক্ত থাকে:

  1. Header: টোকেনের ধরন এবং সিগনেচার এলগরিদমের তথ্য ধারণ করে।
  2. Payload: ব্যবহারকারীর তথ্য (claims) ধারণ করে, যেমন ব্যবহারকারীর নাম বা অনুমতি।
  3. Signature: নিরাপত্তার জন্য, একটি সিক্রেট কী দ্বারা তৈরি সিগনেচার যা টোকেনের অখণ্ডতা নিশ্চিত করে।

এটি সার্ভারকে একাধিক রিকোয়েস্টের জন্য একইভাবে অথেনটিকেট করতে সাহায্য করে এবং স্টেটলেস সিস্টেম তৈরি করতে সহায়ক।


JWT Authentication-এ GraphQL ব্যবহার

গ্রাফকিউএল-এর মধ্যে JWT Authentication সেটআপ করার জন্য, সাধারণত তিনটি প্রধান ধাপ অনুসরণ করতে হয়:

  1. Login: ব্যবহারকারী তার পরিচয় নিশ্চিত করতে লগইন করবে এবং একটি JWT টোকেন পাবে।
  2. Token Validation: প্রতি গ্রাফকিউএল রিকোয়েস্টের সাথে টোকেন পাঠানো হবে, এবং সার্ভার টোকেনটি যাচাই করবে।
  3. 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 এর মাধ্যমে এটি সহজেই বাস্তবায়িত করা যায়, এবং এর মাধ্যমে একটি সুরক্ষিত অথেনটিকেশন ব্যবস্থা তৈরি করা সম্ভব হয়।

Content added By

Authorization এবং Access Control হল নিরাপত্তার দুটি গুরুত্বপূর্ণ দিক, যা গ্রাফকিউএল (GraphQL) API-তে ডেটার সঠিক অ্যাক্সেস নিশ্চিত করতে ব্যবহৃত হয়। যখন আপনি একটি গ্রাফকিউএল API তৈরি করেন, তখন এটি নিশ্চিত করা অত্যন্ত গুরুত্বপূর্ণ যে ব্যবহারকারীরা তাদের প্রয়োজনীয় অনুমতি অনুযায়ী ডেটা অ্যাক্সেস করতে সক্ষম, এবং কোনো অবৈধ বা অনুপযুক্ত অ্যাক্সেস হতে না পারে। এ ক্ষেত্রে, Authorization এবং Access Control পদ্ধতি সঠিকভাবে প্রয়োগ করা প্রয়োজন।


Authorization এবং Access Control কী?

  • Authorization:
    Authorization হল একটি প্রক্রিয়া যেখানে একটি সিস্টেম নির্ধারণ করে যে কোন ব্যবহারকারী কোন ধরনের অ্যাক্সেস পাবে। উদাহরণস্বরূপ, একজন ব্যবহারকারী যদি শুধু পড়ার অনুমতি পায়, তবে তারা শুধুমাত্র ডেটা পড়তে সক্ষম হবে, কিন্তু পরিবর্তন বা মুছে ফেলতে পারবে না। এই প্রক্রিয়াটি নিশ্চিত করে যে সিস্টেমে লগইন করা ব্যবহারকারীরা কেবল তাদের অনুমোদিত ডেটা বা অ্যাকশনগুলোরই অ্যাক্সেস পাবে।
  • Access Control:
    Access Control হল নিরাপত্তা ব্যবস্থার একটি পদ্ধতি যা নির্ধারণ করে যে কোন ব্যবহারকারী কি ধরনের তথ্য বা সেবা অ্যাক্সেস করতে পারে। এটি অনেক সময় রোল-বেসড এক্সেস কন্ট্রোল (RBAC) বা অ্যাট্রিবিউট-বেসড এক্সেস কন্ট্রোল (ABAC) ব্যবহার করে সেট করা হয়। এটি ব্যবহারকারীদের জন্য নির্দিষ্ট অনুমতিসমূহ অ্যাসাইন করে।

Authorization এবং Access Control-এ Best Practices for GraphQL

  1. JWT (JSON Web Tokens) ব্যবহার করা: Authorization-এর জন্য JWT (JSON Web Token) একটি জনপ্রিয় পদ্ধতি। JWT সাধারণত লগইন বা সাইন-ইন প্রক্রিয়ার সময় একটি টোকেন তৈরি করে, যা ব্যবহারকারীর পরিচয় এবং অনুমতি তথ্য ধারণ করে। প্রতিটি গ্রাফকিউএল রিকোয়েস্টে এই টোকেনটি পাঠানো হয়, এবং সার্ভার টোকেন যাচাই করে ব্যবহারকারীর অনুমতি চেক করে।
    • টোকেন যাচাইকরণ (Token Verification): API রিকোয়েস্টের জন্য, আপনি সাধারণত Authorization হেডারে JWT টোকেন পাঠান। সার্ভার এই টোকেন যাচাই করে এবং তারপর ব্যবহারকারীর অ্যাক্সেস অনুমতি পরীক্ষা করে।

      const jwt = require('jsonwebtoken');
      const token = req.headers['authorization'];
      if (!token) {
        throw new Error('No authentication token provided');
      }
      
      const decoded = jwt.verify(token, process.env.JWT_SECRET);
      
  2. রোল-বেসড এক্সেস কন্ট্রোল (RBAC) বাস্তবায়ন: GraphQL API-তে রোল-বেসড এক্সেস কন্ট্রোল (RBAC) ব্যবহার করে আপনি বিভিন্ন ব্যবহারকারীর রোল এবং তাদের সেই অনুযায়ী অ্যাক্সেস সীমাবদ্ধ করতে পারেন। উদাহরণস্বরূপ, সাধারণ ইউজাররা শুধু তাদের নিজস্ব তথ্য দেখতে পারবে, কিন্তু অ্যাডমিন রোলের ব্যবহারকারীরা পুরো ডেটাবেস অ্যাক্সেস করতে সক্ষম হবে।
    • রোল চেক (Role Check): কুয়েরি বা মিউটেশন রেজোলভারস (resolvers) এ রোল চেক করে আপনি বিভিন্ন ফিচার বা ডেটা অ্যাক্সেস কন্ট্রোল করতে পারেন।

      const resolvers = {
        Query: {
          users: async (_, args, context) => {
            if (context.user.role !== 'admin') {
              throw new Error('Unauthorized access');
            }
            return await User.find();
          },
        },
      };
      
  3. Access Control via Field-level Authorization: GraphQL-এ ফিল্ড-লেভেল অথরাইজেশন ব্যবহার করা যেতে পারে, যেখানে আপনি নির্দিষ্ট ফিল্ডের অ্যাক্সেস কন্ট্রোল করতে পারেন। উদাহরণস্বরূপ, একজন ইউজারের সেলফ ডেটা (personal data) শুধুমাত্র সেই ব্যবহারকারী বা অ্যাডমিনের জন্য দৃশ্যমান হতে পারে।
    • Field-level Access Control: GraphQL রেজোলভারগুলির মাধ্যমে ফিল্ড-লেভেল অ্যাক্সেস কন্ট্রোল নির্ধারণ করা যেতে পারে।

      const resolvers = {
        Query: {
          user: async (_, { id }, context) => {
            const user = await User.findById(id);
            if (user.id !== context.user.id && context.user.role !== 'admin') {
              throw new Error('You are not authorized to view this user data');
            }
            return user;
          },
        },
      };
      
  4. OAuth 2.0 Integration: আপনি OAuth 2.0 ব্যবহার করে তৃতীয় পক্ষের লগইন (যেমন Google, Facebook, GitHub) এর মাধ্যমে Authorization পরিচালনা করতে পারেন। এটি ব্যবহারকারীদের অ্যাপ্লিকেশনে সাইন ইন করার জন্য একটি নিরাপদ পদ্ধতি প্রদান করে এবং ব্যবহৃত টোকেনের মাধ্যমে অ্যাক্সেস কন্ট্রোল করা যায়।
    • OAuth Flow: ব্যবহারকারী একটি তৃতীয় পক্ষের পরিষেবা (যেমন Google) ব্যবহার করে সাইন ইন করলে, OAuth সার্ভিস একটি অ্যাক্সেস টোকেন প্রদান করবে, যেটি পরবর্তীতে গ্রাফকিউএল API-তে অনুমোদিত রিকোয়েস্ট পাঠাতে ব্যবহৃত হবে।
  5. Context ব্যবহার করা: Context হল একটি গুরুত্বপূর্ণ ধারণা যা GraphQL রেজোলভারগুলিতে ব্যবহারকারী সম্পর্কিত তথ্য (যেমন JWT টোকেন, রোল ইত্যাদি) পাস করার জন্য ব্যবহৃত হয়। এটি Authorization এবং Access Control-এর জন্য অত্যন্ত কার্যকরী।
    • Context Configuration Example: Apollo Server-এ, context ফাংশন ব্যবহার করে আপনি ব্যবহারকারী সম্পর্কিত তথ্য নির্ধারণ করতে পারেন এবং রেজোলভারগুলিতে সেই তথ্য প্রেরণ করতে পারেন।

      const server = new ApolloServer({
        typeDefs,
        resolvers,
        context: ({ req }) => {
          const token = req.headers.authorization || '';
          const user = verifyToken(token); // টোকেন যাচাই করে ব্যবহারকারী শনাক্ত করা
          return { user };
        },
      });
      
  6. Error Handling and Logging: Authorization এবং Access Control-এ সঠিক Error Handling নিশ্চিত করা অত্যন্ত গুরুত্বপূর্ণ। ব্যবহারকারী যদি অনুমোদিত না হয়, তাহলে উপযুক্ত ত্রুটি বার্তা পাঠানো উচিত, যেমন "Unauthorized" বা "Forbidden"
    • Error Example:

      if (!context.user) {
        throw new AuthenticationError('You must be logged in');
      }
      if (!hasPermission(context.user, 'admin')) {
        throw new ForbiddenError('You do not have permission to access this resource');
      }
      

সারাংশ

Authorization এবং Access Control GraphQL API-তে নিরাপত্তা নিশ্চিত করার জন্য অত্যন্ত গুরুত্বপূর্ণ। বিভিন্ন পদ্ধতি ব্যবহার করে আপনি ব্যবহারকারীদের অনুমতি যাচাই করতে পারেন এবং তাদের নির্দিষ্ট ডেটা অ্যাক্সেস সীমাবদ্ধ করতে পারেন। JWT টোকেন, রোল-বেসড এক্সেস কন্ট্রোল (RBAC), এবং ফিল্ড-লেভেল অথরাইজেশন সহ অন্যান্য টেকনিক্যাল ফিচার ব্যবহার করে, আপনি একটি নিরাপদ এবং কাস্টমাইজড API তৈরি করতে পারেন। এগুলি ব্যবহারকারীর ব্যক্তিগত ডেটা এবং অ্যাপ্লিকেশনের সুরক্ষা নিশ্চিত করতে সহায়ক।

Content added By

গ্রাফকিউএল (GraphQL)-এ Role-Based Access Control (RBAC) ব্যবহারের মাধ্যমে আপনি ব্যবহারকারীদের বিভিন্ন রোলের ভিত্তিতে ডেটাতে অ্যাক্সেস নিয়ন্ত্রণ করতে পারেন। এটি একটি নিরাপত্তা কৌশল, যেখানে বিভিন্ন ধরনের ব্যবহারকারীকে বিভিন্ন রিসোর্সে অ্যাক্সেস করার অনুমতি দেওয়া হয়, তাদের রোল বা অবস্থান অনুসারে। RBAC ব্যবহার করার মাধ্যমে আপনি গ্রাফকিউএল API এর মাধ্যমে কোন ইউজার কী ধরনের ডেটা অ্যাক্সেস করতে পারবে তা নির্ধারণ করতে পারেন।

RBAC কি?

RBAC (Role-Based Access Control) হল একটি নিরাপত্তা পদ্ধতি যেখানে ব্যবহারকারীদের বিভিন্ন roles (রোল) এর মাধ্যমে অ্যাক্সেস নিয়ন্ত্রণ করা হয়। প্রতিটি রোলের সাথে কিছু নির্দিষ্ট অনুমতি (permissions) যুক্ত থাকে, যা নির্ধারণ করে কোন রিসোর্সে অ্যাক্সেস অনুমোদিত হবে এবং কোন রিসোর্সে না।

  • Roles (রোলস): গ্রাহকদের জন্য নির্ধারিত বিভিন্ন অবস্থান বা ভূমিকা যেমন অ্যাডমিন, ইউজার, ম্যানেজার ইত্যাদি।
  • Permissions (অনুমতি): নির্দিষ্ট রোলের জন্য অনুমোদিত ক্রিয়াকলাপ, যেমন ডেটা তৈরি করা, পড়া, আপডেট করা বা মুছে ফেলা।

GraphQL এবং RBAC

গ্রাফকিউএল-এ RBAC সাধারণত Authentication এবং Authorization এর মাধ্যমে কার্যকরীভাবে বাস্তবায়িত হয়। Authentication নিশ্চিত করে যে ব্যবহারকারী সঠিকভাবে সাইন ইন করেছে, এবং Authorization নিশ্চিত করে যে সে সেই নির্দিষ্ট রোলের অধীনে ডেটা অ্যাক্সেস করতে পারবে কি না।

GraphQL-এ RBAC বাস্তবায়ন

গ্রাফকিউএল-এ RBAC বাস্তবায়ন করতে হলে আপনাকে কিছু পদক্ষেপ নিতে হবে:

  1. ব্যবহারকারীর রোল সংজ্ঞায়িত করা।
  2. GraphQL কুয়েরি বা মিউটেশন রেজোলভারে রোল যাচাই করা।
  3. পজিটিভ বা নেগেটিভ রোল ভিত্তিক অনুমতি প্রদান করা।

Step-by-step: GraphQL-এ RBAC বাস্তবায়ন

ধরা যাক, আপনার অ্যাপ্লিকেশনে তিনটি রোল রয়েছে: Admin, User, এবং GuestAdmin রোলের ব্যবহারকারী সব ডেটায় অ্যাক্সেস পাবেন, User শুধুমাত্র তাদের নিজস্ব ডেটাতে অ্যাক্সেস পাবে, এবং Guest রোলের ব্যবহারকারী শুধুমাত্র পাবলিক ডেটা দেখতে পারবে।

১. Role-based User Authentication

প্রথমে, ব্যবহারকারীর JWT (JSON Web Token) বা অন্য কোনো টোকেনের মাধ্যমে তাদের রোল শনাক্ত করা হয়। সাধারণত, JWT-তে রোল সম্পর্কিত তথ্য রাখা হয়।

// JWT তৈরি করার সময় রোল অন্তর্ভুক্ত করা
const jwt = require('jsonwebtoken');

function generateToken(user) {
  return jwt.sign(
    { id: user.id, role: user.role },  // ইউজারের রোলও টোকেনে অন্তর্ভুক্ত করা হচ্ছে
    'your_secret_key',
    { expiresIn: '1h' }
  );
}

২. GraphQL কুয়েরি এবং মিউটেশন স্কিমা তৈরি

গ্রাফকিউএল স্কিমাতে আমরা ইউজারের জন্য কিছু কুয়েরি এবং মিউটেশন যুক্ত করব।

type Query {
  getUserData: User
  getPublicData: [Data]
}

type Mutation {
  createUserData(data: String!): UserData
  updateUserData(id: ID!, data: String!): UserData
}

type User {
  id: ID!
  name: String!
  email: String!
}

type UserData {
  id: ID!
  userId: ID!
  data: String!
}

type Data {
  id: ID!
  content: String!
}

এখানে, আমরা তিনটি রিসোর্স তৈরি করেছি:

  1. getUserData: ইউজারের ব্যক্তিগত ডেটা (এটি শুধু Admin এবং User রোলের জন্য অনুমোদিত)।
  2. getPublicData: পাবলিক ডেটা (এটি Guest রোলের জন্য অনুমোদিত)।
  3. createUserData এবং updateUserData: ডেটা তৈরি এবং আপডেট করার মিউটেশন (এটি Admin এবং User রোলের জন্য অনুমোদিত)।

৩. Authorization রেজোলভার তৈরি

এখন, RBAC বাস্তবায়ন করতে, আমাদের গ্রাফকিউএল রেজোলভারের মধ্যে রোল যাচাই করতে হবে।

const resolvers = {
  Query: {
    getUserData: async (_, __, context) => {
      if (context.user.role !== 'Admin' && context.user.role !== 'User') {
        throw new Error('Unauthorized');
      }
      // ইউজারের ডেটা রিটার্ন করুন
      return await UserData.findOne({ where: { userId: context.user.id } });
    },
    getPublicData: async () => {
      // সকল পাবলিক ডেটা ফেরত দিন
      return await PublicData.findAll();
    }
  },
  Mutation: {
    createUserData: async (_, { data }, context) => {
      if (context.user.role !== 'Admin' && context.user.role !== 'User') {
        throw new Error('Unauthorized');
      }
      // নতুন ডেটা তৈরি করুন
      return await UserData.create({ userId: context.user.id, data });
    },
    updateUserData: async (_, { id, data }, context) => {
      if (context.user.role !== 'Admin' && context.user.role !== 'User') {
        throw new Error('Unauthorized');
      }
      // ইউজারের ডেটা আপডেট করুন
      return await UserData.update({ data }, { where: { id, userId: context.user.id } });
    }
  }
};

৪. Context এ User রোল সংরক্ষণ করা

গ্রাফকিউএল সার্ভারে, Apollo Server অথবা অন্য সার্ভারে context সেট করতে হবে যাতে ব্যবহারকারীকে যাচাই করা যায়।

const { ApolloServer, gql } = require('apollo-server');
const jwt = require('jsonwebtoken');

const typeDefs = gql`
  # Schema definition here...
`;

const resolvers = {
  //Resolvers as shown above
};

const server = new ApolloServer({
  typeDefs,
  resolvers,
  context: ({ req }) => {
    const token = req.headers.authorization || '';
    if (token) {
      try {
        const decoded = jwt.verify(token.split(' ')[1], 'your_secret_key');
        return { user: decoded }; // user information added to context
      } catch (err) {
        throw new Error('Unauthorized');
      }
    }
    return {};
  }
});

server.listen().then(({ url }) => {
  console.log(`Server ready at ${url}`);
});

এখানে, আমরা Authorization Header থেকে JWT টোকেন বের করেছি, তা যাচাই করেছি, এবং context এ ইউজারের তথ্য সংরক্ষণ করেছি। এরপর, রেজোলভারগুলিতে এই তথ্য ব্যবহার করে অ্যাক্সেস নিয়ন্ত্রণ করা হয়েছে।


RBAC এর সুবিধা

  1. নিরাপত্তা: RBAC ব্যবহার করে আপনি ডেটার অ্যাক্সেস নিয়ন্ত্রণ করতে পারেন, যাতে কোনো অপ্রয়োজনীয় ব্যবহারকারী বা ভূমিকামূলক ব্যবহারের জন্য অ্যাক্সেস অনুমতি না থাকে।
  2. স্কেলযোগ্যতা: নতুন রোল বা অনুমতি যোগ করা সহজ, যা বড় অ্যাপ্লিকেশনগুলোতে উপকারী।
  3. ব্যবহারকারী অভিজ্ঞতা: রোল অনুযায়ী অ্যাক্সেস সীমাবদ্ধ করা হলে, ব্যবহারকারীরা তাদের জন্য অনুমোদিত ডেটা এবং কার্যকলাপ দেখতে পারে, যা ব্যবহারকারী অভিজ্ঞতাকে উন্নত করে।

সারাংশ

Role-Based Access Control (RBAC) গ্রাফকিউএল API-তে একটি শক্তিশালী নিরাপত্তা ব্যবস্থা তৈরি করতে সাহায্য করে, যা ব্যবহারকারীর রোল অনুযায়ী ডেটাতে অ্যাক্সেস নিয়ন্ত্রণ করতে সহায়ক। JWT ব্যবহার করে ইউজারের রোল যাচাই করা হয়, এবং এরপর সেই রোল অনুযায়ী নির্দিষ্ট ডেটা অ্যাক্সেস বা আপডেট করার অনুমতি দেয়া হয়। Apollo Server এবং অন্যান্য গ্রাফকিউএল সার্ভারের সাহায্যে এই প্রক্রিয়া সহজে বাস্তবায়ন করা যায়।

Content added By
Promotion

Are you sure to start over?

Loading...