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 と言うスコープは用意していません
.
うーん、体調悪いな…
もう一度、再調査…
見落としあるかもしれない…
多分、続く…
.