authentification par token en php
j'ai un service de repos sur mon serveur web, écrit en php. Je me demandais, quelle serait la meilleure authentification (en plus de l'authentification http de base). J'ai entendu de la base de jeton d'authentification, et voudrais vous demander si quelqu'un pourrait expliquer les principales étapes.
- sur une GET: le token send est-il visible? (n'est-ce pas dangereux?)
- Comment faire pour que le token ne soit valide que pour une durée déterminée?
- ...
Client: Android / Browser; Server: Apache, PHP5
3 réponses
cela peut être fait de toute façon, et les valeurs dans une requête GET ne sont pas vraiment plus visibles que les valeurs dans une requête POST. Si quelqu'un peut "voir" (c'est à dire intercepter) de la demande, il peut voir tout ce que vous envoyez. En fin de compte, une requête HTTP n'est qu'un tas d'en-têtes HTTP éventuellement suivi d'un corps. L'URL est de l'envoyer dans le premier GET /foo/bar HTTP/1.1
line, les autres valeurs sont simplement envoyées en différentes, en suivant les lignes.
c'est donc à vous de décider où vous voulez que votre jeton d'authentification à envoyer. Vous pouvez exiger qu'il soit un paramètre de requête qui est ajouté à chaque demande:
GET /foo/bar?user=123456&token=abcde...
Pour vraiment utiliser le protocole HTTP comme prévu, vous devriez utiliser le Authorization
en-tête HTTP:
Authorization: MyScheme 123456:abcde...
Le contenu de cet en-tête est entièrement à vous. Il spécifie habituellement une méthode d'autorisation comme Basic
, suivi de tout ce que vous voulez pour l'authentification. Cela peut simplement être le nom d'utilisateur et le mot de passe, un hachage d'entre eux, un jeton opaque le client a obtenu à un moment ou à autre chose, vraiment.
je recommande un système de token ou un système de signature des requêtes, ce dernier étant très préféré. Dans une demande de signature de système, le client doit obtenir un jeton de vous. Il envoie ensuite un hachage de ce jeton et de certaines caractéristiques de la requête pour authentifier la requête, par exemple sha1(Token + Timestamp + Request URL + Request Body)
. Votre serveur peut valider cela sans que le client n'ait à envoyer le token en texte clair sur chaque requête.
Comment faire pour que le token ne soit valide que pour une durée déterminée?
vous sauvegardez le côté du serveur token avec un timestamp d'expiration et vérifiez avec lui.
Voici un question à propos de l'authentification par token. Je pense que le plus commun authentification basée sur les jetons aujourd'hui est OAuth. Mais pour répondre à tes questions:
Sur un GET: Est le jeton envoyer visible? (n'est-ce pas dangereux?)
Vous pouvez passer vos tokens à travers les en-têtes HTTP de sorte qu'ils ne sont pas si facilement visibles. OAuth permet. Notez que les jetons sont encore visibles, ils sont tout simplement pas dans le GET
requête paramètre.
Comment faire pour que le token ne soit valide que pour une durée déterminée?
puisque vous contrôlez (créez) les tokens, vous pouvez définir des dates d'expiration pour chaque token. Pour chaque requête de votre API, vous devez juste vérifier votre stockage de token (par exemple Base de données) si le token donné est toujours valide. Si ce n'est pas le cas, vous pouvez annuler la requête (peut-être retourner une erreur HTTP 401).
vous pouvez utiliser la base de données PHP JWT (JSON Web Token) pour l'authentification par token.
1)Installez php jwt en exécutant la commande composer compositeur besoin firebase/php-jwt
require_once('vendor/autoload.php');
use \Firebase\JWT\JWT;
define('SECRET_KEY','Your-Secret-Key') // secret key can be a random string and keep in secret from anyone
define('ALGORITHM','HS512')
après cela, générez votre token
$tokenId = base64_encode(mcrypt_create_iv(32));
$issuedAt = time();
$notBefore = $issuedAt + 10; //Adding 10 seconds
$expire = $notBefore + 7200; // Adding 60 seconds
$serverName = 'http://localhost/php-json/'; /// set your domain name
/*
* Create the token as an array
*/
$data = [
'iat' => $issuedAt, // Issued at: time when the token was generated
'jti' => $tokenId, // Json Token Id: an unique identifier for the token
'iss' => $serverName, // Issuer
'nbf' => $notBefore, // Not before
'exp' => $expire, // Expire
'data' => [ // Data related to the logged user you can set your required data
'id' => "set your current logged user-id", // id from the users table
'name' => "logged user name", // name
]
];
$secretKey = base64_decode(SECRET_KEY);
/// Here we will transform this array into JWT:
$jwt = JWT::encode(
$data, //Data to be encoded in the JWT
$secretKey, // The signing key
ALGORITHM
);
$unencodedArray = ['jwt' => $jwt];
fournir ce jeton à votre utilisateur " $jwt" . Sur chaque requête, l'utilisateur doit envoyer la valeur du token avec chaque requête pour valider l'utilisateur.
try {
$secretKey = base64_decode(SECRET_KEY);
$DecodedDataArray = JWT::decode($_REQUEST['tokVal'], $secretKey, array(ALGORITHM));
echo "{'status' : 'success' ,'data':".json_encode($DecodedDataArray)." }";die();
} catch (Exception $e) {
echo "{'status' : 'fail' ,'msg':'Unauthorized'}";die();
}