>  기사  >  백엔드 개발  >  PHP를 사용하여 OAuth2.0을 구현하는 가장 좋은 방법

PHP를 사용하여 OAuth2.0을 구현하는 가장 좋은 방법

王林
王林원래의
2023-06-08 09:09:171776검색

OAuth2.0은 타사 애플리케이션이 사용자 리소스에 액세스할 수 있도록 권한을 부여하는 데 사용되는 프로토콜입니다. 현재 인터넷 분야에서 널리 사용되고 있습니다. 인터넷 비즈니스가 발전함에 따라 점점 더 많은 애플리케이션에서 OAuth2.0 프로토콜을 지원해야 합니다. 이 기사에서는 PHP를 사용하여 OAuth2.0 프로토콜을 구현하는 가장 좋은 방법을 소개합니다.

1. OAuth2.0의 기본 지식

OAuth2.0 구현을 소개하기 전에 OAuth2.0에 대한 몇 가지 기본 지식을 이해해야 합니다.

  1. 인증 유형

OAuth2.0 프로토콜은 인증 코드 모드(인증 코드), 암시적 인증 모드(암시적 부여), 비밀번호 모드(리소스 소유자 비밀번호 자격 증명) 및 클라이언트 모드(클라이언트 자격 증명)의 4가지 인증 유형을 정의합니다. 다양한 시나리오에 적합한 인증 유형은 비즈니스 요구 사항에 따라 결정해야 합니다.

  1. Role

OAuth2.0 프로토콜에는 리소스 소유자, 클라이언트 및 리소스 서버의 세 가지 역할이 정의됩니다. 리소스 소유자는 인증된 사용자를 의미하고, 클라이언트는 타사 애플리케이션을 의미하며, 리소스 서버는 사용자의 리소스가 저장되는 서버를 의미합니다.

  1. Process

OAuth2.0 프로토콜의 프로세스에는 다음 단계가 포함됩니다.

(1) 클라이언트가 리소스 소유자에게 승인을 요청합니다.

(2) 리소스 소유자가 승인에 동의하고 승인을 발행합니다.

(3) 클라이언트는 리소스 서버에 액세스 토큰을 요청하기 위해 인증 코드를 전달합니다.

(4) 리소스 서버는 인증 코드를 확인하고 클라이언트에 액세스 토큰을 발급합니다.

2. 구현 방법

Laravel Passport, PHP League OAuth2 Server 등과 같이 OAuth2.0 프로토콜 구현을 위한 성숙한 솔루션이 시장에 많이 있습니다. 이 기사에서는 PHP League OAuth2 서버 구현에 중점을 둘 것입니다.

  1. 환경 설정

먼저 새 PHP 프로젝트를 만들고 PHP League OAuth2 서버 구성 요소를 설치해야 합니다. 설치 방법은 다음과 같습니다.

composer require league/oauth2-server

그런 다음 데이터베이스를 생성하고 다음과 같은 테이블 구조를 생성해야 합니다.

``
CREATE TABLE oauth_clients (

client_id VARCHAR(80) NOT NULL,
client_secret VARCHAR(80) NOT NULL,
redirect_uri VARCHAR(2000) NOT NULL,
grant_types VARCHAR(80),
scope VARCHAR(4000),
user_id VARCHAR(255),
CONSTRAINT clients_client_id_pk PRIMARY KEY (client_id)

);

CREATE TABLE oauth_access_tokens (

access_token VARCHAR(40) NOT NULL,
client_id VARCHAR(80) NOT NULL,
user_id VARCHAR(255),
expires TIMESTAMP NOT NULL,
scope VARCHAR(4000),
CONSTRAINT access_token_pk PRIMARY KEY (access_token)

);

CREATE TABLE oauth_authorization _codes(

authorization_code VARCHAR(40) NOT NULL,
client_id VARCHAR(80) NOT NULL,
user_id VARCHAR(255),
redirect_uri VARCHAR(2000),
expires TIMESTAMP NOT NULL,
scope VARCHAR(4000),
CONSTRAINT auth_code_pk PRIMARY KEY (authorization_code)

);

