diff --git a/common/manager/MobileDeviceManager.php b/common/manager/MobileDeviceManager.php new file mode 100644 index 0000000..cc4d8a0 --- /dev/null +++ b/common/manager/MobileDeviceManager.php @@ -0,0 +1,114 @@ +andWhere( + ['number' => $cardNumber] + )->one(); + + if ( $card == null ){ + throw new NotFoundHttpException(); + } + + $device = MobileDevice::find() + ->andWhere( + [ + 'id_card' => $card->id_card, + 'device_identifier' => $deviceIdentifier + ] + )->one(); + + if ( $device === null ){ + throw new NotFoundHttpException(); + } + + if ( + in_array($device->status, [MobileDevice::STATUS_ACTIVE, MobileDevice::STATUS_INACTIVE], true) === false ){ + throw new NotFoundHttpException(); + } + + return $device; + + } + + public function create($cardNumber, $deviceIdentifier) + { + $card = Card::find()->andWhere( + ['number' => $cardNumber] + )->one(); + + if ( $card == null ){ + throw new NotFoundHttpException(); + } + + $device = MobileDevice::find() + ->andWhere( + [ + 'id_card' => $card->id_card, + 'device_identifier' => $deviceIdentifier + ] + )->one(); + + if ( $device ){ + throw new BadRequestHttpException("Device already exists, can't create"); + } + + $device = new MobileDevice(); + $device->device_identifier = $deviceIdentifier; + $device->id_card = $card->id_card; + $device->status = MobileDevice::STATUS_INACTIVE; + $device->save(false); + + return $device; + } + + /** + * @param $cardNumber + * @param $deviceIdentifier + * @return array|MobileDevice|ActiveRecord + * @throws BadRequestHttpException + * @throws NotFoundHttpException + */ + public function loginOrCreate($cardNumber, $deviceIdentifier) + { + try { + + return $this->login($cardNumber, $deviceIdentifier); + } catch (\Exception $e) { + return $this->create($cardNumber, $deviceIdentifier); + } + + } + +} diff --git a/common/models/MobileDevice.php b/common/models/MobileDevice.php index 01eb976..dba6373 100644 --- a/common/models/MobileDevice.php +++ b/common/models/MobileDevice.php @@ -3,6 +3,8 @@ namespace common\models; use Yii; +use yii\behaviors\TimestampBehavior; +use yii\helpers\ArrayHelper; /** * This is the model class for table "mobile_device". @@ -17,6 +19,11 @@ use Yii; */ class MobileDevice extends \yii\db\ActiveRecord { + + const STATUS_ACTIVE = 'active'; + const STATUS_INACTIVE = 'inactive'; + const STATUS_DELETED = 'deleted'; + /** * @inheritdoc */ @@ -54,4 +61,15 @@ class MobileDevice extends \yii\db\ActiveRecord 'updated_at' => Yii::t('common/mobiledevice', 'Updated At'), ]; } + + public function behaviors() + { + return ArrayHelper::merge( [ + [ + 'class' => TimestampBehavior::className(), + 'value' => function(){ return date('Y-m-d H:i:s' ); } + ] + ], + parent::behaviors()); + } } diff --git a/common/models/VirtualKey.php b/common/models/VirtualKey.php index 968f0fa..60ae769 100644 --- a/common/models/VirtualKey.php +++ b/common/models/VirtualKey.php @@ -3,6 +3,8 @@ namespace common\models; use Yii; +use yii\behaviors\TimestampBehavior; +use yii\helpers\ArrayHelper; /** * This is the model class for table "virtual_key". @@ -44,14 +46,25 @@ class VirtualKey extends \yii\db\ActiveRecord public function attributeLabels() { return [ - 'id' => Yii::t('common/mobiledevice', 'ID'), - 'id_card' => Yii::t('common/mobiledevice', 'Id Card'), - 'id_key' => Yii::t('common/mobiledevice', 'Id Key'), - 'valid_until' => Yii::t('common/mobiledevice', 'Valid Until'), - 'direction_in_at' => Yii::t('common/mobiledevice', 'Direction In At'), - 'direction_out_at' => Yii::t('common/mobiledevice', 'Direction Out At'), - 'created_at' => Yii::t('common/mobiledevice', 'Created At'), - 'updated_at' => Yii::t('common/mobiledevice', 'Updated At'), + 'id' => Yii::t('common/virtualkey', 'ID'), + 'id_card' => Yii::t('common/virtualkey', 'Id Card'), + 'id_key' => Yii::t('common/virtualkey', 'Id Key'), + 'valid_until' => Yii::t('common/virtualkey', 'Valid Until'), + 'direction_in_at' => Yii::t('common/virtualkey', 'Direction In At'), + 'direction_out_at' => Yii::t('common/virtualkey', 'Direction Out At'), + 'created_at' => Yii::t('common/virtualkey', 'Created At'), + 'updated_at' => Yii::t('common/virtualkey', 'Updated At'), ]; } + + public function behaviors() + { + return ArrayHelper::merge( [ + [ + 'class' => TimestampBehavior::className(), + 'value' => function(){ return date('Y-m-d H:i:s' ); } + ] + ], + parent::behaviors()); + } } diff --git a/customerapi/controllers/LoginController.php b/customerapi/controllers/LoginController.php index 71502d4..bce93d9 100644 --- a/customerapi/controllers/LoginController.php +++ b/customerapi/controllers/LoginController.php @@ -28,6 +28,7 @@ class LoginController extends Controller public function actionLogin() { $form = new LoginForm(); + $form->scenario = "default"; $form->load(\Yii::$app->request->post(), ''); diff --git a/mobileapi/config/main.php b/mobileapi/config/main.php index b3ce5a7..953ef10 100644 --- a/mobileapi/config/main.php +++ b/mobileapi/config/main.php @@ -44,7 +44,7 @@ return [ ], 'jwt' => [ 'class' => Jwt::class, - 'key' => 'secret', + 'key' => 'dianaveronika', // You have to configure ValidationData informing all claims you want to validate the token. 'jwtValidationData' => JwtValidationData::class, ], diff --git a/mobileapi/controllers/LoginController.php b/mobileapi/controllers/LoginController.php index b7a3c44..ee5f004 100644 --- a/mobileapi/controllers/LoginController.php +++ b/mobileapi/controllers/LoginController.php @@ -27,7 +27,9 @@ class LoginController extends RestController public function actionLogin() { $form = new LoginForm(); + $post = \Yii::$app->request->post(); + $post2 = $_POST; $form->load(\Yii::$app->request->post(), ''); if ($form->validate()) { diff --git a/mobileapi/controllers/RestController.php b/mobileapi/controllers/RestController.php index 84b722e..3416961 100644 --- a/mobileapi/controllers/RestController.php +++ b/mobileapi/controllers/RestController.php @@ -17,11 +17,11 @@ class RestController extends Controller public function behaviors() { $behaviors = parent::behaviors(); -// $behaviors['authenticator'] = [ -// 'class' => JwtHttpBearerAuth::class, -// 'auth' => [$this, 'auth'], -// 'optional' => $this->getOptionalActions(), -// ]; + $behaviors['authenticator'] = [ + 'class' => JwtHttpBearerAuth::class, + 'auth' => [$this, 'auth'], + 'optional' => $this->getOptionalActions(), + ]; return $behaviors; } @@ -30,31 +30,31 @@ class RestController extends Controller * @param Token $token * @return Customer|null */ -// public function auth($token) -// { -// if ( !isset($token ) ) { -// return null; -// } -// try { -// $uid = (string) $token->getClaim('uid'); -// $customer = Customer::findOne(['id_customer' => $uid]); -// if (isset($customer)) { -// \Yii::$app->user->setIdentity($customer); -// return $customer; -// } -// } catch (Exception $e) { -// Yii::error('Failed to load customer: ' . $e->getMessage()); -// } -// return null; -// } -// -// /** -// * @see AuthMethod::$optional -// * @return array -// */ -// protected function getOptionalActions(){ -// return []; -// } + public function auth($token) + { + if ( !isset($token ) ) { + return null; + } + try { + $uid = (string) $token->getClaim('uid'); + $customer = Customer::findOne(['id_customer' => $uid]); + if (isset($customer)) { + \Yii::$app->user->setIdentity($customer); + return $customer; + } + } catch (Exception $e) { + Yii::error('Failed to load customer: ' . $e->getMessage()); + } + return null; + } + + /** + * @see AuthMethod::$optional + * @return array + */ + protected function getOptionalActions(){ + return []; + } } diff --git a/mobileapi/models/LoginForm.php b/mobileapi/models/LoginForm.php index 50eb0e3..f730cba 100644 --- a/mobileapi/models/LoginForm.php +++ b/mobileapi/models/LoginForm.php @@ -1,15 +1,23 @@ Yii::t('common/site', 'Username'), - 'password' =>Yii::t('common/site', 'Password'), - ]; + + public function attributeLabels() + { + return [ + 'username' => Yii::t('common/site', 'Username'), + 'password' => Yii::t('common/site', 'Password'), + ]; } /** @@ -45,26 +54,34 @@ class LoginForm extends Model */ public function validatePassword($attribute, $params) { - if (!$this->hasErrors()) { + if ($this->hasErrors()) { /** @var \common\models\Customer $user */ - $customer = $this->getCustomer(); - if (!$customer || !$customer->validatePassword($this->password)) { - $this->addError($attribute, 'Incorrect username or password.'); - } + throw new BadRequestHttpException(); } + $customer = $this->getCustomer(); } /** * Finds user by [[username]] * - * @return Customer|null + * @return Customer|null|ActiveRecord */ public function getCustomer() { - if ( $this->customer === null ){ - $this->customer = Customer::findIdentity( $this->username ); + + if ($this->customer === null) { + $mobileDeviceManager = new MobileDeviceManager(); + $mobileDevice = $mobileDeviceManager->loginOrCreate($this->username, $this->password); + /** @var Customer */ + $this->customer = Customer::find()->andWhere([ + 'id_customer_card' => $mobileDevice->id_card + ])->one(); + if ($this->customer == null) { + throw new NotFoundHttpException(); + } } - return $this->customer; + + return $this->customer; } }