Amalan Pengesahan dan Kebenaran Terbaik dalam Pembangunan API PHP

WBOY
Lepaskan: 2023-06-17 09:04:01
asal
1177 orang telah melayarinya

Dengan perkembangan pesat Internet, semakin banyak syarikat mula membangunkan API mereka sendiri untuk menyediakan perkhidmatan atau data. Untuk keselamatan API, pengesahan dan kebenaran adalah pautan yang sangat diperlukan. Dalam artikel ini, kita akan bercakap tentang amalan pengesahan dan kebenaran terbaik dalam pembangunan API PHP.

1. Apakah pengesahan dan kebenaran

Pertama sekali, kita perlu memahami apa itu pengesahan dan kebenaran. Ringkasnya, pengesahan adalah untuk mengesahkan identiti pengguna, manakala kebenaran adalah untuk memberi kebenaran kepada pengguna untuk mengakses sumber tertentu.

Biasanya terdapat tiga jenis pengesahan:

1 Pengesahan berasaskan token: Pengguna memberikan bukti kelayakan (biasanya nama pengguna dan kata laluan), mendapatkan token daripada pelayan dan token ini. Boleh digunakan untuk mengesahkan identiti pada permintaan seterusnya.

2. Pengesahan berasaskan kuki: Pelayan menetapkan kuki dalam penyemak imbas pengguna, dan kuki ini boleh digunakan untuk mengesahkan identiti dalam permintaan seterusnya.

3. Pengesahan berasaskan HTTP: Pelanggan mengesahkan dengan menghantar nama pengguna dan kata laluan berkod Base64.

Keizinan dibahagikan kepada jenis berikut:

1 Keizinan akses berasaskan peranan: Kaitkan pengguna dengan peranan Setiap peranan mempunyai satu set kebenaran Akses ditentukan berdasarkan peranan kepada yang menjadi milik pengguna.

2. Keizinan akses berasaskan sumber: Berikan kebenaran khusus kepada setiap sumber dan setiap pengguna memutuskan sumber yang hendak diakses berdasarkan kebenaran yang telah mereka perolehi.

2. Amalan terbaik untuk pengesahan dan kebenaran

1. Pengesahan token

Menggunakan pengesahan berasaskan token ialah kaedah yang paling biasa. Dalam PHP, anda boleh menggunakan pustaka pengesahan token (JWT) PHP untuk mencipta dan mengesahkan token.

Muatan JWT ialah objek JSON yang menyimpan maklumat tentang identiti pengguna. Pengepala JWT mentakrifkan algoritma yang digunakan untuk menjana tandatangan daripada muatan. Tandatangan digunakan untuk mengesahkan JWT dan memastikan bahawa muatan tidak diganggu semasa penghantaran.

Sebagai contoh, kod berikut menunjukkan cara untuk memulakan dan menandatangani JWT:

use FirebaseJWTJWT;

// 每次请求都会生成一个新的JWT
$jwt = JWT::encode([
    'sub' => $user->getId(),
    'exp' => time() + 3600
], $secretKey);
Salin selepas log masuk

Apabila mengesahkan, JWT perlu disahkan. Kod berikut menunjukkan cara untuk mengesahkan JWT dan mengekstrak data daripada muatan:

use FirebaseJWTJWT;

try {
    // 验证JWT并从荷载中提取数据
    $decoded = JWT::decode($jwt, $secretKey, ['HS256']);
    $userId = $decoded->sub;
} catch (Exception $e) {
    // 如果JWT无效,则引发异常
    throw new Exception('Invalid token');
}
Salin selepas log masuk

2. Gunakan HTTPS untuk komunikasi

Menggunakan HTTPS memastikan penyulitan permintaan dan respons. Ini menghalang serangan lelaki di tengah seperti mencuri dengar, pemalsuan dan serangan ulang tayang.

Sijil TLS dalam HTTPS boleh digunakan untuk mengesahkan identiti pelanggan. Kod berikut menunjukkan cara untuk mengesahkan sijil klien TLS:

$cert = $server_request->getAttribute('ssl_client_cert');
$clientCert = openssl_x509_parse($cert);

$userCert = //根据用户证书的颁发机构来验证用户证书

if (!$userCert || !hasAccess($userCert)) {
    return new Response('Access denied', 403);
}
Salin selepas log masuk

3 Gunakan kebenaran akses berasaskan peranan

Gunakan kebenaran akses berasaskan peranan untuk mengaitkan pengguna dengan peranan dan berdasarkan kepada pengguna. Peranan menentukan kebenaran.

Anda boleh menggunakan perisian tengah peranan untuk menyekat akses. Sebagai contoh, kod berikut menunjukkan cara menggunakan perisian tengah:

class RoleMiddleware
{
    private $allowedRoles;

    public function __construct($allowedRoles)
    {
        $this->allowedRoles = $allowedRoles;
    }

    public function __invoke(ServerRequestInterface $request, callable $next) : ResponseInterface
    {
        $userRoles = //获取当前用户的角色

        foreach ($this->allowedRoles as $allowedRole) {
            if (in_array($allowedRole, $userRoles, true)) {
                return $next($request);
            }
        }

        return new Response('Access denied', 403);
    }
}

// 示例
$app->get('/admin', function (Request $request) use ($app) {
    $response = new Response();

    // 角色中间件只允许具有“admin”角色的用户访问
    $app->add(new RoleMiddleware(['admin']));

    $response->getBody()->write('Welcome to the Admin panel!');
    return $response;
});
Salin selepas log masuk

4 Menggunakan kebenaran akses berasaskan sumber

Menggunakan kebenaran akses berasaskan sumber, setiap sumber boleh diberikan satu set kebenaran dan. berdasarkan Kebenaran ditentukan oleh kebenaran pengguna.

Sebagai contoh, kod berikut menunjukkan cara menggunakan kebenaran dalam penghalaan:

use ZendPermissionsAclAcl;

// 初始化ACL
$acl = new Acl();
$acl->addResource('profile');
$acl->addRole('guest');
$acl->addRole('user', 'guest');
$acl->addRole('admin', 'user');
$acl->allow('guest', 'profile', ['read']);
$acl->allow('user', 'profile', ['read', 'update']);
$acl->allow('admin', 'profile', ['read', 'update', 'delete']);

$app->get('/profile', function (Request $request, Response $response) use ($acl) {
    $user = //从JWT中获取用户
    $action = 'read';

    if (!$acl->isAllowed($user['role'], 'profile', $action)) {
        return $response->withStatus(403);
    }

    // Display user profile
});
Salin selepas log masuk

3. Ringkasan

Untuk pembangunan API PHP, pengesahan dan kebenaran adalah pautan yang sangat diperlukan. Menggunakan pengesahan berasaskan token, menggunakan HTTPS untuk komunikasi, menggunakan kebenaran akses berasaskan peranan dan menggunakan kebenaran akses berasaskan sumber adalah amalan terbaik dalam pembangunan API PHP. Amalan ini memastikan keselamatan API anda dan melindungi data pengguna serta integriti API anda.

Atas ialah kandungan terperinci Amalan Pengesahan dan Kebenaran Terbaik dalam Pembangunan API PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan