デラーズ・ブートキャンプ

ギークになりたいプログラマの日記

Slim3で OAuth2サーバーを構築 (リソースサーバー編)

今回は前回作ったOAuth2サーバー(ClientCredentialsGrant)で発行されたキーを使って、認証を行って通信をするサーバーの構築を行います。前回の方法で発行されたのはJWTトークンといって、トークン内に有効期限、クライアントID、スコープを含んでいます。ですので、認証サーバーで発行された publickey を使った、リソースサーバーのみの実装になります。また、league/oauth2-serverの仕様では PSR-7 のミドルウェア で実装されているので CakePHP3 等でも実装可能なはず。

環境構築

OAuth2を入れる所までは前回と同じです。 composer create-project slim/slim-skeleton php-oauth2-server composer remove slim/php-view composer require league/oauth2-server

autoloadの設定も前回と同じでOK

"autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    },

実装

これもOAuth2のホームページExampleを参考にして実装していきます。(・・・認証処理で特別実装がなければRepositoryとEntityはgithubのコードそのままでいいと思われる)。あと試していないけど、AuthCodeGrantでも同じ実装で良さそう。

<?php 

# dependencies.php
$container['oauth2'] = function ($c) {
    // Init our repositories
    $accessTokenRepository = new App\OAuth2\Repositories\AccessTokenRepository(); // instance of AccessTokenRepositoryInterface

    // 認証サーバーで発行したpublickeyを指定する。
    $publicKey = 'file:///XXXXXXXXXXX/public.key';
            
    // Setup the authorization server
    $server = new \League\OAuth2\Server\ResourceServer(
        $accessTokenRepository,
        $publicKey
    );
    return $server;
};

# middleware.php
# 追加する
$app->add(new \League\OAuth2\Server\Middleware\ResourceServerMiddleware($app->getContainer()->get('oauth2')));

テスト

今回もPostmanで確認します。PostmanはOAuth2にも対応してるので便利です。認証成功したらリクエストのAttributesに OAuth_XXXXX という項目が追加されるので、リターンしてみます。

<?php 
# routes.php
# RequestのAttrebute内に認証された情報を入っているか確認
$app->get('/', function ($request, $response, $args) {
    $this->logger->info("Slim-Skeleton '/' route");
    return $response->withJson($request->getAttributes())->withStatus(200);
});

Postmanで送信 f:id:Derabon:20170629085152p:plain

f:id:Derabon:20170629085315p:plain

まとめ

これでOAuth2サーバーの構築は完了ですが、機能面の実装はもっとちゃんと考える必要があるんじゃないかと思いました。OAuth2の勉強から始まりたてる事になったので、マサカリを投げてもらえると嬉しいです。

今回できたもの

https://github.com/dera0520/php-oauth2-resource

参考

oauth2.thephpleague.com github.com/thephpleague/oauth2-server Slim 3 Framework でMySQLとテンプレつかってみる。その2