Yii2项目中如何使用JWT?
Posted
技术标签:
【中文标题】Yii2项目中如何使用JWT?【英文标题】:How to use JWT in Yii2 project? 【发布时间】:2017-11-01 02:07:52 【问题描述】:在我的 REST API 中,我想使用 JWT 来进行授权。
所以,我添加了这个扩展 - https://github.com/sizeg/yii2-jwt
清楚如何创建JWT令牌,但是如何在API端验证令牌?我的心,我必须使用两个令牌 - auth_token 和 refresh_token。为了什么?验证和检查用户有什么不同?
我的意思是 - 好的,当我收到用户名和密码时,我创建 auth_token (JWT) 并在用户数据库中更新令牌,然后将令牌返回到前端。
在前端将在每个请求中发送身份验证令牌后,我将验证令牌并检查用户数据库中的用户并检查访问权限等。如何实现刷新令牌以及用于什么?
例如我的控制器:
class UploadController extends Controller
public $serializer = [
'class' => 'yii\rest\Serializer',
'collectionEnvelope' => 'items',
];
public function behaviors()
$behaviors = parent::behaviors();
$behaviors['authenticator'] = [
'class' => JwtHttpBearerAuth::className()
];
return $behaviors;
public function actionIndex()
//Work with User
以及如何从标头中获取令牌?
【问题讨论】:
有解决办法吗? 你有什么发现吗?你认为为github.com/sizeg/yii2-jwt 或github.com/firebase/php-jwt 做一个扩展可能有用吗? 我刚刚找到一个使用 (lcobucci/jwt)[github.com/sizeg/yii2-jwt] 任何想法? 【参考方案1】:控制器
public function actionLogin()
$username = Yii::$app->request->post('username');
$password = Yii::$app->request->post('password');
$provider = new ActiveDataProvider([
'query' => User::find()
->where(['user_name' => $username])->asArray()->one(),
]);
$result = $provider->query;
if($result)
if (Yii::$app->getSecurity()->validatePassword($password, $result['user_pass']))
$tokenId = base64_encode(mcrypt_create_iv(32));
$issuedAt = time();
$notBefore = $issuedAt; //Adding 10 seconds
$expire = $notBefore + 5184000; // Adding 60 Days
$serverName = 'your-site.com';
$data = [
'iat' => $issuedAt, // Issued at: time when the token was generated
'jti' => $tokenId, // Json Token Id: an unique identifier for the token
'iss' => $serverName, // Issuer
'nbf' => $notBefore, // Not before
'exp' => $expire, // Expire
'data' => [ // Data related to the signer user
'id' => $result['user_id'],
'username' => $result['user_name'],
'mobile' => $result['user_mobile'],
'email' => $result['user_email'],
'city' => $result['user_city'],
'state' => $result['user_state'],
'country' => $result['user_country'],
'picture' => $result['user_picture'],
]
];
$jwt = JWT::encode(
$data,
JWT_KEY,
'HS512'
);
$response = [
'status' => true,
'message' => 'Login Success..',
'era_tkn' => $jwt,
];
else
$response = [
'status' => false,
'message' => 'Wrong username or password.',
];
else
$response = [
'status' => false,
'message' => 'Wrong username or password.',
];
return $response;
为检查令牌制作全局方法
public function check_token()
$headers = Yii::$app->request->headers;
$token = $headers->get('era_tkn');
if($token)
try
$valid_data = JWT::decode($token, JWT_KEY, array('HS512'));
$valid_data = $valid_data->data;
catch(Exception $e)
$valid_data = $e->getMessage();
else
$valid_data = 'Required Authentication';
return $valid_data;
调用 check_token 方法
$user_data = $this->check_token();
if (!empty($user_data->id))
echo $user_data->id;
else
echo "Invalid Token.";
【讨论】:
请提供 JWT 供应商/包或资源@vijay-makwana 作曲家需要 firebase/php-jwt以上是关于Yii2项目中如何使用JWT?的主要内容,如果未能解决你的问题,请参考以下文章