CREATE TABLE oauth_refresh_tokens(

refresh_token VARCHAR(40) NOT NULL,
client_id VARCHAR(80) NOT NULL,
user_id VARCHAR(255),
expires TIMESTAMP NOT NULL,
scope VARCHAR(4000),
CONSTRAINT refresh_token_pk PRIMARY KEY (refresh_token)

);

2. 配置服务器

在PHP项目中创建一个OAuth2服务器文件,并进行基本配置。实现代码如下:

require_once DIR '/vendor/autoload.php';

LeagueOAuth2ServerAuthorizationServer 사용;
LeagueOAuth 2ServerResourceServer 사용;
LeagueOAuth2ServerGrantClientCredentialsGrant 사용;
LeagueOAuth2ServerGrantPasswordGrant 사용;
LeagueOAuth2ServerGrantAuthCodeGrant 사용;
LeagueOAuth2ServerGrantImplicitGrant 사용;
LeagueOAuth2ServerRepositories{AccessTokenRepositoryInterface,

AuthCodeRepositoryInterface,
ClientRepositoryInterface,
RefreshTokenRepositoryInterface,
UserRepositoryInterface};

LeagueOAuth2Server 사용{ResourceServer, 인증 ValidatorsBearerTokenValidator};

//서버 구성
$server = new AuthorizationServer(

$clientRepository,
$accessTokenRepository,
$scopeRepository,
$privateKey,
$publicKey

);

//인증 유형 구성
$server->enableGrantType(new ClientCredentialsGrant());
$server->enableGrantType(

new PasswordGrant(
    $userRepository,
    $refreshTokenRepository
)

);
$server->enableGrantType(

new AuthCodeGrant(
    $authCodeRepository,
    $refreshTokenRepository,
    new DateInterval('PT10M')
)

);
$server->enableGrantType(

new ImplicitGrant(
    new DateInterval('PT1H')
)

);

//리소스 서버 구성
$resourceServer = new ResourceServer(

$accessTokenRepository,
$publicKey

);

//BearerTokenValidator 구성
$bearerTokenValidator = new BearerTokenValidator(

$accessTokenRepository,
$publicKey

);

上述代码中的各个参数需要根据实际的业务需求进行具体配置。

3. 执行授权请求

在OAuth2服务器文件中,需要实现授权请求的处理逻辑。实现代码如下:

use PsrH ttpMessageServerRequestInterface;
use PsrHttpMessageResponseInterface ;

// 인증 요청 처리
$server->respondToAccessTokenRequest($request, $response);

上述代码中的$request和$response分别为从HTTP传输层获取的请求参数和响应结果。需要根据实际业务需求进行具体实现。

4. 请求受保护的资源

完成授权后,客户端可以携带访问令牌请求受保护的资源。OAuth2.0服务器需要对访问令牌进行验证,并返回相应的结果。实现代码如下:

// 베어러 토큰 확인
시도 {

$bearerTokenValidator->validateAuthorization($request);

} catch(예외 $e) {

$response->getBody()->write($e->getMessage());
return $response->withHeader('Content-Type', 'text/plain')->withStatus(401);

}

// 요청 헤더에서 액세스 토큰을 처리합니다
$accessToken = $request->getHeader('Authorization')[0];
$accessToken = substr($accessToken, strpos( $accessToken, ' ') + 1) ;

//액세스 토큰 확인
시도 {

$resourceServer->validateAuthenticatedRequest($request);
$response->getBody()->write('Access granted');

} catch(예외 $e) {

$errorMessage = $e->getMessage();
$response->getBody()->write($errorMessage);
return $response->withHeader('Content-Type', 'text/plain')->withStatus(401);

}

5. 总结

위 내용은 PHP를 사용하여 OAuth2.0을 구현하는 가장 좋은 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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