インターネットの急速な発展に伴い、サービスやデータを提供するために独自の API を開発する企業が増えています。 API のセキュリティにとって、認証と認可は不可欠なリンクです。この記事では、PHP API 開発における認証と認可のベストプラクティスについて説明します。
1. 認証と認可とは何ですか
まず、認証と認可とは何かを理解する必要があります。簡単に言うと、認証はユーザーの身元を確認すること、承認はユーザーに特定のリソースへのアクセス許可を与えることです。
通常、認証には 3 つのタイプがあります:
1. トークンベースの認証: ユーザーは資格情報 (通常はユーザー名とパスワード) を提供し、サーバーからトークンを取得します。後続のリクエストで身元を確認するために使用されます。
2. Cookie ベースの認証: サーバーはユーザーのブラウザに Cookie を設定し、この Cookie は後続のリクエストで ID を検証するために使用できます。
3. HTTP ベースの認証: クライアントは、Base64 でエンコードされたユーザー名とパスワードを送信することで認証を行います。
承認は次のタイプに分類されます:
1. ロールベースのアクセス承認: ユーザーをロールに関連付けます。各ロールには一連の承認があります。アクセス許可は、ロールに基づいて決定されます。ユーザーが所属するもの。
2. リソースベースのアクセス承認: 各リソースに特定のアクセス許可を付与し、各ユーザーは取得したアクセス許可に基づいてどのリソースにアクセスするかを決定します。
2. 認証と認可のベスト プラクティス
1. トークン認証
トークンベースの認証の使用が最も一般的な方法です。 PHP では、PHP のトークン認証ライブラリ (JWT) を使用してトークンを作成および検証できます。
JWT ペイロードは、ユーザーの ID に関する情報を含む JSON オブジェクトです。 JWT ヘッダーは、ペイロードから署名を生成するために使用されるアルゴリズムを定義します。署名は、JWT を検証し、送信中にペイロードが改ざんされていないことを確認するために使用されます。
たとえば、次のコードは、JWT を初期化して署名する方法を示しています。
use FirebaseJWTJWT; // 每次请求都会生成一个新的JWT $jwt = JWT::encode([ 'sub' => $user->getId(), 'exp' => time() + 3600 ], $secretKey);
認証時には、JWT を検証する必要があります。次のコードは、JWT を検証し、ペイロードからデータを抽出する方法を示しています:
use FirebaseJWTJWT; try { // 验证JWT并从荷载中提取数据 $decoded = JWT::decode($jwt, $secretKey, ['HS256']); $userId = $decoded->sub; } catch (Exception $e) { // 如果JWT无效,则引发异常 throw new Exception('Invalid token'); }
2. 通信に HTTPS を使用する
HTTPS を使用すると、リクエストと応答を確実に暗号化できます。これにより、盗聴、偽造、リプレイ攻撃などの中間者攻撃が防止されます。
HTTPS で TLS 証明書を使用して、クライアントの ID を確認できます。次のコードは、TLS クライアント証明書を検証する方法を示しています:
$cert = $server_request->getAttribute('ssl_client_cert'); $clientCert = openssl_x509_parse($cert); $userCert = //根据用户证书的颁发机构来验证用户证书 if (!$userCert || !hasAccess($userCert)) { return new Response('Access denied', 403); }
3. ロールベースのアクセス承認を使用する
ロールベースのアクセス承認を使用して、ユーザーをロールに関連付けます。役割によって権限が決まります。
役割ミドルウェアを使用してアクセスを制限できます。たとえば、次のコードはミドルウェアの使用方法を示しています:
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; });
4. リソースベースのアクセス承認の使用
リソースベースのアクセス承認を使用すると、各リソースに一連の承認と権限を割り当てることができます。権限はユーザーの承認によって決定されます。
たとえば、次のコードは、ルーティングで承認を使用する方法を示しています:
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 });
3. 概要
PHP API 開発では、認証と承認は不可欠なリンクです。 PHP API 開発では、トークンベースの認証の使用、通信に HTTPS の使用、ロールベースのアクセス承認の使用、およびリソースベースのアクセス承認の使用がベスト プラクティスです。これらのプラクティスにより、API のセキュリティが確保され、ユーザー データと API の整合性が保護されます。
以上がPHP API 開発における認証と認可のベストプラクティスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。