| کانال توسعه‌دهندگان PHP |
1.66K subscribers
48 photos
1 video
60 links
⭕️ کانال توسعه‌دهندگان پی‌اچ‌پی (PHP) دولوپیکس

💠 دولوپیکس | جامعه توسعه‌دهندگان ایرانی

💎 @Developix
🚀 Developix.ir

📌 پشتیبانی و تبلیغات:
@DevelopixSupport
Download Telegram
اگه تا حالا خواستی یه لاگین سبک برای SPA، موبایل یا حتی فرم ساده خودت بسازی، یه API لاگین کوچیک با PHP خالص می‌تونه عالی باشه؛ مخصوصاً وقتی با سبک مدرن و OOP نوشته بشه 😊

ایده این پست بر اساس ترکیبی از مستند رسمی PHP و چند نمونه‌کار تمیز روی GitHub هست (مثل ریپوهای سبک login API با PDO). تمرکز روی اینه که یه ساختار تمیز، قابل‌گسترش و امن‌تر نسبت به کدهای قدیمی و procedural داشته باشیم.

سناریو 🔎
می‌خوای یه endpoint مثل /api/login.php داشته باشی که:

• JSON از کلاینت بگیره (email و password)
• یوزر رو توی دیتابیس MySQL چک کنه
• پسورد رو با password_hash و password_verify هندل کنه
• در جواب، JSON تمیز برگردونه

چند نکته مهم قبل از کد 🧠
• حتماً PDO با prepared statement استفاده کن، نه query خام.
• همیشه Content-Type: application/json رو ست کن.
• خطاها رو JSON برگردون، نه echo ساده.

نمونه ساختار ساده API لاگین 🧩
این یه مثال مینیمال و قابل‌اجراست (فرض بر اینه که جدول users با ستون‌های id، email، password داری و پسوردها با password_hash ذخیره شدن):

<?php
// api/login.php

declare(strict_types=1);

header('Content-Type: application/json; charset=utf-8');

class DB
{
private \PDO $pdo;

public function __construct()
{
$dsn = 'mysql:host=localhost;dbname=myapp;charset=utf8mb4';
$user = 'db_user';
$pass = 'db_pass';

$this->pdo = new \PDO($dsn, $user, $pass, [
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
]);
}

public function findUserByEmail(string $email): ?array
{
$stmt = $this->pdo->prepare('SELECT * FROM users WHERE email = :email LIMIT 1');
$stmt->execute(['email' => $email]);
$user = $stmt->fetch();
return $user ?: null;
}
}

class LoginController
{
public function __construct(private DB $db) {}

public function handle(): void
{
$input = json_decode(file_get_contents('php://input'), true);

if (!isset($input['email'], $input['password'])) {
http_response_code(400);
echo json_encode(['error' => 'invalid_payload']);
return;
}

$user = $this->db->findUserByEmail($input['email']);
if (!$user || !password_verify($input['password'], $user['password'])) {
http_response_code(401);
echo json_encode(['error' => 'invalid_credentials']);
return;
}

echo json_encode([
'id' => (int) $user['id'],
'email' => $user['email'],
]);
}
}

$db = new DB();
$controller = new LoginController($db);
$controller->handle();


چرا این سبک خوبه؟ ⚙️
• کلاس DB جداست، بعداً راحت می‌تونی لاگ، کش یا تست واحد براش بنویسی.
• LoginController فقط روی لاجیک لاگین تمرکز داره، نه اتصال به دیتابیس.
• از strict_types و type hint استفاده شده که با PHP مدرن هماهنگه.

برای عمیق‌تر شدن توی این سبک، مستند رسمی PHP درباره PDO و همچنین بخش password hash و password_verify خیلی کمک‌کننده است.

این ساختار کوچیک رو بردار، توی پروژه‌هات امتحانش کن و با اضافه کردن token (مثلاً JWT) یا session، تبدیلش کن به یه auth کامل‌تر. تجربه‌هات رو هم با بقیه توسعه‌دهنده‌های PHP به اشتراک بذار 🔧💬

