Estoy tratando de diseñar un servicio web de API RESTful seguro con la menor cantidad posible de partes móviles. Tengo algunas preguntas y quiero asegurarme de que mi diseño sea seguro.
Para el nivel de seguridad de la transmisión de datos, usaré SSL / TLS para evitar la interceptación, MITM, ataques de reproducción, etc.
Lo que deja es el control de acceso.
No tengo ganas de luchar con OAuth. La razón es que no quiero confiar en un tercero, y configurar servidores locales como el "autenticador" (o como lo llame OAuth) no es factible.
Así que iba a confiar en un token aleatorio. Al usar una biblioteca CSPRNG (por ejemplo, $token = random_bytes(32)
en PHP), planeo asignar a cada nombre de usuario / contraseña un $token
, y almacenarlo en la base de datos usando una función de almacenamiento de contraseña (por ejemplo, PBKDF2 o bcrypt). El usuario también recuperará el token a través de SSL / TLS.
Luego, en cada solicitud, el usuario enviará el token junto con sus datos JSON. Si el token que pasan existe en la base de datos, se procesa la llamada a la API.
Esto me deja con algunas preguntas:
- ¿El token puede ser coherente (sin revocación o actualización manual), o el token requiere ser "actualizado" con frecuencia? Si es así, ¿cuál es la forma viable de manejar eso? Forzar al usuario a iniciar sesión en una página web para obtener acceso al nuevo token parece anular el propósito de una API. Esto parece indicar que es lo mejor Un punto controvertido.
- ¿Cuál es la ventaja de poner el token en un encabezado HTTP (por ejemplo,
Authorization: Token SOMERANDOMVALUE
) en lugar de simplemente rellenarlo en el cuerpo de una solicitud JSON? De cualquier manera, no haré nada con la solicitud a menos que la autenticación sea exitosa. De todos modos, iba a ponerlo en el encabezado, pero tenía curiosidad.
Además, si alguien tiene fuentes confiables para aprender más sobre cómo crear API seguras, realmente me gustaría leerlas.