自社用に簡易 SFA システムを構築してみると言う事になり、今回はオンプレミスではイケなさそうですので認証システムを OAuth2 で作って見ようという試み..
認証を受ける側というのは何度か試してみたのだけれども、今までの認証する側というのは Apache の Digest 認証で賄ってきました
でも、折角なので OAuth2 で行ってみよう!と言う事にしました ^^/
はじめ
最初は、WordPress の プラグインで認証でも良いのかな?なんて思ってました
でも、環境がおかしいのか解らないのですが、上手くインストールする事が出来ない…
# OAuth1 のは動いてましたけど、OAuth2 のプラグインが何かが邪魔して動かない…
利用者も余り多くないので、数人で運営できる程度でも良いので、bshaffer/oauth2-server-php を利用してみる事にしました
oauth2-server-php のブランチは master と言うのを拾ってきました
CHANGELOG.md には * 1.9.0 (2016-01-06) と書いてあります
https://bshaffer.github.io/oauth2-server-php-docs/cookbook/
ここに書いてある、クックブック に倣って、とりあえず動くまで!を試してみよう!
データーベース
完成したシステムの運営は さくらインターネットのレンタルサーバーを利用しようと目論んでいますので、データベースエンジンは MySQL を想定しています
まだ、評価中ですので Ubuntu 16.04.3 LTS に LAMP と OpenSSL をインストールして、いつもの環境を VMware 上に用意しています
ついでに、メンテナンスしやすそうなので phpMyAdmin も入れてみました
最初に データーベースを用意します
文字コードに 4バイトの Unicode が指定できる様になったらしいので、ためしに設定してみた ^^;
mysql> create database oauth2test character set utf8mb4;
クックブックのページに従って、次の様にテーブルを用意しました
mysql> use oauth2test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+---------------------------+
| Tables_in_oauth2test |
+---------------------------+
| oauth_access_tokens |
| oauth_authorization_codes |
| oauth_clients |
| oauth_jwt |
| oauth_refresh_tokens |
| oauth_scopes |
| oauth_users |
+---------------------------+
7 rows in set (0.00 sec)
で、テスト用のユーザーを一人分登録します
INSERT INTO oauth_clients (client_id, client_secret, redirect_uri) VALUES ("testclient", "testpass", "http://fake/");
テーブルは、クックブックに SQL で書いてあるので、テキストに落として実行しても良し!コピペして phpMyAdmin で実行しても良し…
oauth サーバーオブジェクトの用意
クックブックに server.php のソースが載っていますので、そのままコピペして保存します
もちろん、<?php ~ ?>
で囲みます
$dsn = 'mysql:dbname=oauth2test;host=localhost';
$username = 'root';
$password = 'XXXXXXXX';
これは、さっき作ったデータベースにアクセス出来る様に指定します
.
トークンコントローラーの用意
token.php と言うファイルを用意し、そのままコピペします
curl を使って、動作確認出来るようです
user@ubuntuSFAScratch:~$ curl -u testclient:testpass http://172.16.XXX.XXX/sfa/token.php -d 'grant_type=client_credentials'
{
"access_token":"45975b1f0a0c29444617dda5c64fb37469baXXXX",
"expires_in":3600,
"token_type":"Bearer",
"scope":null
}
user@ubuntuSFAScratch:~$
こんな感じで、アクセストークンが入手出来ます
リソースコントローラーの用意
resource.php というファイルを用意して、そのままコピペします
さっきのアクセストークンで、アクセスできるか確認してみます
user@ubuntuSFAScratch:~$ curl http://172.16.XXX.XXX/sfa/resource.php -d 'access_token=45975b1f0a0c29444617dda5c64fb37469baXXXX'
{
"success":true,
"message":"You accessed my APIs!"
}
サクセス:true で良い様です!
オーソライズコントローラーの用意
これも同様に authorize.php と言うファイルを用意して、コピペします
認証しますか?はい・いいえ
の表示がされますので、yes を選択すると、code が発行されます
生きてる時間が短いので、ブラウザーのアドレスに
http://172.16.XXX.XXX/sfa/authorize.php?response_type=code&client_id=testclient&state=xyz
と入力すると、ソースにあるメッセージを表示されます
yes を選択すると
SUCCESS! Authorization Code: 71d8222df62ce7564e7063112b7545cc787fXXXX
と、コードが発行されます
no を選択すると、ユーザー登録で作った redirect_uri へ引数付きでリダイレクトされます(この例では http://fake/)
このコードは、テーブルに記録されています
.
リダイレクト先の指定とかリフレッシュトークンの渡し方とか、まだ調べていませんし…
調べる事、一杯在るな….
トークンの期限とか…