Yii2 Api - 使用 Oauth 验证用户和网站?

Yii2 Api - Using Oauth to authenticate user and website?

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

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

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

处理网站

我有一个名为 "Website" 的 table,网站包含 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 请求令牌。

处理用户

对于这部分,当用户使用 email/password 或社交网络进行身份验证时,我向用户控制器发出请求,我在其中设置了 Bearer Tokens:

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吗?

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

Since Yii2 can not handle 2 parallel user identities

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

我建议使用 Yii2 RESTful API to map your entities and implement a complete OAuth 2.0 身份验证,这是 Bearer 令牌通常用于的目的。这里有 2 个更好的资源:

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

> auth
> api

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

另一端的

access_token 可以保存在内存中,因为它会存在很短的时间,并且会在每次请求时被检索和比较。我认为 Yii2 cache component is a perfect place to store it as it supports different storages and databases like REDIS or MemCache and also has an expiration attribute that you can set when adding a value 因此令牌将在过时时自动删除。

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

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

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