我正在使用Restler和由Brent Shaffer编写的OAuth2模块。我想要做的是从他们发送的令牌中,在我的应用程序类中,而不仅仅是OAuth2Server类中确定用户。
我可以看到有两种方法可以做到这一点。希望这能解释我的目标。
方法1: 我不是特别喜欢这种方法,但它确实有效。
POST /v1/token
返回我的令牌,包括user_id,例如
{
"access_token":"282090609b3407d981c2bea633a39739595ba426",
"expires_in":3600,
"token_type":"Bearer",
"scope":"basic",
"refresh_token":"b60a4e5f759168df857342380f3550bc120b6f9d",
"user_id": 5
}
现在客户端知道user_id,它随我的请求一起发送:
GET /v1/dashboard?id=5
我的__isAllowed方法负责检查用户是否未更改ID,请求不属于他们的信息。
public function __isAllowed() {
$token = static::$server->getAccessTokenData(Request::createFromGlobals());
return (($token['user_id'] > 0) && ($token['user_id'] === $_GET['id']) && ($token['group_id'] == self::$group_id));
}
Dashboard类看起来像这样:
/*
* @version 1
* @access protected
*/
class Dashboard {
/**
* @param int $id Customer ID {@from query}
* @return type
*/
public function index($id) {
$s = Dao\ViewCustomerDaoObject::findId($id);
return array_merge($s->toJSON(), $widgets);
}
}
这就是我更喜欢调用API的方式:
GET /v1/dashboard
当我请求上述内容时,请将oauth2_token表加入我的仪表板表。我认为这可能是一个黑客攻击,我不希望这会导致问题。
该信息已在OAuth2Server实例中提供,因为OAuth2Server类确定是否使用了正确的令牌以及他们的user_id是什么。
有人可以指导我正确的方向处理这种情况,特别是对于Restler?
答案 0 :(得分:1)
我实际上是自己想出来的。
在OAuth2Server-> __ isAllowed方法中,您必须在静态User类中设置UserId。
public function __isAllowed() {
$token = static::$server->getAccessTokenData(Request::createFromGlobals());
// If the user_id is valid, set static user class.
// *** This is not production code, add more checks here if you use this!
if ($token['user_id'] > 0) {
\Luracast\Restler\User::init();
\Luracast\Restler\User::setUniqueIdentifier($token['user_id']);
return true;
}
return false;
}
现在,您可以通过调用以下方式获取课程中当前经过身份验证的用户:
\Luracast\Restler\User::getUniqueIdentifier(true)