Каким должно быть значение токена для JWT-аутентификации cakephp из приложения Android? - PullRequest
0 голосов
/ 02 июня 2019

Я использую аутентификацию JWT в CakePHP для обработки действий при входе в Android App.Я отключил защиту CSRF в Cake и передавал значение токена через класс «SharedPreferencesConstants», где значение токена устанавливается с помощью кода, показанного ниже:

    // Running default handler
    new Handler().post(new Runnable() {
        @Override
        public void run() {
            fcm = new MyFireBaseIntanceIdservice();
            String token = fcm.getrefeshtoken();
            // Log.e("test", token);
            SharedPreferencesConstants.setTOKEN(LoginActivity.this, token);
        }
    });

Однако я попытался немного поиграть со значением токена.

На данный момент я получаю сообщение об ошибке «Ошибка: [Cake \ Http \ Exception \ InvalidCsrfTokenException] Отсутствует файл cookie CSRF-маркера».

Подходы, которые я до сих пор пробовал, отключают защиту CSRFв Cake AppController.

            EditText txtEmail = (EditText) findViewById(R.id.txtEmail);
            EditText txtPassword = (EditText) findViewById(R.id.txtPassword);
            jsonObject.put("email", txtEmail.getText().toString());
            jsonObject.put("password", txtPassword.getText().toString());
            jsonObject.put("cookieName", "appname");
            jsonObject.put("_Token", "_csrfToken");
            jsonObject.put("deviceToken", SharedPreferencesConstants.getTOKEN(this));
            jsonObject.put("secureKey", SharedPreferencesConstants.getSECUREKEY(this));

Мысль, которая пришла мне в голову как проектируемое решение, связана с HTTP-заголовком, который должен быть передан в запросе.Но я не смог найти никакого решения для этой мысли.

Любое решение / предложения?

Редактировать # 1: В моем файле AppController.php я загрузил только компонент безопасности, а не CSRF,Вот код для того же самого:

    $this->loadComponent('Security');
    // $this->loadComponent('Csrf');

И код, который у меня есть в моей функции CustomersController.php beforeFilter ():

    $this->getEventManager()->off($this->Csrf);

Код аутентификации JWT, яв моем AppController есть:

    $this->loadComponent('Auth', [
        'storage' => 'Memory',
        'authenticate' => [
            'ADmad/JwtAuth.Jwt' => [
                'userModel' => 'Customers',
                'fields' => [
                    'username' => 'email'
                ],

                'parameter' => 'token',

                // Boolean indicating whether the "sub" claim of JWT payload
                // should be used to query the Users model and get user info.
                // If set to `false` JWT's payload is directly returned.
                'queryDatasource' => false,
            ],
            'unauthorizedRedirect' => false,
            'checkAuthIn' => 'Controller.initialize',

            // If you don't have a login action in your application set
            // 'loginAction' to false to prevent getting a MissingRouteException.
            'loginAction' => false
        ],
    ]);

Я надеюсь, что новый код, который я добавил, может помочь вам получить более полное представление о проблеме.

1 Ответ

0 голосов
/ 02 июня 2019

Я получил ответ на эту проблему. И все спасибо @GregSchmidt. Это из-за его добрых предложений. Итак, вот что я сделал.

В моем файле rout.php в папке config было несколько строк кода, которые я прокомментировал все время. Ниже приведены строки кода:

$routes->registerMiddleware('csrf', new CsrfProtectionMiddleware([
    'httpOnly' => true
]));

А

$routes->applyMiddleware('csrf');

Наконец, я удалил все свои коды отключения Csrf из контроллеров, и волшебство наконец произошло. :)

...