API কীগুলি আপনার পরিষেবার সামনের দরজার কীগুলির মতো—এগুলি জিনিসগুলি সুরক্ষিত রাখার সময় ব্যবহারকারীদের প্রবেশ করতে দেয়৷ এই ব্লগে, আমি আপনাকে দ্রুত, সার্ভারহীন ডেটা সঞ্চয়স্থান এবং ক্লাউডফ্লেয়ার কর্মীদের প্রান্তে থাকা অনুরোধগুলি পরিচালনা করার জন্য Upstash Redis ব্যবহার করে একটি সহজ, নিরাপদ API কী জেনারেটর তৈরির মাধ্যমে নিয়ে যাব। আপনি একটি নতুন পরিষেবা সেট আপ করছেন বা একটি বিদ্যমান অ্যাপে কী যোগ করছেন, আপনি সবকিছু সুচারুভাবে এবং দক্ষতার সাথে চালানোর জন্য API কীগুলি কীভাবে তৈরি, সঞ্চয় এবং যাচাই করতে হয় তা শিখবেন৷
এপিআই কী কী?
একটি API কী একটি অনন্য কোড যা আপনার API অ্যাক্সেস করার চেষ্টাকারী ব্যবহারকারী বা অ্যাপ্লিকেশনকে সনাক্ত করে এবং প্রমাণীকরণ করে। এটিকে একটি ব্যক্তিগত পাসের মতো মনে করুন:যখন কেউ আপনার পরিষেবা ব্যবহার করতে চায়, তখন তাদের এই "কী" দেখাতে হবে প্রমাণ করতে যে তারা অনুমোদিত৷ API কীগুলি আপনাকে নিয়ন্ত্রণ করতে সাহায্য করে কে আপনার সংস্থানগুলি অ্যাক্সেস করতে পারে এবং তারা প্রায়শই ব্যবহার ট্র্যাক করতে, সীমা প্রয়োগ করতে বা অননুমোদিত অ্যাক্সেস প্রতিরোধ করতে ব্যবহৃত হয়৷ এগুলি API অ্যাক্সেস পরিচালনা করার এবং আপনার ডেটা সুরক্ষিত রাখার একটি সহজ উপায়।
আমরা কী তৈরি করব
এই নির্দেশিকায়, আমরা একটি এপিআই কী জেনারেটর তৈরি করব যা দুটি মূল কার্যকারিতা প্রদান করে:
- কাস্টম সেটিংস সহ নতুন API কী তৈরি করা হচ্ছে
- তাদের মেটাডেটা পুনরুদ্ধার করার সময় API কীগুলিকে যাচাই করা হচ্ছে
মূল বৈশিষ্ট্যগুলি অন্তর্ভুক্ত করবে:
- কাস্টমাইজযোগ্য কী উপসর্গ
- মেয়াদ শেষ হওয়ার তারিখ
- দর সীমিত করা
- মেটাডেটা স্টোরেজ
- মালিকের পরিচয়
আসুন আমাদের API কী সিস্টেমটি কল্পনা করা যাক
এই চিত্রটি API কী তৈরি এবং যাচাইকরণ উভয়ের জন্য ক্লায়েন্ট, আমাদের ক্লাউডফ্লেয়ার কর্মী এবং Upstash Redis-এর মধ্যে মিথস্ক্রিয়াকে চিত্রিত করে। এই ওভারভিউকে মাথায় রেখে, আসুন আমাদের সিস্টেম তৈরি করা শুরু করি।

