REST API работает без методов аутентификации. Теперь я хотел аутентифицировать REST API с аутентификацией OAuth2 для запросов API через мобильное приложение. Я пробовал использовать руководство по yii2, но у меня это не сработало.
в основном мобильный пользователь должен войти в систему с именем пользователя и паролем, если имя пользователя и пароль верны, пользователь должен войти в систему, а дальнейший запрос API должен быть подтвержден с помощью токена.
Нужно ли мне создавать собственный клиент OAuth 2, подобный этому? Создание собственных клиентов аутентификации
Поле access_token в пользовательской таблице пусто. мне нужно сохранить его вручную? как вернуть access_token в качестве ответа?
есть ли причина для одновременного использования всех трех методов (HttpBasicAuth, HttpBearerAuth, QueryParamAuth), почему? как?
структура папок моего приложения выглядит так, как показано ниже.
api
-config
-modules
--v1
---controllers
---models
-runtime
-tests
-web
backend
common
console
environments
frontend
API \ модули \ v1 \ Module.php
namespace api\modules\v1;
class Module extends \yii\base\Module
{
public $controllerNamespace = 'api\modules\v1\controllers';
public function init()
{
parent::init();
\Yii::$app->user->enableSession = false;
}
}
API \ модули \ v1 \ контроллеры \ CountryController.php
namespace api\modules\v1\controllers;
use Yii;
use yii\rest\ActiveController;
use common\models\LoginForm;
use common\models\User;
use yii\filters\auth\CompositeAuth;
use yii\filters\auth\HttpBasicAuth;
use yii\filters\auth\HttpBearerAuth;
use yii\filters\auth\QueryParamAuth;
/**
* Country Controller API
*
* @author Budi Irawan <[email protected]>
*/
class CountryController extends ActiveController
{
public $modelClass = 'api\modules\v1\models\Country';
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['authenticator'] = [
//'class' => HttpBasicAuth::className(),
'class' => CompositeAuth::className(),
'authMethods' => [
HttpBasicAuth::className(),
HttpBearerAuth::className(),
QueryParamAuth::className(),
],
];
return $behaviors;
}
}
общий \ модели \ User.php
namespace common\models;
use Yii;
use yii\base\NotSupportedException;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;
class User extends ActiveRecord implements IdentityInterface
{
const STATUS_DELETED = 0;
const STATUS_ACTIVE = 10;
public static function tableName()
{
return '{{%user}}';
}
public function behaviors()
{
return [
TimestampBehavior::className(),
];
}
public function rules()
{
return [
['status', 'default', 'value' => self::STATUS_ACTIVE],
['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED]],
];
}
public static function findIdentity($id)
{
return static::findOne(['id' => $id, 'status' => self::STATUS_ACTIVE]);
}
public static function findIdentityByAccessToken($token, $type = null)
{
return static::findOne(['access_token' => $token]);
}
}
таблица пользователей
id
username
auth_key
password_hash
password_reset_token
email
status
created_at
access_token
access_token был добавлен после переноса таблицы пользователей