Yii2 Api - 使用Oauth对用户和网站进行身份验证?

时间:2018-05-23 16:14:32

标签: rest yii2 yii2-api yii2-authclient

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

所以我需要验证访问我的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中保存(Token现在每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请求是一个好主意吗?我认为有许多调用来获取简单的数据。是否需要使用令牌获取数据?

如果我想使用Bearer Tokens处理内容和用户访问我将如何做到这一点?

1 个答案:

答案 0 :(得分:1)

  

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

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

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

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

> auth
> api

第一个:auth接收用户的login/password或注册表单相关输入或处理第三方身份验证,然后成功生成2个令牌:长期生活 refresh_token < / strong>和短暂的生活 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