পূর্বশর্ত
অনুসরণ করতে, আপনার প্রয়োজন হবে:
- একটি ক্লাউডফ্লেয়ার কর্মী অ্যাকাউন্ট
- একটি আপস্ট্যাশ অ্যাকাউন্ট
- আপনার স্থানীয় মেশিনে ইনস্টল করা Node.js
প্রকল্প কাঠামো
আমাদের প্রকল্পের নিম্নলিখিত কাঠামো থাকবে:
folder-name/
├── src/
│ ├── config/
│ │ ├── generateApiKey.ts
│ │ └── schema-validation.ts
│ ├── lib/
│ │ └── ratelimit.ts
│ ├── routes/
│ │ ├── create.ts
│ │ └── verify.ts
│ ├── types/
│ │ └── api.ts
│ └── index.ts
├── package.json
└── wrangler.toml
ধাপ 1:প্রকল্প সেটআপ
আসুন আমাদের প্রকল্প সেট আপ করে এবং প্রয়োজনীয় নির্ভরতা ইনস্টল করে শুরু করি।
একটি নতুন প্রকল্প ডিরেক্টরি তৈরি করুন
আপনার টার্মিনাল খুলুন এবং নিম্নলিখিত কমান্ডগুলি চালান:
mkdir keyflow
cd keyflow
npm init -y নির্ভরতা ইনস্টল করুন
আমাদের প্রকল্পের জন্য আমাদের কয়েকটি প্যাকেজের প্রয়োজন হবে:
npm install hono @upstash/redis @upstash/ratelimit @hono/zod-validator zod wrangler
@upstash/redis :সার্ভারহীন পরিবেশের জন্য Upstash Redis ক্লায়েন্ট@upstash/ratelimit :Upstash Redis@hono/zod-validator-এর জন্য রেট লিমিটিং লাইব্রেরি :Honozod-এর জন্য বৈধতা মিডলওয়্যারের অনুরোধ করুন :টাইপস্ক্রিপ্ট-প্রথম স্কিমা বৈধতা লাইব্রেরিwrangler :শ্রমিক উন্নয়ন এবং স্থাপনার জন্য ক্লাউডফ্লেয়ারের CLI
Upstash Redis সেট আপ করুন
- আপনার Upstash অ্যাকাউন্টে লগ ইন করুন এবং একটি নতুন Redis ডাটাবেস তৈরি করুন

- একবার তৈরি হয়ে গেলে, "REST API" বিভাগে নেভিগেট করুন

