OAuth2 の 続き
refresh_token の設定についての備忘録
リフレッシュトークンの確認
リフレッシュトークンの説明は、ここにあります
http://bshaffer.github.io/oauth2-server-php-docs/grant-types/refresh-token/
一応、code で認証を受けると帰ってきます
※ authorize.php?response_type=code&client_id=testclient&state=xyz の認証ページで OK を選択すると code が帰ってきます
user@ubuntuSFAScratch:~$ curl -u testclient:testpass http://172.16.XXX.XXX/sfa/token.php -d 'grant_type=authorization_code&code=0c54e0a231b9e0aff49e0dcf70c669e916dfXXXX'
{
"access_token":"b151724d2792f718d232017217d35ed27b3eXXXX",
"expires_in":3600,
"token_type":"Bearer",
"scope":null,
"refresh_token":"c19171f474db1d54f2189e9ebfed93e267e7XXXX"
}
user@ubuntuSFAScratch:~$
データーベースを覗いてみると
mysql> SELECT * FROM `oauth_refresh_tokens` WHERE 1 ;
+------------------------------------------+------------+---------+---------------------+-------+---------------------+
| refresh_token | client_id | user_id | expires | scope | create_time |
+------------------------------------------+------------+---------+---------------------+-------+---------------------+
| c19171f474db1d54f2189e9ebfed93e267e7XXXX | testclient | NULL | 2017-11-10 15:26:50 | NULL | 2017-10-27 15:26:50 |
+------------------------------------------+------------+---------+---------------------+-------+---------------------+
1 row in set (0.00 sec)
mysql>
こんな感じで保存されています
デフォルトでは有効期間は二週間のようです (1209600sec = 2w x 7d x 24h x 60m x 60s)
.
リフレッシュトークンで再認証
grant_type に refresh_token を指定して、refresh_tone へリフレッシュトークン文字列を渡す(日本語がちょっと変?)
user@ubuntuSFAScratch:~$ curl -u testclient:testpass http://172.16.205.33/sfa/token.php -d 'grant_type=refresh_token&refresh_token=2adad1d1c131ad0dd69295fdeea39952069fXXXX'
{
"access_token":"c11f86d3dfdb2622e9f9216f182081466a3bXXXX",
"expires_in":3600,
"token_type":"Bearer",
"scope":null,
"refresh_token":"7f72fcea247dd74c66a680ec3e8d29aaed85XXXX"
}
user@ubuntuSFAScratch:~$
渡したリフレッシュトークンと、帰ってきたリフレッシュトークンが違う!
これは、
server.php (cookbookのヤツ)で、
// create the grant type
$grantType = new OAuth2\GrantType\RefreshToken($storage, array('always_issue_new_refresh_token' => true,'refresh_token_lifetime'=>2419200));
// add the grant type to your OAuth server
$server->addGrantType($grantType);
を指定しているからだと思うけど..
生存期間が短いんだよなぁ…
always_issue_new_refresh_token = false に設定したら、変更されないので、リフレッシュトークンも返ってきませんでした
user@ubuntuSFAScratch:~$ curl -u testclient:testpass http://172.16.205.33/sfa/token.php -d 'grant_type=refresh_token&refresh_token=7f72fcea247dd74c66a680ec3e8d29aaed85XXXX'
{
"access_token":"9dd42fc009a40e0fa9472c5bcffeb5c1a803XXXX",
"expires_in":3600,
"token_type":"Bearer",
"scope":null
}
user@ubuntuSFAScratch:~$
ちなみに、always_issue_new_refresh_token = false のままだと、データベースに記録されているリフレッシュトークンは変更されません
always_issue_new_refresh_token = true にすると、リフレッシュトークンの内容は、書き換えられます
失効したリフレッシュトークン
データベースを着替えて、リフレッシュトークンを失効させてみた
こんな感じ
user@ubuntuSFAScratch:~$ curl -u testclient:testpass http://172.16.205.33/sfa/token.php -d 'grant_type=refresh_token&refresh_token=7f72fcea247dd74c66a680ec3e8d29aaed85XXXX'
{
"error":"invalid_grant",
"error_description":"Invalid refresh token"
}
user@ubuntuSFAScratch:~$
.
リフレッシュトークンのライフタイムの指定方法
あちこち探して見付けました ^^b
サーバーオブジェクトを作成する際に指定すると、上手く行く様です
クックブックの server.php で、
// Pass a storage object or array of storage objects to the OAuth2 server class
$server = new OAuth2\Server($storage,array('refresh_token_lifetime' => 86400));
こんな感じに指定しました
記録されたデータはこんな感じになりました
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> SELECT * FROM `oauth_refresh_tokens` WHERE 1;
+------------------------------------------+------------+---------+---------------------+-------+---------------------+
| refresh_token | client_id | user_id | expires | scope | create_time |
+------------------------------------------+------------+---------+---------------------+-------+---------------------+
| aaff643822b07f11c9a667d0099c3656d311XXXX | testclient | NULL | 2017-10-28 17:55:35 | NULL | 2017-10-27 17:55:35 |
+------------------------------------------+------------+---------+---------------------+-------+---------------------+
1 row in set (0.00 sec)
mysql>
create_time というのは、作成時間のタイムスタンプを記録する様にテーブルに追加した項目です
expires が、一日後になっています
ほかのパラメーターも OAuth2¥Server の、二番目の引数で渡した方が上手く行くようです
oauth2-server-php\src\OAuth2\Server.php には、これだけ書いてあります
$this->config = array_merge(array(
'use_jwt_access_tokens' => false,
'store_encrypted_token_string' => true,
'use_openid_connect' => false,
'id_lifetime' => 3600,
'access_lifetime' => 3600,
'www_realm' => 'Service',
'token_param_name' => 'access_token',
'token_bearer_header_name' => 'Bearer',
'enforce_state' => true,
'require_exact_redirect_uri' => true,
'allow_implicit' => false,
'allow_credentials_in_request_body' => true,
'allow_public_clients' => true,
'always_issue_new_refresh_token' => false,
'unset_refresh_token_after_use' => true,
), $config);
多分、このパラメーターは、コンストラクタの引数で渡した方が上手く行くんだと思う ^^..
// Pass a storage object or array of storage objects to the OAuth2 server class
$server = new OAuth2\Server($storage,array('always_issue_new_refresh_token' => true,'refresh_token_lifetime'=>'2419200'));
こういう風に指定してみたら
mysql> SELECT * FROM `oauth_refresh_tokens` WHERE 1;
+------------------------------------------+------------+---------+---------------------+-------+---------------------+
| refresh_token | client_id | user_id | expires | scope | create_time |
+------------------------------------------+------------+---------+---------------------+-------+---------------------+
| 79d6982c6262cbc034a632ab53a45d933396XXXX | testclient | NULL | 2017-11-24 18:20:01 | NULL | 2017-10-27 18:20:01 |
+------------------------------------------+------------+---------+---------------------+-------+---------------------+
1 row in set (0.00 sec)
mysql>
キチンと指定されたようです
四週間に延長されました