• Как сгенерировать безопасный хэш в yii2?

    @Ace_Viral Автор вопроса
    Михаил Ливач, Ипатьев, Вот пример кода:
    public function actionTest()
         {
              $token = [
                   'iss' => 'your-issuer-here',
                   'aud' => 'your-audience-here',
                   'iat' => time(),
                   'nbf' => time(),
                   'exp' => time() + 15000000,
                   'data' => ['user_id' => 1]
              ];
    
              $refresh_token = JWT::encode($token, 'your-secret-key-here', 'HS256');
              Yii::debug('$refresh_token', $refresh_token);
    
              $refresh_token_hash = Yii::$app->security->generatePasswordHash($refresh_token);
              Yii::debug('$refresh_token_hash', $refresh_token_hash);
    
              Yii::debug('check 1', Yii::$app->security->validatePassword($refresh_token, $refresh_token_hash));
    
              $token = [
                   'iss' => 'your-issuer-here',
                   'aud' => 'your-audience-here',
                   'iat' => time(),
                   'nbf' => time(),
                   'exp' => time() + 15000000,
                   'data' => ['user_id' => 1]
              ];
              $new_refresh_token = JWT::encode($token, 'your-secret-key-here', 'HS256');
              Yii::debug('$new_refresh_token', $new_refresh_token);
              Yii::debug('check 2', Yii::$app->security->validatePassword($new_refresh_token, $refresh_token_hash));
         }

    С логами:
    644ff476ebdc1091101038.png
    То есть я проверяю хэш от одного токена с новым токеном и он выводит TRUE
  • Как сгенерировать безопасный хэш в yii2?

    @Ace_Viral Автор вопроса
    Ипатьев, так она не корректно работает с большим значением
  • Как сгенерировать безопасный хэш в yii2?

    @Ace_Viral Автор вопроса
    Ипатьев, так я тебе привел и код и картинки для понимания работы и как все это отрабатывает, что тебе еще нужно, я пришел не чтобы что то доказывать а просто помощи получить
  • Как сгенерировать безопасный хэш в yii2?

    @Ace_Viral Автор вопроса
    Ипатьев, Вот мой action:
    public function actionRefresh()
         {
              $refresh_token = Yii::$app->request->headers->get('Authorization');
              $refresh_token = substr($refresh_token, 7);
    
              $decoded = User::getUserDataFromJWT($refresh_token);
    
              $user = User::find()
                   ->where(['id' => $decoded->data->user_id])
                   ->one();
    
              if ($user) {
                   if (Yii::$app->security->validatePassword($refresh_token, $user->refresh_token_hash)) {
    
                        $refresh_token = $user->generateRefreshToken(
                             [
                                  'user_id' => $user->id,
                             ]
                        );
                        $user->refresh_token = $refresh_token;
    
                        $userSaved = $user->save();
    
                        $jwt = $user->generateJWTtoken(
                             [
                                  'user_id' => $user->id,
                                  'username' => $user->username,
                                  'email' => $user->email,
                             ]
                        );
    
                        if (!$userSaved) {
                             $out['err']['user not saved'] = [
                                  $user->getErrors(),
                                  $user->errors,
                                  $user->getAttributes(),
                             ];
                        } else {
                             $out['access_token'] = $jwt;
                             $out['refresh_token'] = $refresh_token;
                             $out['user'] = $user->getAttributes();
                        }
                   } else {
                        $user->updateFailedLoginAttempts(false);
                   }
              } else {
                   throw new NotFoundHttpException('User not found');
              }
    
              return $out;
         }

    Я делаю пост запрос и передаю в заголовке refresh_token
    После этого запроса refresh_token_hash в базе данных перетирается. И тот который я отправлял в запросе теряет свою надобность он просто должен исчезнуть.
    Вот пример, делаю первый запрос с токеном:
    644fdedab1b5d063180889.png
    В ответе новый токен и новый хэш соответственно
    Новый запрос с тем же токеном:
    644fdf57b2a80530131331.png
    И он опять прошел, хотя не должен был, а сейчас я буду уменьшать длину токена, я покажу это на примере регистрации и логина и токеном будет пароль. Просто в рефреше прежде чем проверится в бд он расшифровывается и просто будет кидать ошибку при не правильной структуре токена.
    644fe029797a6155696150.png
    Вот мой actionLogin:
    public function actionLogin()
         {
              $in = \Yii::$app->request->post();
    
              $email = $in['email'];
              $password = $in['password'];
              $username = $in['username'];
    
              $user = User::find()
                   ->where(['email' => $email])
                   ->orWhere(['username' => $username])
                   ->one();
    
              if ($user) {
                   // Блокировка учетной записи B2
                   if ($user->isLoginBlocked()) {
                        throw new ForbiddenHttpException('Your account is blocked until ' . date("d.m.Y H:i:s", $user->login_locked_until));
                   }
    
                   if (Yii::$app->security->validatePassword($password, $user->password_hash)) {
                        $user->updateFailedLoginAttempts(true);
    
                        $jwt = $user->generateJWTtoken(
                             [
                                  'user_id' => $user->id,
                                  'username' => $user->username,
                                  'email' => $user->email,
                             ]
                        );
    
                        $refresh_token = $user->generateRefreshToken(
                             [
                                  'user_id' => $user->id,
                             ]
                        );
                        $user->refresh_token = $refresh_token;
                        $userSaved = $user->save();
    
                        if (!$userSaved) {
                             $out['err']['user not saved'] = [
                                  $user->getErrors(),
                                  $user->errors,
                                  $user->getAttributes(),
                             ];
                        } else {
                             $out['user'] = $user->getAttributes();
                             $out['access_token'] = $jwt;
                             $out['refresh_token'] = $refresh_token;
                        }
                   } else {
                        $user->updateFailedLoginAttempts(false);
                   }
              } else {
                   throw new NotFoundHttpException('User not found');
              }
    
              return $out;
         }

    Функция проверки та же самая Делаю login и успешно логинюсь ведь токен не менял:
    644fe08d06ab8302403181.png
    Теперь начинаем уменьшать длину:
    644fe0aeda953499662353.png
    Еще уменьшаем и все проходит))))
    644fe0d17e48d455085302.png
    И ура после практических опытов выяснилось что он начинает проверять только когда длина строки составляет 71 символ
    644fe154cce73199465481.png
    Вот и доказательство))
  • Как сгенерировать безопасный хэш в yii2?

    @Ace_Viral Автор вопроса
    либо можно как то под капотом yii поменять эти ограничения
  • Как поднять REST API на Yii2 по протоколу HTTPS?

    @Ace_Viral Автор вопроса
    Rsa97, ну я поднял локально по http не на хостинге)
  • Как поднять REST API на Yii2 по протоколу HTTPS?

    @Ace_Viral Автор вопроса
    Rsa97, неужели я могу просто закинуть всю директорию фремворка yii2
    и это будет работать? без файла htaccess и других настроек, без сборщика, и без поднятой базы данных
  • Как поднять REST API на Yii2 по протоколу HTTPS?

    @Ace_Viral Автор вопроса
    Прежде чем мне заливать на хостинг, мне же нужно будет поднять среду, базу дынных и сборщик?
    Или я что-то путаю
  • Файл почему то не прикрепляется к модели User в Yii2, почему?

    @Ace_Viral Автор вопроса
    Максим Тимофеев, можете привести скрины, как они должны выглядеть
  • Файл почему то не прикрепляется к модели User в Yii2, почему?

    @Ace_Viral Автор вопроса
    И еще если кому нибудь, это поможет то файл на уровне php появляется а в на уровне yii не видно
    63da1925dd242749495118.png
    Лог я получаю так:
    \Yii::info([
    	'$_FILES' => $_FILES,
    			'avatar' =>	UploadBind::get($this, 'avatar', ['active' => 1]),
    			'UploadedFile::getInstaceByName(avatar)' => UploadedFile::getInstanceByName('avatar'),
    			'UploadedFile::getInstacesByName(avatar)' => UploadedFile::getInstancesByName('avatar'),
    			'UploadedFile::getInstance($this, avatar)' => UploadedFile::getInstance($this, 'avatar'),
    			'UploadedFile::getInstances($this, avatar)' => UploadedFile::getInstances($this, 'avatar'),
    		], 'bulat / ' . (__METHOD__ ?: __FILE__));
  • Не получается написать нормальный SQL запрос в Yii2?

    @Ace_Viral Автор вопроса
    public function getAnswerDestination($material_id)
    	{
            $theme_id = Material::findOne($material_id)->theme_id;
            $theme = Theme::findOne($theme_id);
            $lesson_id = $theme->lesson_id;
            $lesson = Lesson::findOne($lesson_id);
            $course_id = $lesson->course_id;
            $course = Course::findOne($course_id);
    		return (object) [
                'course' => (object) [
                    'id' => $course_id,
                    'name' => $course->name
                ],
                'lesson' => (object) [
                    'id' => $lesson_id,
                    'name' => $lesson->name
                ],
                'theme' => (object) [
                    'id' => $theme_id,
                    'name' => $theme->name
                ],
            ];
    	}

    В общем написал такой код, выводит все правильно и вроде выглядит прилично
  • Не получается написать нормальный SQL запрос в Yii2?

    @Ace_Viral Автор вопроса
    Ваш код возвращает такие значения:
    638af2d7d7199447725295.png
    И про свою логическую проблему, я понимаю что код написан коряво и получился костыль, хотел бы разобраться на это примере как работают sql запросы в yii2
  • Не получается написать нормальный SQL запрос в Yii2?

    @Ace_Viral Автор вопроса
    Пишу sql запросы в yii2 впервые, поэтому толком всех методов не знаю, и сделал вот такой костыль
  • Приходит файл 0 байт в yii2, почему?

    @Ace_Viral Автор вопроса
    ThunderCat, Все, господи спасибо вам большое!!!
  • Приходит файл 0 байт в yii2, почему?

    @Ace_Viral Автор вопроса
    А какого вида должен передаваться урл?
  • Приходит файл 0 байт в yii2, почему?

    @Ace_Viral Автор вопроса
    Дмитрий, если честно ничего не изменилось
  • Приходит файл 0 байт в yii2, почему?

    @Ace_Viral Автор вопроса
    Дмитрий, извиняюсь за глупый вопрос, а как включить вывод ошибок?
  • Нужно вместо хэша возвращать имя файла, при это сохранять файлы как хэш на сервере?

    @Ace_Viral Автор вопроса
    ThunderCat, пример на модели Material
    public function fields()
    	{
    		$fields = parent::fields();
    		...
    		$fields['images'] = function (Material $model) {
    			return UploadBind::get($model, 'images', ['active' => 1]);
    		};
    		...
    		return $fields;
    	}

    Метод get в UploadBInd:
    public static function get($model, $attrs = null, $conditions = [], $asQuery = 0, $addUploads = 1)
    	{
    		$defaultConditions = [
    			'model_name' => $model::className(),
    			'model_id' => $model->getAttribute('id'),
    		];
    		
    		if ($attrs)
    			$defaultConditions['model_attr'] = $attrs;
    		
    		$conditions = array_merge($defaultConditions, $conditions);
    		
    		$q = UploadBind::find()->where($conditions)->orderBy('sort');
    		
    		if ($asQuery) {
    			return $q;
    		}
    		
    		/** @var UploadBind[] $binds */
    		$binds = $q->all();
    		
    		if ($addUploads) {
    			
    			$uploadsIds = ArrayHelper::getColumn($binds, 'upload_id');
    			
    			//$uploads = Upload::findAll(['id' => $uploadsIds]);
    			$uploads = Upload::find()->where(['id' => $uploadsIds])->all();
    			
    			$uploadsMap = ArrayHelper::map($uploads, 'id', function ($x) {
    				return $x;
    			});
    			
    			foreach ($binds as $bind) {
    				$bind->upload = $uploadsMap[$bind->upload_id];
    			}
    			
    		}
    		
    		return $binds;
    	}


    И возвращается мне объект material в котором есть массив images ну и выше я скрин прилагал