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

Rest yii2api-使用Oauth对用户和网站进行身份验证?,rest,yii2,yii2-api,yii2-authclient,Rest,Yii2,Yii2 Api,Yii2 Authclient,我正在建立一个服务,处理来自不同网站的内容。每个网站都有自己的用户 因此,我需要对访问我的API的网站进行身份验证,并对从该网站登录的用户进行身份验证 由于Yii2不能处理2个并行用户身份,在这种情况下,我不能使用角色。我决定以以下方式构建它: 处理网站 我有一个名为“网站”的表,网站包含两个字段访问令牌和过期令牌 从任何网站(这是一个Yii基本安装)上,他们都可以: 这部分是一个正在进行的工作,因此假设网站将请求登录入口点: > auth > api $client=新客户端([

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

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

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

处理网站

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

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

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

> auth
> api
$client=新客户端(['baseUrl'=>'https://website.api/index.php?r=v1']);
$response=$client->post('user/login',$data)->send();
回声“;
变量转储($response->content);
回声“;
这是为了获取访问令牌,并检查令牌的过期日期

我的问题是:

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

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

因为Yii2无法处理2个并行用户身份

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

我建议使用来映射您的实体并实现完整的身份验证,这是承载令牌通常使用的功能。以下是另外两个重要资源:

我喜欢并且通常使用的一种很好的体系结构是将身份验证逻辑与应用程序分离,例如,如果它们包含两个应用程序:

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

另一端的access\u令牌可以保存在内存中,因为它的生存时间很短,每次请求时都会被检索和比较。我认为这是一个存储它的完美地方,因为它支持不同的存储和数据库,如REDIS或MemCache,并且还有一个新的标记,因此当令牌过时时,它会自动删除

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

另一方面,
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>";
> auth
> api