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

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

OAuth2 の 続き….

スコープについて調べてみました

Scope の準備

server.php に Oauth¥Scope を追加します

$server->setScopeUtil(new OAuth2\Scope($storage,array('default_scope'=>'user')));

テーブルにある oauth_scope には、多分 supported scope を列挙するんだと思います
それと、oauth_users と oauth_clients にも scope と言うフィールドがあります
ちなみに、oauth_scopes には、こんな風に書いてあります

mysql> select * from oauth_scopes;
+---------------+------------+
| scope         | is_default |
+---------------+------------+
| administrator |          0 |
| user          |          1 |
| viewer        |          0 |
+---------------+------------+
3 rows in set (0.00 sec)
 
mysql>

server.php には、追加するスコープの記載はしていません

 

パスワード認証でスコープを確認する

token.php を使って grant_type=password で認証をするときに、scope を無指定で認証すると oauth_users の scope フィールドの値を返すようです

oauth_users テーブルはこんな感じです

mysql> select * from oauth_users;
+-----------+----------+------------------------------------------+------------+-----------+-------+----------------+--------------------+
| record_no | username | password                                 | first_name | last_name | email | email_verified | scope              |
+-----------+----------+------------------------------------------+------------+-----------+-------+----------------+--------------------+
|         1 | testuser | d1dd88e9f57f81f02377d682f7fbb75b562bXXXX | XXX        | XXX       | NULL  |           NULL | administrator user |
+-----------+----------+------------------------------------------+------------+-----------+-------+----------------+--------------------+
1 row in set (0.00 sec)
 
mysql>

コマンドで確認

user@ubuntuSFAScratch:~$ curl http://172.16.XXXX.XXX/sfa/token.php -d 'grant_type=password&client_id=testuser&username=testuser&password=testpass'
{
  "access_token":"b73c9e53020df29a8de63b6deae6d7ad1a02XXXX",
  "expires_in":3600,
  "token_type":"Bearer",
  "scope":"administrator user",
  "refresh_token":"77027f08cb9941eb97d8a7c8c171b75f93beXXXX"
}
user@ubuntuSFAScratch:~$

では、user だけを要求したときは?というと

user@ubuntuSFAScratch:~$ curl http://172.16.XXX.XX/sfa/token.php -d 'grant_type=password&client_id=testuser&username=testuser&password=testpass&scope=user'
{
  "access_token":"582027f6ad8cc1563bac33e1eb3446e39c57XXXX",
  "expires_in":3600,
  "token_type":"Bearer",
  "scope":"user",
  "refresh_token":"fb19e948bf41600e51f6b2a958061bae14adXXXX"
}
user@ubuntuSFAScratch:~$

scope には user だけが返ってきています
リフレッシュしたときはと言うと、

user@ubuntuSFAScratch:~$ curl http://172.16.XXX.XXX/sfa/token.php -d 'grant_type=refresh_token&refresh_token=ff1bc08777a59042ca25a2df11361f2ac43bXXXX&client_id=testuser'
{
  "access_token":"397577223cf0c3186d7312e64eafa1d09709XXXX",
  "expires_in":3600,
  "token_type":"Bearer",
  "scope":"user",
  "refresh_token":"1548fef22b3bd9fb1e1503f9d5c379e6887fXXXX"
}
user@ubuntuSFAScratch:~$

一応、アクセストークンを入手したときに指定したスコープを返してきているようです
# パラメータが連続していないのは、ちょっと、ミスコーディングしてやり直したからです ^^;

User Credentials の時には oauth_users の scope フィールドに記載されていないスコープは指定できないようです

user@ubuntuSFAScratch:~$ curl http://172.16.XXX.XXX/sfa/token.php -d 'grant_type=password&client_id=testuser&username=testuser&password=testpass&scope=administrator user viewer'
{
  "error":"invalid_scope",
  "error_description":"The scope requested is invalid for this request"
}
user@ubuntuSFAScratch:~$

oauth_scopes には viewer の指定がありますが、指定すると invalid scope と返ってくるようです

 

Client Credentials で認証した場合

アクセストークンを要求するときに scope を一緒に要求すると、スコープの要求が出来る様です

オーソライズするするときに、引数に scope を含めます
%20 がセパレータのの様ですので + で繋げます

http://172.16.XXX.XXX/sfa/authorize.php?response_type=code&client_id=testclient&state=xyz&scope=administrator+user

で、このまま grant_type=authorization でアクセストークンを取り込みます

user@ubuntuSFAScratch:~$ curl -u testclient:testpass http://172.16.XXX.XXX/sfa/token.php -d 'grant_type=authorization_code&code=9b786417951a20645457144a24988ce3f0c8XXXX'
{
  "access_token":"34f2c3010e1d48f5f8df6fac69962b8c5210XXXX",
  "expires_in":3600,
  "token_type":"Bearer",
  "scope":"administrator user",
  "refresh_token":"3d887f40026f654957c4af021eba0b4bbd9eXXXX"
}
user@ubuntuSFAScratch:~$

スコープが指定された様子です
で、リフレッシュではと言うと..

user@ubuntuSFAScratch:~$ curl -u testclient:testpass  http://172.16.XXX.XXX/sfa/token.php -d 'grant_type=refresh_token&refresh_token=3d887f40026f654957c4af021eba0b4bbd9eXXXX'
{
  "access_token":"855348d623707b31cbc95244da99301e71abXXXX",
  "expires_in":3600,
  "token_type":"Bearer",
  "scope":"administrator user"
}
user@ubuntuSFAScratch:~$

スコープも返ってきたようです

コマンド
http://172.16.XXX.XXX/sfa/authorize.php?response_type=code&client_id=testclient&state=xyz&scope=administrator+user+viewer

レザルト
user@ubuntuSFAScratch:~$ curl -u testclient:testpass http://172.16.XXX.XXX/sfa/token.php -d 'grant_type=authorization_code&code=4a49a89e6f7c06cbb61534c109eb2142bb75XXXX'
{
  "access_token":"41a9b442ef487b1842cfe635cf13f7d7cbc7XXXX",
  "expires_in":3600,
  "token_type":"Bearer",
  "scope":"administrator user viewer",
  "refresh_token":"406ae355749b15008d2311d29e09a466fc45XXXX"
}
user@ubuntuSFAScratch:~$

user_clients の scope フィールドが NULL の場合はイケるようです
前日の確認の所にもありますが、デフォルトでこの ctestlicent の scope フォールドは NULL ですから、authorize.php の scope なければ scope:null で返ってきます

では、oauth_socpes に登録されていないスコープを指定した場合はと言うと..

client_user の redirect_uri へこんな感じの引数付きでリダイレクトしてきます

コール
http://172.16.XXX.XXX/sfa/authorize.php?response_type=code&client_id=testclient&state=xyz&scope=administrator+user+viewer+publisher

レザルト(リダイレクト)
http://172.16.XXX.XXX/sfa/?error=invalid_scope&error_description=An+unsupported+scope+was+requested&state=xyz

publisher と言うスコープは用意していません
.

 

うーん、体調悪いな…
もう一度、再調査…
見落としあるかもしれない…

多分、続く…
.

コメントを残す

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


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。