我在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。
以下是我的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
。
我在这里做错了吗?
请帮助
答案 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服务。但是,使用您的应用程序配置此扩展程序是一项棘手的任务。检查出来并尝试实现这一点。如果您发现使用它有困难,请尝试发布新问题。
希望它有所帮助。