Вопрос по api

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Вопрос по api

Сообщение Artikk »

Уведомление об успешной или неуспешной регистрации. В виде json с данными пользователя, если она успешная. и при регистрации хешировать пароль. - можете это объяснить?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Вопрос по api

Сообщение Dominus »

Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Вопрос по api

Сообщение Artikk »

у меня пароль не хешируется....

Код: Выделить всё

public function actionCreate(){
        $model = new UsersR();

        if ($model->load(Yii::$app->request->bodyParams, '') && $model->validate()) {
            if ($model->signup()) {
                return ['status' => true, 'result' => 'Спасибо за регистрацию'];
            }
        }
        return ['status' => false, 'result' => $model->getErrors()];
    }
    
    //модель
    
    public function fields()
    {
        return ['name', 'four' => 'city'];
    }

    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return 'user';
    }

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['username', 'password', 'name', 'city', 'phone'], 'required'],
            [['username', 'password', 'name', 'surname', 'city', 'phone', 'telegram', 'vk'], 'string', 'max' => 255],
            [['username', 'phone'], 'unique', 'targetClass' => '\app\models\Users', 'message' => 'Вы уже зарегистрированы.'],
            [['username'], 'email'],
            [['phone_code',], 'string'],
            [['phone_active'], 'integer'],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'username' => 'Email',
            'password' => 'Пароль',
            'name' => 'Имя ( Данная информация видна только Администратору сайта )',
            'surname' => 'Фамилия ( Данная информация видна только Администратору сайта )',
            'city' => 'Город',
            'phone' => 'Телефон (на данный номер придет SMS подтверждение о регистрации)',
            'telegram' => 'Telegram',
            'vk' => 'Vk',
            'phone_code' => 'Код сообщения',
        ];
    }

    public function signup()
    {
        if ($this->validate()) {
            $user = $this->loadModel();
            if ($user->save()) {
                return $user;
            }
        }
        return null;
    }
    /**
     * @return User
     * @throws \yii\base\Exception
     */
    protected function loadModel()
    {
        $user = new User();
        $user->username = $this->username;
        $user->setPassword($this->password);
        $user->generateAuthKey();
        return $user;
    }
    
    
и как вернуть данные пользователя, если регистрация успешна?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Вопрос по api

Сообщение Dominus »

Что то вы тут всё в одно накопипастили)
Обратите внимание на структуру.

Когда регистрация проходит успешно, возвращается объект user

Код: Выделить всё

public function signup()
    {
        if ($this->validate()) {
            $user = $this->loadModel();
            if ($user->save()) {
                return $user;
            }
        }
        return null;
    }

Код: Выделить всё

protected function loadModel()
    {
        $user = new User();
        $user->username = $this->username;
        $user->setPassword($this->password); // Хэшируем пароль, метод  setPassword($this->password) находится в модели User
        $user->generateAuthKey();
        return $user;
    }
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Вопрос по api

Сообщение Artikk »

Dominus писал(а): 2018.10.04, 16:50 Что то вы тут всё в одно накопипастили)
Обратите внимание на структуру.

Когда регистрация проходит успешно, возвращается объект user

Код: Выделить всё

public function signup()
    {
        if ($this->validate()) {
            $user = $this->loadModel();
            if ($user->save()) {
                return $user;
            }
        }
        return null;
    }

Код: Выделить всё

protected function loadModel()
    {
        $user = new User();
        $user->username = $this->username;
        $user->setPassword($this->password); // Хэшируем пароль, метод  setPassword($this->password) находится в модели User
        $user->generateAuthKey();
        return $user;
    }
так а почему не хеширует? можете показать, где ошибка?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Вопрос по api

Сообщение Dominus »

Код: Выделить всё

protected function loadModel()
    {
        $user = new User();
        $user->username = $this->username;
        $user->password_hash = \Yii::$app->security->generatePasswordHash($this->password);// Хэшируем пароль
        $user->auth_key = \Yii::$app->security->generateRandomString();
        return $user;
    };
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Вопрос по api

Сообщение Artikk »

Dominus писал(а): 2018.10.04, 17:16

Код: Выделить всё

protected function loadModel()
    {
        $user = new User();
        $user->username = $this->username;
        $user->password_hash = \Yii::$app->security->generatePasswordHash($this->password);// Хэшируем пароль
        $user->auth_key = \Yii::$app->security->generateRandomString();
        return $user;
    };
Все равно не хеширует.

Код: Выделить всё

public function signup()
    {
        if ($this->validate()) {
            $user = $this->loadModel();
            if ($user->save()) {
                return $user;
            }
        }
        return null;
    }
    /**
     * @return User
     * @throws \yii\base\Exception
     */
    protected function loadModel()
    {
        $user = new User();
        $user->username = $this->username;
        $user->password = \Yii::$app->security->generatePasswordHash($this->password);// Хэшируем пароль
        $user->auth_key = \Yii::$app->security->generateRandomString();
        return $user;
    }
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Вопрос по api

Сообщение Dominus »

У вас эта модель наследуется от User или отдельно как то?

Код: Выделить всё

$user = new UserR();
https://github.com/Dominus77/task/blob/ ... er.php#L12
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Вопрос по api

Сообщение Artikk »

Dominus писал(а): 2018.10.04, 17:34 У вас эта модель наследуется от User или отдельно как то?

Код: Выделить всё

$user = new UserR();
https://github.com/Dominus77/task/blob/ ... er.php#L12
Модель UserR:

