Restler + OAuth2 - 正确识别用户

时间:2014-02-05 13:18:10

标签: php oauth-2.0 restler

我正在使用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?

1 个答案:

答案 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)