ホームページ  >  記事  >  バックエンド開発  >  API を保護するために PHP に OAuth 2.0 を統合する方法

API を保護するために PHP に OAuth 2.0 を統合する方法

WBOY
WBOYオリジナル
2023-06-17 10:49:281400ブラウズ

現在のモバイルおよび Web アプリケーションでは、API は不可欠な部分であり、ユーザーとアプリケーションにインタラクティブなインターフェイスを提供します。ただし、これらの API は悪意のあるユーザーやハッカーにリスクをもたらし、機密データの漏洩につながる可能性があります。したがって、API は不正アクセスを防ぐために保護される必要があります。 OAuth 2.0 は、トークンを介して API にアクセスできるようにすると同時に、そのアクセスが許可されていることを確認できる実証済みの方法です。

この記事では、PHP に OAuth 2.0 を統合して API を保護する方法について説明します。

OAuth 2.0 とは何ですか?

OAuth 2.0 は、ユーザーがサードパーティにリソース (写真、ドキュメント、連絡先など) へのアクセスを許可できるオープン標準です。具体的には、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 に再ルーティングされます。

ステップ 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() メソッドを使用してユーザー オブジェクトを取得します。最後に、ユーザー データとアクセス トークンをセッションに保存します。

ステップ 5: アクセス トークンを使用して API を呼び出す

最後に、アクセス トークンを使用して保護された API を呼び出すことができます。この例では、アクセス トークンを使用した認証を必要とする GitHub API を使用します。

<?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);

上記のコードでは、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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。