Код: Выделить всё

<?php

namespace api\modules\v1\models;

use app\models\User;
use Yii;

class UsersR extends \app\models\User{

    public function fields()
    {
        return ['name', 'city'];
    }

    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return 'user';
    }

    public function rules()
    {
        return [
            [['username', 'password', 'name', 'city', 'phone'], 'required'],
            [['username', 'password', 'name', 'surname', 'city', 'phone', 'telegram', 'vk'], 'string', 'max' => 255],
            [['username', 'phone'], 'unique', 'targetClass' => '\app\models\Users', 'message' => 'Вы уже зарегистрированы.'],
            [['username'], 'email'],
            [['phone_code',], 'string'],
            [['phone_active'], 'integer'],
        ];
    }

    public function signup()
    {
        if ($this->validate()) {
            $user = $this->loadModel();
            if ($user->save()) {
                return $user;
            }
        }
        return null;
    }
    /**
     * @return User
     * @throws \yii\base\Exception
     */
    protected function loadModel()
    {
        $user = new User();
        $user->username = $this->username;
        $user->password = \Yii::$app->security->generatePasswordHash($this->password);// Хэшируем пароль
        $user->auth_key = \Yii::$app->security->generateRandomString();
        return $user;
    }

}

Модель User:

Код: Выделить всё

class User extends ActiveRecord implements \yii\web\IdentityInterface
{
    public static function tableName(){
        return 'user';
    }

    public function rules()
    {
        return [
            [['username', 'password'], 'required'],
            //[['name', 'sername', 'phone', 'email', 'username', 'password'], 'string'],
        ];
    }

    /**
     * @inheritdoc
     */
    public static function findIdentity($id)
    {
        return static::findOne($id);
    }

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

    /**
     * Finds user by username
     *
     * @param string $username
     * @return static|null
     */
    public static function findByUsername($username)
    {
        return static::findOne(['username' => $username]);
    }

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

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

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

    /**
     * Validates password
     *
     * @param string $password password to validate
     * @return bool if password provided is valid for current user
     */
    public function validatePassword($password)
    {
//        return $this->password === $password;
        return \Yii::$app->security->validatePassword($password, $this->password);
    }

    public function setPassword($password)
    {
        $this->password = \Yii::$app->security->generatePasswordHash($password);
    }

    public function generateAuthKey(){
        $this->auth_key = \Yii::$app->security->generateRandomString();
    }

    public function create(){
        return $this->save(false);
    }

    public static function findByPasswordResetToken($token)
    {
        if (!static::isPasswordResetTokenValid($token)) {
            return null;
        }

        return static::findOne([
            'password_reset_token' => $token,
            //'status' => self::STATUS_ACTIVE,
        ]);
    }

    public static function isPasswordResetTokenValid($token)
    {
        if (empty($token)) {
            return false;
        }

        $timestamp = (int) substr($token, strrpos($token, '_') + 1);
        $expire = \Yii::$app->params['user.passwordResetTokenExpire'];
        return $timestamp + $expire >= time();
    }

    public function removePasswordResetToken()
    {
        $this->password_reset_token = null;
    }

    public function generatePasswordResetToken()
    {
        $this->password_reset_token = \Yii::$app->security->generateRandomString() . '_' . time();
    }

вот если что данные которые я заполняю:
https://c2n.me/3X6anXT
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Вопрос по api

Сообщение Dominus »

Проверяем, хэширует ли?
модель SignupForm

Код: Выделить всё

/**
     * Signs users up.
     *
     * @return User|null the saved model or null if saving fails
     * @throws \yii\base\Exception
     */
    public function signup()
    {
        /*if ($this->validate()) {
            $user = $this->loadModel();
            if ($user->save()) {
                return $user;
            }
        }
        return null;*/
        return $this->loadModel();
    }

    /**
     * @return User
     * @throws \yii\base\Exception
     */
    protected function loadModel()
    {
        /*$user = new User();
        $user->username = $this->username;
        $user->setPassword($this->password);
        $user->generateAuthKey();*/
        return \Yii::$app->security->generatePasswordHash($this->password);// Хэшируем пароль
    }
Контроллер:

Код: Выделить всё

/**
     * Регистрация
     *
     * POST /api/v1/users/signup
     *
     * body
     * username=USERNAME
     * password=PASSWORD
     *
     * @return array
     * @throws \yii\base\Exception
     */
    public function actionSignup()
    {
        $model = new SignupForm();
        return [
            'хэш' => $model->signup(),
        ];
        /*if ($model->load(Yii::$app->request->bodyParams, '') && $model->validate()) {
            if ($user = $model->signup()) {
                return ['status' => true, 'result' => Yii::t('app', 'Thank you for registering. Your authorization key: {:key}', [
                    ':key' => $user->auth_key,
                ])];
            }
        }
        return ['status' => false, 'result' => $model->getErrors()];*/
    }
Пробуем:
Изображение
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Вопрос по api

Сообщение Dominus »

Вы на сайте обычным методом как регистрируетесь? Модель SignupForm есть? Используйте её и в api.

Модель User в api выглядит так:
https://github.com/Dominus77/task/blob/ ... s/User.php

Модель SignupForm в api выглядит так:
https://github.com/Dominus77/task/blob/ ... upForm.php

Действие регистрации в контроллере api выглядит так:
https://github.com/Dominus77/task/blob/ ... hp#L88-L99
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Ответить