🔖 #PHP #پی_اچ_پی #PHP #Login_API #PDO #OOP #Authentication #Backend

👤 Developix

💎 Channel: @DevelopixPHP
👍3❤1
‍ساخت فرم لاگین امن با PHP با استفاده از password_hash 🔐

خیلی از پروژه‌های PHP هنوز از md5 یا sha1 برای ذخیره پسورد استفاده می‌کنن و این یعنی دردسر امنیتی 😅
بیایم یه لاگین ساده ولی استاندارد بسازیم که روی password_hash و password_verify سوار باشه؛ همون چیزی که توی داک رسمی PHP هم پیشنهاد شده:
php.net/manual/en/function.password-hash.php

ایده کلی اینه:

• سمت دیتابیس فقط hash پسورد ذخیره می‌شه، نه خود پسورد.
• برای ساخت یوزر جدید از password_hash استفاده می‌کنیم.
• برای لاگین از password_verify کمک می‌گیریم.
• بعد از لاگین موفق، یه session امن راه می‌ندازیم.

این یه مثال خیلی مینیمال و قابل‌استفاده توی پروژه‌های کوچیکه 👇

<?php
// config.php
$pdo = new PDO(
'mysql:host=localhost;dbname=test;charset=utf8mb4',
'db_user',
'db_pass',
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);

// register.php - ساخت یوزر جدید
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = $_POST['email'] ?? '';
$password = $_POST['password'] ?? '';

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
exit('ایمیل نامعتبر است');
}

if (strlen($password) < 8) {
exit('پسورد باید حداقل 8 کاراکتر باشد');
}

$hash = password_hash($password, PASSWORD_DEFAULT);

$stmt = $pdo->prepare('INSERT INTO users (email, password_hash) VALUES (:email, :hash)');
$stmt->execute([
':email' => $email,
':hash' => $hash,
]);

echo 'ثبت‌نام با موفقیت انجام شد ✅';
}

// login.php - لاگین یوزر
session_start();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = $_POST['email'] ?? '';
$password = $_POST['password'] ?? '';

$stmt = $pdo->prepare('SELECT id, password_hash FROM users WHERE email = :email');
$stmt->execute([':email' => $email]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$user || !password_verify($password, $user['password_hash'])) {
exit('ایمیل یا پسورد اشتباه است');
}

session_regenerate_id(true);
$_SESSION['user_id'] = $user['id'];

echo 'خوش اومدی! 🎉';
}


نکته‌ها و ترفندهای کوچیک ولی مهم:

• الگوریتم داخلی PASSWORD_DEFAULT ممکنه در آینده عوض بشه، ولی همون برای اکثر سناریوها عالیه.
• با password_needs_rehash می‌تونی موقع لاگین، hashهای قدیمی رو خودکار به نسخه‌ی جدیدتر migrate کنی (مثلاً وقتی cost رو عوض کردی).
• حتماً روی ستون پسورد توی دیتابیس حداقل طول 255 بگذار تا با تغییر الگوریتم‌های آینده مشکل نداشته باشی.
• از PDO prepared statement استفاده کن که جلوی SQL Injection رو بگیره، مثل همین نمونه.
• بعد لاگین، session_regenerate_id رو فراموش نکن تا Session Fixation اتفاق نیفته.

این الگو پایه‌ی خیلی از سیستم‌های auth امروزی توی PHP ـه و راحت می‌شه بعداً روش چیزهایی مثل remember me، محدودیت تلاش لاگین، و لاگ آدیت اضافه کرد.

امتحانش کن روی یه پروژه کوچیک، اگر جواب داد همون رو تمیزتر کن و بذار توی پروژه‌های اصلی‌ات 💻

🔖 #PHP #پی_اچ_پی #PHP #Authentication #Security #Password_Hashing #Login #PDO

👤 Developix

💎 Channel: @DevelopixPHP
👍4👎2