Yii 2 UserIdentity findIdentityByAccessToken未被调用

时间:2015-09-15 18:42:07

标签: php yii2

我在Yii 2中创建一个Web应用程序,它使用REST API作为后端。用户身份验证使用令牌进行。

在初始身份验证期间,我正在执行以下操作:

$parsedUserDetails = [
    'id' => $userDetails['user_id'],
    'accessToken' => $userDetails['access_token'],
    'email' => $this->email,
    'password' => $this->password,
    'authKey' => 'test'
];
$user = new Users($parsedUserDetails);
return Yii::$app->user->login($user, true ? 3600*24*30 : 0);

正在创建Cookie。

enter image description here

以下是我的Users类,它实现了IdentityInterface     

namespace app\models;

class Users extends \yii\base\Object implements \yii\web\IdentityInterface
{
    public $id;
    public $email;
    public $password;
    public $authKey;
    public $accessToken;

    /**
     * @inheritdoc
     */
    public static function findIdentity($id)
    {

    }

    /**
     * @inheritdoc
     */
    public static function findIdentityByAccessToken($token, $type = null)
    {
        exit('findIdentityByAccessToken');
    }

    /**
     * @inheritdoc
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @inheritdoc
     */
    public function getAuthKey()
    {
        return $this->authKey;
    }

    /**
     * @inheritdoc
     */
    public function validateAuthKey($authKey)
    {
        return $this->authKey === $authKey;
    }

    /**
     * Validates password
     *
     * @param  string  $password password to validate
     * @return boolean if password provided is valid for current user
     */
    public function validatePassword($password)
    {
        /*return $this->password === $password;*/
    }
}

根据以下文档:http://www.yiiframework.com/doc-2.0/guide-security-authentication.html我应该将其余函数留空,并自动调用findIdentityByAccessToken函数。很遗憾,findIdentityByAccessToken未被调用,而是调用了findIdentity

我在这里做错了吗?

请帮助

1 个答案:

答案 0 :(得分:1)

您必须在用户类中覆盖findIdentityByAccessToken(),并将标记传递到稍后验证过的标题中。

public static function findIdentityByAccessToken($token, $type = null)
{
    return static::findOne(['access_token' => $token]);
}

请参阅此处的官方文档http://www.yiiframework.com/doc-2.0/yii-web-identityinterface.html

但是,这会在您的用户表格中搜索默认情况下不可用的字段access_token

您可以在access_token表中创建名为user的列,并创建逻辑以存储强创建的密钥(使用加密或腌制技术),以后可以识别从中请求资源的用户你的api。 但即使使用SSL,这也不会使您的RESTful api安全。

  

HTTP Basic Auth:访问令牌作为用户名发送。这应该   仅在访问令牌可以安全地存储在API上时使用   消费者方面。例如,API使用者是在a上运行的程序   服务器

你可以使用Oauth 2.0,这在安全性方面是一种更好的技术。阅读更多here

  

OAuth 2:消费者从中获取访问令牌   授权服务器并通过HTTP承载发送到API服务器   令牌,根据OAuth2协议。

我发现this使用Oauth 2.0创建功能强大且安全的RESTful Web服务。但是,使用您的应用程序配置此扩展程序是一项棘手的任务。检查出来并尝试实现这一点。如果您发现使用它有困难,请尝试发布新问题。

希望它有所帮助。