2016-01-26 1 views
0

У меня есть SLIM API, и я использую его в моем ANgularJS приложение, чтобы получить доступ к моей БД, как это (например):RESTfull способ проверить, если пользователь может соединиться с Стройный

Мой контроллер:

$scope.testDatabaseItems = function(){ 
    $http.get(pathApi + 'items').success(function(data) { 
     $log.info("succes!"); 
     $log.log(data); 
     $scope.items=data; 
    }) 
    .error(function (data, status){ 
     $log.error("error!"); 
     $log.log(data); 
    }); 
}; 

Мой Тонкий приложение:

<?php 

require 'vendor/autoload.php'; 
require 'config/config.php'; 

$app = new \Slim\App; 

$app->get('/items', 'getItems'); 
$app->get('/items/{id:\d+}', 'getItemById'); 
$app->post('/new_user', 'addUser'); 
$app->get('/users', 'getUsers'); 

$app->run(); 

function DB_Connection() { 
    global $dbparams; 
    $dbhost = $dbparams['host']; 
    $dbuser = $dbparams['user']; 
    $dbpass = $dbparams['password']; 
    $dbname = $dbparams['dbname']; 
    $dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    return $dbh; 
} 

function getItems() { 
    $sql = "SELECT * FROM aj_items"; 
    try { 
     $db = DB_Connection(); 
     $stmt = $db->query($sql); 
     $list = $stmt->fetchAll(PDO::FETCH_OBJ); 
     $db = null; 
     echo json_encode($list); 
    } catch(PDOException $e) { 
     echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    } 
} 

?> 

Моя проблема заключается в том, что я хочу назвать мое Стройный приложение, чтобы проверить, если имя пользователя и пароль работы (подключение), но я хочу RESTfull API и я камыш где-то в RESTfull API, я большинство alwa Используйте один из следующих способов: GET, POST, DELETE или PUT.

Я не вижу, какой из них я могу использовать, так как я просто проверяю информацию и сравниваю ее с password_verify(). Я знаю, что я хочу вернуть 2 конкретных поля, если он работает, но я не уверен, что делать, если я все еще хочу, чтобы мой API считался RESTfull.

ответ

1

В прикладной среде с использованием Restful API рекомендуется использовать JSON Web Tokens (JWT) для передачи заявок между сторонами.

Использование firebase/php-jwt в вашем приложении Slim.

composer require firebase/php-jwt 

Тогда в маршрутах

<?php 

require 'vendor/autoload.php'; 

use \Psr\Http\Message\ServerRequestInterface as Request; 
use \Psr\Http\Message\ResponseInterface as Response; 

$app = new \Slim\App; 

$app->get('/authenticate', function (Request $request, Response $response) { 
    $key = "example_key"; 
    $token = array(
     "iss" => "http://example.org", 
     "aud" => "http://example.com", 
     "iat" => 1356999524, 
     "nbf" => 1357000000 
    ); 
    $jwt = JWT::encode($token, $key); 
    $response->getBody->write(json_encode(['token' => $jwt])); 
    return $response; 
}); 


$app->get('/items', function (Request $request, Response $response){ 
    $key = "example_key"; 
    $token = $request->getHeader('HTTP_AUTHORIZATION'); 
    if (!empty($token) && is_array($token)) { 
     $token = trim(str_replace('Bearer', '', $token[0])); 
     if (JWT::decode($token, $key, ['HS256'])) { 
      // User authentication successful 
     } else { 
      // User authentication failed 
     } 
    } 
}); 
?> 

Теперь вам нужно кэшировать JWT возвращаемый /authenticate где-то. Это хорошая идея использовать window.sessionStorage как данные, сохраняются жизнь, пока вкладка браузера не закрываются, more on cookies vs tokens

$scope.testDatabaseItems = function(){ 
    $http.get(pathApi + 'authenticate') 
    .then(function (response){ 
     if (response.data.token !== undefined && response.data.token.length) { 
      $window.sessionStorage.token = response.data.token; 
     } 
    }, function (reason){ 
     console.log(reason); 
    } 
); 
}; 

На этом этапе вам нужно будет сказать Угловой поймать каждый запрос, добавив заголовок Authorization, содержащий JWT перед отправляя его на сервер с использованием перехватчика:

var app = angular.module('myApp', []); 

app.config(['$httpProvider', function($httpProvider){ 
    $httpProvider.interceptors.push('AuthInterceptor'); 
}]); 

app.factory('AuthInterceptor', ['$q', '$window', function ($q, $window) { 
    return { 
    request: function (config) { 
     config.headers = config.headers || {}; 
     if ($window.sessionStorage.token) { 
     config.headers.Authorization = 'Bearer ' + $window.sessionStorage.token; 
     } 
     return config; 
    }, 
    response: function (response) { 
     return response || $q.when(response); 
    } 
    }; 
}]); 

Не требуется дополнительной настройки. Прежде чем ваша заявка вызовет /items, сначала необходимо позвонить /authenticate, после чего JWT следует отправить в качестве заголовка авторизации при каждом последующем запросе, пока окно браузера не будет закрыто, или $window.sessionStorage.token сбрасывается вручную.

Надеюсь, что это поможет :)

+0

Я не понимаю, что я понимаю. Где я могу проверить, правильно ли пользователь указал правильное имя пользователя/пароль? Где пароль_verify()? –

+0

Мой вопрос: где я должен поставить код, чтобы проверить, может ли пользователь подключиться? Должен ли я иметь функцию аутентификации, которую я вызываю с помощью (GET, POST или PUT) api/authentication? Должна ли эта функция получить пароль для данного имени пользователя, а затем сравнить его с данным паролем, чтобы узнать, подходит ли он, а затем вернуть некоторую информацию или сообщение, сообщающее, что оно не работает? Может ли все это быть сделано в моей функции API или это противоречит тому, чтобы быть RESTful? Должен ли я использовать GET, POST или PUT? –

+0

У меня есть несколько вопросов; 1 --- что такое $ key = "example_key"; 2 --- При этом мне не нужно было иметь что-то вроде ключа сеанса в моей базе данных? 3 --- Могу ли я сохранить имя пользователя и привилегию внутри файла cookie и будет ли он безопасным? 4 --- Если кто-то пытается изменить содержимое токена, заметил бы, что он делает недействительным токен? –