>백엔드 개발 >PHP 튜토리얼 >API 보안을 위해 PHP에 OAuth 2.0을 통합하는 방법

API 보안을 위해 PHP에 OAuth 2.0을 통합하는 방법

WBOY
WBOY원래의
2023-06-17 10:49:281404검색

현재 모바일 및 웹 애플리케이션에서 API는 사용자와 애플리케이션에 대화형 인터페이스를 제공하는 데 필수적인 부분입니다. 그러나 이러한 API는 악의적인 사용자와 해커에게 위험을 초래하고 민감한 데이터가 유출될 수도 있습니다. 따라서 API는 무단 액세스를 방지하기 위해 보안을 유지해야 합니다. OAuth 2.0은 토큰을 통해 API에 액세스할 수 있는 권한이 있는지 확인하는 검증된 방법입니다.

이 기사에서는 PHP에 OAuth 2.0을 통합하여 API를 보호하는 방법을 살펴보겠습니다.

OAuth 2.0이란 무엇인가요?

OAuth 2.0은 사용자가 제3자에게 자신의 리소스(예: 사진, 문서, 연락처 등)에 액세스할 수 있는 권한을 부여할 수 있는 개방형 표준입니다. 보다 구체적으로 OAuth 2.0은 인증 토큰을 사용하여 사용자를 대신하여 리소스에 액세스합니다. 액세스 토큰은 권한 부여 서버에서 발급한 자격 증명으로 리소스에 액세스할 때 호출자에게 제공됩니다. 호출자는 각 요청에 이 토큰을 사용하여 리소스에 액세스할 수 있는 권한이 있음을 나타낼 수 있습니다.

PHP에 OAuth 2.0 통합

PHP에는 선택할 수 있는 OAuth 2.0 라이브러리가 많이 있습니다. 이번 글에서는 phpleague/oauth2-client 패키지를 이용하여 OAuth 2.0을 구현하는 과정을 소개하겠습니다.

1단계: phpleague/oauth2-client 패키지 설치

먼저 phpleague/oauth2-client 패키지를 설치해야 합니다. Composer 패키지 관리자를 사용하여 설치할 수 있습니다. 터미널 또는 명령줄 인터페이스에서 프로젝트 디렉터리로 이동하여 거기서 다음 명령을 실행합니다.

composer require league/oauth2-client

2단계: 공급자 클라이언트 설정

이제 공급자 클라이언트를 정의해야 합니다. 여기서는 GitHub OAuth 공급자를 예로 사용합니다. 먼저 CLIENT_ID 및 CLIENT_SECRET 상수 값을 실제 애플리케이션 자격 증명으로 변경합니다.

<?php

require 'vendor/autoload.php';

use LeagueOAuth2ClientProviderGithub;

const CLIENT_ID = 'your_client_id';
const CLIENT_SECRET = 'your_client_secret';
const REDIRECT_URI = 'http://localhost/oauth2/callback.php';

$provider = new Github([
    'clientId'        => CLIENT_ID,
    'clientSecret'    => CLIENT_SECRET,
    'redirectUri'     => REDIRECT_URI,
]);

3단계: 인증 코드 받기

다음으로 인증 코드를 받아야 합니다. 인증 코드는 추가로 액세스 토큰을 얻을 때 신원을 확인하는 데 사용되는 임시 토큰입니다.

<?php

$authorizationUrl = $provider->getAuthorizationUrl([
    'scope' => ['user', 'repo', 'notifications']
]);

$_SESSION['oauth2state'] = $provider->getState();

header('Location: ' . $authorizationUrl);

위 코드에서 getAuthorizationUrl() 메서드는 인증 URL을 반환하고, 이 URL로 점프하면 사용자가 GitHub로 이동하여 액세스 토큰을 제공하도록 요청합니다. GitHub가 권한을 부여하면 사용자를 권한 부여 코드가 포함된 리디렉션 URI로 다시 라우팅합니다. getAuthorizationUrl()方法返回一个授权URL,跳转到该URL将引导用户到GitHub,要求他们提供访问令牌。当GitHub授权后,它会将用户重新路由到一个重定向URI,其中包含授权码。

