bshaffer/oauth2-server-php で OAuth2 認証システムを構築してみる その2

この記事は公開されてから時間が経っています

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>

キチンと指定されたようです
四週間に延長されました
 

続き…

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


The reCAPTCHA verification period has expired. Please reload the page.