L'autenticació basada en token és un tipus d'autenticació utilitzada en Criptografia on el repte que han de superar les entitats (usuaris/aplicacions) per tal de ser autenticades és proporcionar un token. El token és un secret compartit només entre l'entitat autenticada i el servei d'autenticació i per tant s'ha de mantenir de confidencial.
Els tokens també són coneguts com (aka):
Un Token ha de complir amb les següents condicions:
Avantatges
Inconvenients:
Recursos:
Se solen utilitzar funcions criptogràfiques de hash, valors aleatoris i funcions com uniqid per a crear API keys. Exemple amb PHP:
Exemple 1. Hash md5/sha1:
private function generateApiKey() { return md5(uniqid(rand(), true)); }
Exemple 2: Mida variable:
private function _generate_key() { //$this->load->helper('security'); do { $salt = do_hash(time().mt_rand()); $new_key = substr($salt, 0, config_item('rest_key_length')); } // Already in the DB? Fail. Try again while (self::_key_exists($new_key)); return $new_key; }
Recursos:
Laravel passport proporciona un mètode anomenat createToken a la classe User que permet crear Personal access Tokens https://laravel.com/docs/5.3/passport#managing-personal-access-tokens
Tenim el helper str_random per crear cadenes de text aleatories:
$code = str_random(10); //would produce a secret code of 10 chars.
I a més podem utilitzar les funcionalitats de hash de Laravel per crear un hash a partir d'aquestes dades aleatòries:
Vegeu Laravel Hash https://laravel.com/docs/5.3/hashing
Cal tenir en compte que hi ha dos Helpers que poden ser utils a Code Igniter:
random_string('sha1')
La funció per a crear random strings és:
if ( ! function_exists('random_string')) { function = 'alnum', $len = 8) { switch($type) { case 'basic' : return mt_rand(); break; case 'alnum' : case 'numeric' : case 'nozero' : case 'alpha' : switch ($type) { case 'alpha' : $pool = ' abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; break; case 'alnum' : $pool = ' 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; break; case 'numeric' : $pool = '0123456789'; break; case 'nozero' : $pool = '123456789'; break; } $str = ; for ($i=0; $i < $len; $i++) { $str .= substr($pool, mt_rand(0, strlen($pool) -1), 1); } return $str; break; case 'unique' : case 'md5' : return md5(uniqid(mt_rand())); break; case 'encrypt' : case 'sha1' : $CI =& get_instance(); $CI->load->helper('security'); return do_hash(uniqid(mt_rand(), TRUE), 'sha1'); break; } } }
Les API key es recomanable posar-les a la capçalera HTTP utilitzant el Request Header Authorization en comptes de passar-la per la URL ja sigui per mètode GET o POST
Authorization: bf45c093e542f057caee68c47787e7d6
També s'utilitza X-API-KEY en algunes API. Vegeu Code Igniter REST WEB API
$ curl -X POST -H "X-API-KEY: some_key_here" http://example.com/books
Un altre possiblitat (per exemple utilitzada a Laravel passport/Oauth) és utilitzar Bearer:
Authorization: Bearer ACCES_TOKEN_HERE
Amb apps PHP també s'utilitza (per exemple Laravel):
PHP_AUTH_PW: token
S'utilitza el codi de resposta 401 per indicar un accés no autoritzat o per reclamar que cal autoritzar-se abans d'accedir al recurs.
Se sol guardar la API key de l'usuari a la base de dades del servidor. El mode més simple (si hi ha una sola clau) és afegir un camp més a la taula users. Si hi ha múltiples claus per usuari cal crear una taula nova per a fer una relació 1 a n
En els clients hi ha múltiples opcions:
Recursos:
This means it is a strict set of instructions for the issuing and validating of signed access tokens. The tokens contain claims that are used by an app to limit access to a user.
Vegeu Json Web Tokens
Vegeu Protocols_d'autenticació#Esquemes_d.27autenticaci.C3.B3 i Ldap
OAuth2 és un exemple de framework d'autenticació (aka Authentication framework) és a dir un guia detallada de com permetre a usuaris i aplicacions l'accés a recursos protegits
Vegeu Oauth
Són tokens utilitzats per proporcionar a una aplicació client de permís (autorització) per demanar un access token en nom d'un usuari el qual ha autoritzat aquesta acció. S'utilitzen en protocols com Oauth en la fase d'autorització.
Amb Oauth només s'utilitzen al grant:
Són els més comuns i són tokens que proporcionen accés a un recurs privat. Els access tokens se solen obtenir prèvia autorització del propietari del recurs/resource-owner. Tots els tipus de grants de OAuth acaben retornant un access token en canvi no tots utilitzen authorization tokens
Per seguretat és recomanable utilitzar JWT/Json Web Tokens o similar per a proporcionar els tokens ja que els tokens JWT estan xifrats i a més són stateless. Molts sistemes com Laravel Passport combinen l'ús de Oauth i JWT
Vegeu Refresh Token
Vegeu JWT
Vegeu Laravel Token-Based Authentication
Vegeu Laravel Passport