UPSTASH_REDIS_REST_URLকপি করুন এবংUPSTASH_REDIS_REST_TOKEN.env-এ বিভাগ
ক্লাউডফ্লেয়ার কর্মীদের কনফিগার করুন
একটি wrangler.toml তৈরি করুন নিম্নলিখিত বিষয়বস্তু সহ আপনার প্রকল্প রুটে ফাইল করুন:
name = "keyflow"
main = "src/index.ts"
compatibility_date = "2023-05-18"
[vars]
UPSTASH_REDIS_REST_URL = "your-redis-url"
UPSTASH_REDIS_REST_TOKEN = "your-redis-token"
"your-redis-url" প্রতিস্থাপন করুন এবং "your-redis-token" আপস্ট্যাশ থেকে কপি করা মানগুলির সাথে।
ধাপ 2:API প্রকারগুলি সংজ্ঞায়িত করা৷
আমাদের API অনুরোধ এবং প্রতিক্রিয়াগুলির জন্য আমাদের TypeScript ইন্টারফেসগুলি সংজ্ঞায়িত করে শুরু করা যাক। এই ধরনের আমাদের অ্যাপ্লিকেশন জুড়ে টাইপ নিরাপত্তা বজায় রাখতে সাহায্য করবে। একটি নতুন ফাইল তৈরি করুন src/types/api.ts :
export type CreateKeyRequest = {
apiId: string;
prefix?: string;
byteLength?: number;
ownerId?: string;
name: string;
meta?: Record<string, unknown>;
expires?: number;
ratelimit?: {
type: "fast" | "consistent";
limit: number;
refillRate: number;
refillInterval: number;
};
};
export type CreateKeyResponse = {
key: string;
keyId: string;
};
export type VerifyKeyRequest = {
key: string;
};
export type VerifyKeyResponse = {
valid: boolean;
ownerId?: string;
meta?: Record<string, unknown>;
expires?: number;
ratelimit?: {
limit: number;
remaining: number;
reset: number;
};
};
export type Env = {
UPSTASH_REDIS_REST_URL: string;
UPSTASH_REDIS_REST_TOKEN: string;
};
ধাপ 3:API কী জেনারেশন বাস্তবায়ন করা
এখন, আমাদের API কী তৈরি করার জন্য একটি ইউটিলিটি ফাংশন তৈরি করা যাক। একটি নতুন ফাইল তৈরি করুন src/config/generateApiKey.ts :
export function generateApiKey(
prefix: string | undefined,
byteLength: number,
): string {
const randomBytes = crypto.getRandomValues(new Uint8Array(byteLength));
const key = btoa(String.fromCharCode(...new Uint8Array(randomBytes)))
.replace(/\+/g, "-")
.replace(/\//g, "_")
.replace(/=/g, "");
return prefix ? `${prefix}_${key}` : key;
}
এই ফাংশনটি ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত র্যান্ডম বাইট ব্যবহার করে একটি র্যান্ডম API কী তৈরি করে, এটিকে বেস64-এ এনকোড করে এবং এটিকে ইউআরএল-নিরাপদ করে।
পদক্ষেপ 4:রেট লিমিটিং প্রয়োগ করুন
একটি src/lib/ratelimit.ts ফাইল তৈরি করুন :
import { Ratelimit } from "@upstash/ratelimit";
import { Redis } from "@upstash/redis/cloudflare";
import type { Context, Next } from "hono";
import { env } from "hono/adapter";
import type { Env } from "../types/api";
// Middleware for rate limiting
export async function rateLimitMiddleware(c: Context, next: Next) {
const { UPSTASH_REDIS_REST_TOKEN, UPSTASH_REDIS_REST_URL } = env<Env>(c);
const redis = new Redis({
url: UPSTASH_REDIS_REST_URL,
token: UPSTASH_REDIS_REST_TOKEN,
});
const ratelimit = new Ratelimit({
redis: redis,
limiter: Ratelimit.slidingWindow(5, "30 s"),
});
const ip = c.req.header("CF-Connecting-IP") || "127.0.0.1";
const { success, limit, remaining, reset } = await ratelimit.limit(ip);
if (!success) {
return c.json({ error: "Rate limit exceeded" }, 429);
}
c.header("X-RateLimit-Limit", limit.toString());
c.header("X-RateLimit-Remaining", remaining.toString());
c.header("X-RateLimit-Reset", reset.toString());
await next();
} ধাপ 5:API রুট তৈরি করা
আসুন আমাদের প্রধান অ্যাপ্লিকেশন ফাইল সেট আপ করুন এবং আমাদের API রুট তৈরি করুন। এই ফাইলটি দুটি প্রধান রুটের সাথে আমাদের Hono অ্যাপ্লিকেশন সেট আপ করে: /keys/create নতুন API কী এবং /keys/verify তৈরি করার জন্য তিনটি পৃথক ফাইল সহ বিদ্যমান কীগুলি যাচাই করার জন্য৷
1. API কী রুট তৈরি করুন
প্রয়োগ করুন
src/routes/create.ts একটি ফাইল তৈরি করুন :
import { zValidator } from "@hono/zod-validator"
import { Redis } from "@upstash/redis/cloudflare"
import { Hono } from "hono"
import { generateApiKey } from "../config/generateApiKey"
import { createApiKeySchema } from "../config/schema-validation"
import type { CreateKeyRequest, CreateKeyResponse, Env } from "../types/api"
const create = new Hono<{
Bindings: Env
}>()
create.post(
"/create",
zValidator("json", createApiKeySchema, (result, c) => {
if (!result.success) {
return c.text("Invalid!", 400)
}
}),
async (c) => {
// Initialize Redis client
const { UPSTASH_REDIS_REST_TOKEN, UPSTASH_REDIS_REST_URL } = c.env
const redis = new Redis({
url: UPSTASH_REDIS_REST_URL,
token: UPSTASH_REDIS_REST_TOKEN,
})
const body = await c.req.json<CreateKeyRequest>()
// Generate unique identifier and API key
const keyId = crypto.randomUUID()
const key = generateApiKey(body.prefix, body.byteLength || 16)
const keyData = {
...body,
key,
keyId,
createdAt: Date.now(),
}
const encodedKey = encodeURIComponent(key)
try {
// Store key data and lookup reference in Redis
await redis.set(`key:${keyId}`, JSON.stringify(keyData))
await redis.set(`lookup:${encodedKey}`, keyId)
return c.json<CreateKeyResponse>({ key, keyId })
} catch (error) {
console.error("Error in /keys/create:", error)
return c.json({ error: "Internal Server Error" }, 500)
}
}
)
export default create 2. এপিআই কী রুট যাচাই করুন
একটি ফাইল তৈরি করুন src/routes/verify.ts :
import { zValidator } from "@hono/zod-validator";
import { Redis } from "@upstash/redis/cloudflare";
import { Hono } from "hono";
import { verifyApiKeySchema } from "../config/schema-validation";
import type {
CreateKeyRequest,
Env,
VerifyKeyRequest,
VerifyKeyResponse,
} from "../types/api";
// Initialize Hono app with environment bindings
const verify = new Hono<{ Bindings: Env }>();
// Define POST route for verifying an API key
verify.post(
"/verify",
// Validate request body against schema
zValidator("json", verifyApiKeySchema, (result, c) => {
if (!result.success) {
return c.text("Invalid!", 400); // Return 400 if validation fails
}
}),
async (c) => {
// Set up Redis with environment variables
const { UPSTASH_REDIS_REST_TOKEN, UPSTASH_REDIS_REST_URL } = c.env;
const redis = new Redis({
url: UPSTASH_REDIS_REST_URL,
token: UPSTASH_REDIS_REST_TOKEN,
});
const body = await c.req.json<VerifyKeyRequest>();
if (!body.key) {
return c.json({ error: "key is required" }, 400); // Require key in the request body
}
const encodedKey = encodeURIComponent(body.key);
const keyId = await redis.get<string>(`lookup:${encodedKey}`); // Retrieve key ID using encoded key
if (!keyId) {
return c.json<VerifyKeyResponse>({ valid: false }); // Key not found
}
const keyDataString = await redis.get<string>(`key:${keyId}`); // Retrieve key data by key ID
if (!keyDataString || typeof keyDataString !== "string") {
return c.json<VerifyKeyResponse>({ valid: false }); // Key data missing or invalid
}
let keyData: CreateKeyRequest & {
key: string;
keyId: string;
createdAt: number;
};
try {
keyData = JSON.parse(keyDataString); // Parse key data
} catch (parseError) {
// Handle parse error by deleting invalid data
console.error("Key data parse error:", parseError);
await Promise.all([
redis.del(`key:${keyId}`),
redis.del(`lookup:${encodedKey}`),
]);
return c.json(
{
error: "Invalid key data in storage",
details: parseError instanceof Error ? parseError.message : "Unknown parse error",
valid: false,
},
500,
);
}
// Check if key has expired
if (keyData.expires && keyData.expires < Date.now()) {
await Promise.all([
redis.del(`key:${keyId}`),
redis.del(`lookup:${encodedKey}`),
]);
return c.json<VerifyKeyResponse>({ valid: false });
}
// Formulate response with validation status and metadata
const response: VerifyKeyResponse = {
valid: true,
ownerId: keyData.ownerId,
meta: keyData.meta,
expires: keyData.expires,
};
if (keyData.ratelimit) {
response.ratelimit = {
limit: keyData.ratelimit.limit,
remaining: keyData.ratelimit.limit,
reset: Date.now() + keyData.ratelimit.refillInterval,
};
}
return c.json(response); // Return verification response
},
);
export default verify;
3. প্রধান ফাইল index.ts
প্রয়োগ করুন
মূল ফাইল src/index.ts বাস্তবায়ন করুন create.ts আমদানি করতে , verify.ts , এবং rateLimitMiddleWare
import { Hono } from "hono";
import { rateLimitMiddleware } from "./lib/ratelimit";
import create from "./routes/create";
import verify from "./routes/verify";
import type { Env } from "./types/api";
const app = new Hono<{
Bindings: Env;
}>().basePath("/keys");
app.use("*", rateLimitMiddleware);
// add the create file route and verify file route
app.route("/", create);
app.route("/", verify);
export default app;
ধাপ 6:স্থাপনা
ক্লাউডফ্লেয়ার ওয়ার্কারদের কাছে আপনার কীফ্লো অ্যাপ্লিকেশনটি স্থাপন করুন:
-
র্যাংলার ইনস্টল করুন:
npm install -g wrangler -
ক্লাউডফ্লেয়ার দিয়ে প্রমাণীকরণ করুন:
wrangler login -
আপনার কর্মী মোতায়েন করুন:
wrangler deploy
পদক্ষেপ 7:স্থাপনা
এখন যেহেতু আমাদের অ্যাপ্লিকেশন প্রস্তুত আছে, আসুন এটিকে ক্লাউডফ্লেয়ার ওয়ার্কারদের কাছে স্থাপন করি:
-
নিশ্চিত করুন যে আপনি র্যাংলার CLI ইনস্টল করেছেন:
npm install -g wrangler -
আপনার Cloudflare অ্যাকাউন্ট দিয়ে প্রমাণীকরণ করুন:
wrangler login -
আপনার কর্মী মোতায়েন করুন:
wrangler deploy
ধাপ 8:আপনার API পরীক্ষা করা
আসুন আমাদের নতুন স্থাপন করা API পরীক্ষা করি:
একটি নতুন API কী তৈরি করা হচ্ছে
curl -X POST https://keyflow.<your-subdomain>.workers.dev/keys/create \
-H "Content-Type: application/json" \
-d '{
"apiId": "my-api",
"prefix": "prod",
"name": "Production API Key",
"expires": 1735689600000,
"meta": {
"environment": "production",
"team": "backend"
}
}'
একটি API কী যাচাই করা হচ্ছে
curl -X POST https://keyflow.<your-subdomain>.workers.dev/keys/verify \
-H "Content-Type: application/json" \
-d '{
"key": "prod_AbC123XyZ..."
}'
<your-subdomain> প্রতিস্থাপন করুন আপনার Cloudflare Workers সাবডোমেন এবং prod_AbC123XyZ... দিয়ে ক্রিয়েট এন্ডপয়েন্ট থেকে উৎপন্ন একটি আসল কী সহ।
উপসংহার
একটি API কী জেনারেটর তৈরি করা হল আপনার অ্যাপ্লিকেশনের APIগুলিকে সুরক্ষিত করার এবং কে আপনার পরিষেবাগুলি অ্যাক্সেস করতে পারে তা পরিচালনা করার একটি মূল পদক্ষেপ৷ API কী তৈরি, যাচাই এবং পরিচালনা করতে পারে এমন একটি সিস্টেম তৈরি করে, আপনি অ্যাক্সেস নিয়ন্ত্রণের একটি শক্তিশালী স্তর যুক্ত করেন যা আপনার ডেটা সুরক্ষিত এবং সংগঠিত রাখতে সহায়তা করে।
একটি কঠিন API কী জেনারেটরে যা যায় তার একটি দ্রুত রানডাউন এখানে রয়েছে:
- নিরাপদ কী জেনারেশন :স্বতন্ত্র, সুরক্ষিত কী যা কাস্টম উপসর্গ বা সেট দৈর্ঘ্যের মতো বিকল্পগুলিকে অন্তর্ভুক্ত করে প্রতিটি কীকে আলাদা এবং অনুমান করা কঠিন করে তোলে৷
- বৈধকরণ এবং মেয়াদ শেষ হওয়া :চেক এবং মেয়াদ শেষ হওয়ার তারিখ যোগ করা নিশ্চিত করে যে প্রতিটি কী শুধুমাত্র একটি নির্দিষ্ট সময়ের জন্য বৈধ, এটি নিয়ন্ত্রণ করা সহজ করে এবং প্রয়োজন অনুযায়ী অ্যাক্সেস সীমিত করে।
- মেটাডেটা এবং হারের সীমা :প্রতিটি কীর সাথে অতিরিক্ত তথ্য সঞ্চয় করা এবং হারের সীমা নির্ধারণ করা আপনাকে কী ব্যবহার নিরীক্ষণ করতে, কার্যকলাপ ট্র্যাক করতে এবং আপনার API-এর অপব্যবহার এড়াতে দেয়৷
আপস্ট্যাশ রেডিস এবং ক্লাউডফ্লেয়ার ওয়ার্কার্সের মতো সরঞ্জামগুলি ব্যবহার করা একটি সার্ভারহীন এবং বিশ্বব্যাপী বিতরণ করা কী ব্যবস্থাপনা সিস্টেম তৈরি করা সহজ করে তোলে যা ভাল মাপকাঠি এবং দক্ষতার সাথে কাজ করে৷
এই ফাউন্ডেশনের সাহায্যে, আপনি আপনার API গুলিকে সুরক্ষিত এবং পরিচালনাযোগ্য রাখার জন্য সেট আপ করেছেন, আপনাকে মনের শান্তি দেয় যে আপনার সংস্থানগুলি সুরক্ষিত এবং নিরীক্ষণ করা সহজ৷