代码之家  ›  专栏  ›  技术社区  ›  Eduardo

Yi2API-使用OAuth验证用户和网站?

  •  1
  • Eduardo  · 技术社区  · 7 年前

    我正在建立一个处理不同网站内容的服务。每个网站都有自己的用户。

    因此,我需要对访问我的API的网站进行身份验证,并且需要对从该网站登录的用户进行身份验证。

    因为yii2不能处理2个并行用户标识,所以在这个场景中,我不能使用角色。我决定用以下方式建造它:

    处理网站

    我有一个名为“网站”的表,网站包含两个字段访问令牌和过期令牌。

    从任何网站(这是一个yii基本安装)上,他们都会:

            $data = array();
            $data['api_key'] = 'xxxxx';
            $data['api_secret'] = 'zzzzzz';
    
            $client = new Client(['baseUrl' => 'https://website.api/index.php?r=v1']);
            $response = $client->post('website/get-access-token', $data)->send();
            echo "<pre>";
            var_dump($response->content);
            echo "</pre>";
    

    如果令牌过期,他们可以对入口点“网站/刷新访问令牌”执行另一个请求。

    然后,每个请求获得或发布,他们必须发送这个访问令牌,它保存在会话中(令牌现在每7天过期一次)。

    这不是通过任何HTTP验证来处理的,只是直接向API请求令牌。

    处理用户

    对于这部分,当用户使用电子邮件/密码或社交网络进行身份验证时,我向用户控制器发出请求,在该控制器中我设置了承载令牌:

    public function behaviors()
        {
            $behaviors = parent::behaviors();
            $behaviors['authenticator'] = [
                'class' => CompositeAuth::className(),
                'authMethods' => [
                    HttpBearerAuth::className()
                ]
            ];
            return $behaviors;
        }
    

    这部分是一个正在进行的工作,所以假设网站会请求登录入口点:

    $client = new Client(['baseUrl' => 'https://website.api/index.php?r=v1']);
            $response = $client->post('user/login', $data)->send();
            echo "<pre>";
            var_dump($response->content);
            echo "</pre>";
    

    这是为了获取访问令牌并检查令牌到期日期。

    我的问题是:

    对于我的特定场景,处理API请求是一个好主意吗?我想有很多电话可以得到简单的数据。是否需要使用令牌获取数据?

    如果我想使用承载令牌来处理内容和用户访问,我该怎么做?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Salem Ouerdani    7 年前

    因为yii2不能处理2个并行用户标识

    我认为没有程序或系统应该维护并行的用户会话,至少对于那些情况是这样的。您正在构建一个API,所以请 无状态 ,不要使用任何会话。使其完全成为基于令牌的系统。请在此处查看更多信息:

    我建议使用 Yii2 RESTful API 映射实体并实现一个完整的 OAuth 2.0 身份验证,这是承载令牌通常用于的目的。这里还有另外两个很好的资源:

    我喜欢并且我通常使用的一个好的体系结构是通过将身份验证逻辑与应用程序分离开来,就像在其中2个应用程序:

    > auth
    > api
    

    第一个: auth 接收用户的 login/password 或注册表单相关的输入或处理第三方身份验证,然后成功生成2个令牌:长寿命 刷新\令牌 还有短暂的生活 访问\令牌 如相关文章所述。这个 刷新\令牌 然后应该保存在数据库中,因为它将存活数月或数年或永远,并且只用于生成访问令牌。

    访问\令牌 在另一方面,它可以保存在内存中,因为它的生存时间非常短,并且将根据每个请求进行检索和比较。我想 Yii2 cache component 是存储它的理想场所,因为它支持不同的存储和数据库,如redis或memcache,而且还具有 expiration attribute that you can set when adding a value 因此,令牌将在过期时自动删除。

    这个 奥思 应用程序的私有操作(如在过期时生成新访问令牌的操作)应仅使用 刷新\令牌 为了识别用户,所以它可能有自己的用户类,使用该令牌对其进行身份验证。

    这个 api 另一方面,应用程序是传递数据的应用程序。它应该对刷新令牌一无所知。两个应用程序之间唯一共享的是缓存组件。它接收持有访问令牌的请求,通过搜索缓存查看链接到哪个用户,如果找不到,则它是未知用户或过期令牌。

    以下是您可以检查的该逻辑的工作实现: https://github.com/tunecino/yii2-app-builder

    推荐文章