>백엔드 개발 >PHP 튜토리얼 >PHP API 개발의 최고의 인증 및 권한 부여 방법

PHP API 개발의 최고의 인증 및 권한 부여 방법

WBOY
WBOY원래의
2023-06-17 08:52:301206검색

인터넷의 급속한 발전과 함께 서비스나 데이터를 제공하기 위해 자체 API를 개발하는 기업이 점점 늘어나고 있습니다. API 보안을 위해 인증과 승인은 필수적인 링크입니다. 이 기사에서는 PHP API 개발에서 최고의 인증 및 권한 부여 방법에 대해 설명합니다.

1. 인증과 승인이 무엇인가요?

먼저 인증과 승인이 무엇인지 알아야 합니다. 간단히 말해서 인증은 사용자의 신원을 확인하는 것이고, 승인은 사용자에게 특정 리소스에 액세스할 수 있는 권한을 부여하는 것입니다.

일반적으로 세 가지 유형의 인증이 있습니다.

1. 토큰 기반 인증: 사용자는 자격 증명(일반적으로 사용자 이름과 비밀번호)을 제공하고 서버에서 토큰을 얻습니다. 이 토큰은 이후 신원 확인 요청에 사용할 수 있습니다.

2. 쿠키 기반 인증: 서버는 사용자의 브라우저에 쿠키를 설정하며, 이 쿠키는 후속 요청에서 신원을 확인하는 데 사용될 수 있습니다.

3. HTTP 기반 인증: 클라이언트는 Base64로 인코딩된 사용자 이름과 비밀번호를 전송하여 인증합니다.

권한은 다음과 같은 유형으로 구분됩니다.

1. 역할 기반 액세스 권한: 사용자를 역할과 연결합니다. 각 역할에는 일련의 권한이 있으며, 액세스 권한은 사용자가 속한 역할에 따라 결정됩니다.

2. 리소스 기반 액세스 권한: 각 리소스에 특정 권한을 부여하고 각 사용자는 획득한 권한에 따라 액세스할 리소스를 결정합니다.

2. 인증 및 권한 부여 모범 사례

1. 토큰 인증

토큰 기반 인증을 사용하는 것이 가장 일반적인 방법입니다. PHP에서는 PHP의 토큰 인증 라이브러리(JWT)를 사용하여 토큰을 생성하고 확인할 수 있습니다.

JWT 페이로드는 사용자의 신원에 대한 정보를 보유하는 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 인증서를 사용하여 클라이언트의 신원을 확인할 수 있습니다. 다음 코드는 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 개발에 있어 인증과 인증은 필수적인 링크입니다. 토큰 기반 인증 사용, 통신에 HTTPS 사용, 역할 기반 액세스 권한 부여 사용, 리소스 기반 액세스 권한 부여 사용은 PHP API 개발의 모범 사례입니다. 이러한 관행은 API의 보안을 보장하고 사용자 데이터는 물론 API의 무결성을 보호합니다.

위 내용은 PHP API 개발의 최고의 인증 및 권한 부여 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.