【问题标题】:Yii2 Api - Using Oauth to authenticate user and website?Yii2 Api - 使用 Oauth 对用户和网站进行身份验证?
【发布时间】:2018-05-23 16:14:32
【问题描述】:

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

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

由于 Yii2 无法处理 2 个并行用户身份,因此在这种情况下我无法使用角色。我决定按以下方式构建它:

处理网站

我有一个名为“网站”的表,网站包含 2 个字段 access_token 和 expiration_token。

从他们所做的任何网站(这是 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>";

如果令牌过期,他们可以向入口点 'website/refresh-access-token' 发出另一个请求

然后每个请求 GET 或 POST 他们必须发送这个 access_token,它保存在 SESSION 中(令牌现在每 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>";

假设获取 access_token 并检查令牌到期日期。

我的问题是:

这是为我的特定场景处理 API 请求的好主意吗?我认为有很多电话可以获取简单的数据。获取数据需要token吗?

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

【问题讨论】:

    标签: rest yii2 yii2-api yii2-authclient


    【解决方案1】:

    由于 Yii2 无法处理 2 个并行用户身份

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

    我建议使用Yii2 RESTful API 来映射您的实体并实施完整的OAuth 2.0 身份验证,这是承载令牌通常用于的用途。这里还有 2 个很棒的资源:

    我喜欢并且通常使用的一个不错的架构是将身份验证逻辑与应用程序分开,就像它们在 2 个应用程序中一样:

    > auth
    > api
    

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

    另一端的

    access_token 可以保存在内存中,因为它的生存时间很短,并且会在每次请求时被检索和比较。我认为Yii2 cache component 是存储它的理想场所,因为它支持不同的存储和数据库,如 REDIS 或 MemCache,并且还有一个 expiration attribute that you can set when adding a value,因此令牌会在过期时自动删除。

    auth 应用程序的私有操作,例如在过期时生成新访问令牌的操作,应该只使用 refresh_token 来识别用户,因此它可能有自己的 User 类使用它令牌以对其进行身份验证。

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

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

    【讨论】:

      猜你喜欢
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 2013-07-14
      • 2013-05-08
      • 2021-08-11
      • 2012-07-22
      相关资源
      最近更新 更多