1

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

因此,我需要对访问我的 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>";

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

然后每个请求 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?

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

4

1 回答 1

1

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

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

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

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

> auth
> api

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

另一端的access_token可以保存在内存中,因为它的生存时间很短,并且会在每次请求时被检索和比较。我认为Yii2 缓存组件是存储它的理想场所,因为它支持不同的存储和数据库,如 REDIS 或 MemCache,并且还具有过期属性,您可以在添加值时设置该属性,以便令牌在过期时自动删除。

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

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

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

于 2018-05-24T04:24:17.620 回答