LINEログインを利用してPowerCMS Xの会員サイトにログインする

公開

勤務先のブログ記事「シングルサインオンプラグインの設計について考える」に書いたのですが、SAML認証を実装する案件を担当したところ、他のサーバーと通信をして自分のアプリケーションにログインできる仕組みがとても面白く、ステイホームで持て余している時間を利用して色々研究しています。XMLでレスポンスが返ってくるSAML認証も面白いのですが、どちらかと言えばJSONでレスポンスが返ってくるOpenID Connectの方が好きかな、と思っています。

そのようなわけで現状SAMLは業務中に必要な実装だけし、プライベートな時間にOpenID Connectを色々触っているのですが、最近自治体なども含めさまざまな組織がさまざまなシーンで利用している「LINE」もOpenID Connectプロトコルをサポートした「LINEログイン」を提供していることを知り、早速試してみました。開発時はKeycloakを利用しており、検証でGoogle、Yahoo!が認証に利用できることも確認していました。

LINEも設定を変えるだけで利用できるかと思いきや、ドキュメントを確認していくとトークンエンドポイントからのレスポンスにkid(公開鍵ID)がなく、別の実装が必要になることが分かりました。そこで、シングルサインオンプラグインにフックポイントを追加し、トークンエンドポイントからのレスポンスを受け取った後の処理を別プラグインに書いてみました。

実装内容は「IDトークンからプロフィール情報を取得する | LINE Developers」にある通り、IDトークを検証するエンドポイントにデータを送信するだけです。レスポンスでメールアドレスが得られるので、ログイン処理に渡します。

require_once( LIB_DIR . 'Prototype' . DS . 'class.PTPlugin.php' );

class LINELogin extends PTPlugin {

    public function __construct () {
        parent::__construct();
    }

    // シングルサインオンプラグインの設定画面にはない別のOpenID Provider(LINE)を登録
    public function set_config( PTOIDC $app ) {
        if ( $app->param( 'provider' ) === 'line' ) {
            $app->client_id           = 'xxxxxxxx';
            $app->client_secret       = 'xxxxxxxx';
            $app->oidc_config_url     = 'https://access.line.me/.well-known/openid-configuration';
            $app->rp_acs_endpoint_url = 'https://test.cms.anothersky.pw/app/pt-member-oidc.php?__mode=acs&provider=line';
        }
    }

    // IDトークンを検証してログイン処理
    public function login( PTOIDC $app ) {
        $json = $app->get_token_endpoint_response_json();
        $id_token = $json->id_token;
        $endpoint_url = 'https://api.line.me/oauth2/v2.1/verify';
        $data = [
            'id_token'      => $id_token,
            'client_id'     => $app->client_id,
            // 'nonce'      => '',
        ];
        $json_string = $app->send_post_request( $endpoint_url, $data );
        if ( $json_string === false ) {
            $app->error( 'Failed to connect the verify endpoint.' );
            exit;
        }

        $payload = json_decode( $json_string );
        $return_url = $app->return_url;
        $workspace_id = $app->workspace_id;
        $app->login_with_sso( 'OpenID', 'email', $payload->email, $app->model, $return_url, [], $workspace_id );
        exit;
    }

}

PowerCMS Xにユーザーが登録済みである前提になっていますが、LINEのフローチャートにもある通り新規登録の実装も可能と考えています。

ログインする様子は以下の通りです。音声での説明がないのですが、iPhoneで会員サイトを開き「LINEログイン」ボタンをクリックするとLINEアプリに移動してログイン処理が行われ、会員サイトに戻ってくるという動きです。面白い。

プラグインの公開等がどうなるかはまだ決まっておりませんので、しばらくお待ち頂ければと思います。