步骤4:获取访问令牌

现在,我们需要使用我们在上一步中获得的授权码来获取访问令牌。

<?php

if (isset($_GET['code']) && isset($_GET['state']) && isset($_SESSION['oauth2state'])) {
    if ($_GET['state'] === $_SESSION['oauth2state']) {

        try {
            $token = $provider->getAccessToken('authorization_code', [
                'code' => $_GET['code']
            ]);

            $accessToken = $token->getToken();
            $refreshToken = $token->getRefreshToken();
            $expires = $token->getExpires();
        } catch (Exception $e) {
            exit('Failed to get access token: ' . $e->getMessage());
        }

        // Get the user object.
        try {
            $user = $provider->getResourceOwner($token);
            $name = $user->getName();
            $email = $user->getEmail();
            $imageUrl = $user->getAvatarUrl();
            $profileUrl = $user->getHtmlUrl();
        } catch (Exception $e) {
            exit('Failed to get user: ' . $e->getMessage());
        }

        // Store the access token and user data somewhere
        // for use in your application.
        $_SESSION['github_access_token'] = $accessToken;
        $_SESSION['github_refresh_token'] = $refreshToken;
        $_SESSION['github_expires'] = $expires;
        $_SESSION['github_user_name'] = $name;
        $_SESSION['github_user_email'] = $email;
        $_SESSION['github_user_image'] = $imageUrl;
        $_SESSION['github_user_profile_url'] = $profileUrl;

        // Redirect the user to the original page
        // or some other authorized page in your application.
        header('Location: /');
        exit();
    } else {
        exit('Invalid state');
    }
}

在上面的代码中,我们首先使用getAccessToken()方法获取访问令牌。然后,我们使用getResourceOwner()

4단계: 액세스 토큰 받기

이제 이전 단계에서 받은 인증 코드를 사용하여 액세스 토큰을 받아야 합니다.

<?php

$client = new GuzzleHttpClient();

$response = $client->request('GET', 'https://api.github.com/user', [
    'headers' => [
        'Authorization' => 'Bearer ' . $_SESSION['github_access_token'],
        'User-Agent' => 'OAuth2 Client'
    ]
]);

$body = $response->getBody();
$userData = json_decode($body, true);

위 코드에서는 먼저 getAccessToken() 메서드를 사용하여 액세스 토큰을 가져옵니다. 그런 다음 getResourceOwner() 메서드를 사용하여 사용자 개체를 가져옵니다. 마지막으로 사용자 데이터와 액세스 토큰을 세션에 저장합니다.

5단계: 액세스 토큰을 사용하여 API 호출

마지막으로 액세스 토큰을 사용하여 보호된 API를 호출할 수 있습니다. 이 예에서는 액세스 토큰을 사용하여 인증해야 하는 GitHub API를 사용합니다.

rrreee

위 코드에서는 Guzzle HTTP 클라이언트를 사용하여 GitHub API를 호출하고 있습니다. 이 API에 대한 액세스 권한이 있음을 나타내기 위해 액세스 토큰으로 Authorization 헤더를 설정합니다.

결론🎜🎜PHP에 OAuth 2.0을 통합하는 것은 API를 보호하는 좋은 방법입니다. phpleague/oauth2-client 패키지를 사용하면 공급자로부터 액세스 토큰을 얻을 수 있으며 해당 토큰을 사용하여 보호된 API를 호출할 수 있습니다. 또한 향후 사용을 위해 사용자 데이터와 토큰을 저장할 수 있습니다. 🎜🎜이제 OAuth 2.0 통합을 시작하여 API를 보호하고 사용자 데이터를 보호할 수 있습니다. 🎜

위 내용은 API 보안을 위해 PHP에 OAuth 2.0을 통합하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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