Estándares de identificación modernos: OAuth 2.0, OpenID Connect, WebAuthn

¿Dejar o no dejar? Esa es la pregunta…

Ahora, en muchos sitios, vemos la oportunidad de registrarse o iniciar sesión utilizando las redes sociales, y algunos sitios ofrecen el uso de claves de seguridad externas o huellas digitales. ¿Qué es? ¿Están bien diseñados estándares de seguridad o implementaciones propietarias? ¿Podemos confiar en estas tecnologías y usarlas para el desarrollo de sitios web y en la vida cotidiana? Vamos a hacerlo bien. Entonces, ahora hay varios estándares y tecnologías para identificar a los usuarios de OAuth 2.0, OpenID Connect, WebAuthn, SAML 2.0, Credential Management API, etc. En este artículo hablaré sobre los tres protocolos más prometedores OAuth 2.0, OpenID Connect y WebAuthn. Y para entender cómo ponerlos en práctica, haremos tres trabajos de laboratorio. Utilizaremos GitHub y Google como plataformas para identificar usuarios.en el cual la mayoría tiene cuentas.

imagen

OAuth 2.0


Comencemos con el protocolo OAuth 2.0 más famoso. Fue publicado en 2012 como RFC 6749: El Marco de Autorización OAuth 2.0 .

Usando OAuth 2.0, un usuario permite que un sitio específico reciba sus datos privados de las redes sociales, pero sin transferir sus inicios de sesión / contraseñas al sitio. Por ejemplo, cuando se registra en un sitio a través de Facebook, simplemente le da permiso a este sitio para obtener su nombre, dirección de correo electrónico y otros datos privados de Facebook.

Tratemos con la implementación técnica. Para simplificar, llamaré a cualquier sitio que almacene credenciales de usuario en la red social. Y MySite nombrará cualquier sitio o aplicación que desee obtener datos de los usuarios de la Red Social.

imagen

El estándar define los siguientes roles:

  • Resource Owner — , MySite .
  • Client ( MySite) — , Authorization Server Resource Server .
  • Authorization Server — / , .
  • Resource Server — , API. Authorization Server Resource Server .

Authorization flow


  • MySite :
  • MySite Name ( ), Homepage ( MySite) Callback (, )
  • La red social proporciona la identificación del cliente (a veces llamada AppID) y el secreto del cliente.
  • La ID del desarrollador debe estar registrada en la ID del cliente y el secreto del cliente.

Ahora el proceso en sí. Los detalles de implementaciones específicas pueden variar, pero la lógica general siempre será la siguiente:

imagen

  1. El propietario del recurso inicia sesión en el Cliente (MySite), selecciona la opción "iniciar sesión con la red social", el sitio redirige al usuario a la red social en el servidor de autorización.
  2. El servidor de autorización comprueba si el usuario tiene una sesión activa y, si no, muestra el formulario de inicio de sesión.
  3. El propietario del recurso ingresa su nombre de usuario / contraseña y confirma que MySite puede usar ciertos datos privados, como el nombre de usuario o la dirección de correo electrónico.
  4. El servidor de autorización verifica al usuario y lo redirige a la dirección de devolución de llamada con el resultado de la autenticación y el "Código de autorización"
  5. Client “Authorization Code”, Client ID Client Secret.
  6. Authorization Server “access token” JWT (JSON Web Token), . JWT “refresh token”, c .
  7. Client API, “access token”.
  8. Resource Server “access token” (, Authorization Server) .

OAuth 2.0 (GitHub)


Hay muchas instrucciones sobre cómo implementar la autorización OAuth 2.0 utilizando las redes sociales. Personalmente me gustó el siguiente artículo: Autenticación usando GitHub OAuth 2.0 con NodeJS Detalla los pasos y proporciona un programa de prueba. Pero, para comprender realmente el algoritmo, es mejor seguir todos los pasos con las manos (solicitudes http del navegador o llamadas a curl). Vamos.

Para comenzar, registre su aplicación en GitHub: github.com/settings/applications/new

Establezca los parámetros:


Para la autorización para trabajar dentro de su propio sitio, las direcciones deben ser reales, pero esto no es necesario para el trabajo de laboratorio.

Obtener de GitHub:

  • ID de cliente: ab8ec08a620c2
  • Secreto del cliente: e6fdd52b0a99e8fbe76b05c1b7bb93c1e

Por supuesto, en todo trabajo de laboratorio todos los valores son falsos.

Así es como se obtiene el ID de cliente y el secreto en el sitio web de GitHub:

imagen

ahora comenzamos la autorización. Creemos que el Paso 1 ya se ha completado: el usuario inició sesión en MySite y seleccionó "Iniciar sesión con GitHub". El paso 2 del flujo de llamadas es una llamada en formato REST:

https://github.com/login/oauth/authorize?client_id=ab8ec08a620c2


  • la dirección es el punto de inicio de sesión en github
  • client_id es el ID de cliente emitido durante el registro

Como resultado de esta llamada, GitHub muestra una ventana de autorización:

imagen

Paso 3: Ingrese el nombre de usuario / contraseña para acceder a GitHub

Paso 4: GitHub redirige la solicitud a la Página de inicio, en esta solicitud vemos el código:

http://MySite/home?code=a29b348f63d21

No hay un sitio de trabajo en esta dirección, pero lo principal para nosotros es conocer el código enviado para formar el siguiente Paso 5:

https://github.com/login/oauth/access_token?client_id=ab8ec08a620c2&
client_secret=e6fdd52b0a99e8fbe76b05c1b7bb93c1e&
code=a29b348f63d21

  • la dirección es el punto de recepción del token de acceso en GitHub
  • client_id es el ID de cliente emitido durante el registro
  • client_secret es un secreto de cliente emitido durante el registro
  • código es el código que acaba de enviar

Paso 6: en respuesta token de acceso recibido:

access_token=31b71cbd372acdbb20ec1644b824f3dd0&scope=&token_type=bearer

Paso 7: inserte access_token en el encabezado de la solicitud y llame a la API de GitHub:

curl -H "Authorization: token 31b71cbd372acdbb20ec1644b824f3dd0" https://api.github.com/user

Paso 8: En respuesta, obtenemos JSON con información útil sobre mí que puede usar para crear un perfil en MySite:

{
  "login": "AlexeySushkov",
  "html_url": "https://github.com/AlexeySushkov",
  "repos_url": "https://api.github.com/users/AlexeySushkov/repos",
  "name": "Alexey Sushkov",
  "blog": "http://sushkov.ru",
  "location": "St.Petersburg, Russia",
  "email": "alexey.p.sushkov@gmail.com",
 ..
}  

De hecho, examinamos solo un escenario de OAuth 2.0. Existen varios escenarios, cada uno de los cuales se utiliza según la aplicación, las consideraciones de seguridad, el método de implementación, etc. Se puede encontrar una descripción de todos los escenarios, por ejemplo, aquí: OAuth 2.0 en pocas palabras .

Openid connect


Con OAuth 2.0 un poco entendido. Ahora descubramos por qué necesitamos OpenID Connect, que es un complemento para OAuth 2.0:

  • C OAuth 2.0 .. access token, . access token MySite. OpenID Connect — (identity). .
  • OpenID Connect “service discovery”. SSO (Single Sign-On), .

Veamos el estándar desde el punto de vista técnico.

OpenID Connect (OIDC) es un estándar abierto de OpenID desarrollado por el consorcio de la Fundación OpenID . OIDC extiende OAuth 2.0 con las siguientes características clave:

  • El servidor de autorización, además del token de acceso y el token de actualización, devuelve un "token de identidad" (token de identificación). Está contenido en el mismo JWT. La siguiente información se puede extraer del ID Token: nombre de usuario, hora de inicio de sesión, fecha de vencimiento del ID Token. Las ID de token se pueden transferir entre los participantes.
  • OIDC proporciona una API adicional que le permite solicitar información sobre el usuario y sus sesiones actuales.

El diagrama de interacción en OpenID Connect se ve igual que con OAuth. La única diferencia en el contenido de las solicitudes:

  • En la solicitud inicial de código, se agrega un atributo adicional, scope = openid.
  • Como resultado del algoritmo, el Cliente, además de acceder y actualizar el token, recibe una ID de token.

OpenID Connect: Lab (Google)


Ahora veamos qué nos complacerá Google sobre este tema. Hay instrucciones detalladas para configurar y usar OpenID Connect de Google y un sandbox para usar la API de Google : Google OAuth 2.0 Playground .

Aquí, como en el caso de OAuth 2.0, revisaremos los pasos y observaremos los datos entrantes. Del mismo modo, creemos que la aplicación está registrada, se reciben la identificación del cliente y el secreto del cliente, se pasa el paso 1. El paso 2 del flujo de llamadas es una llamada en formato REST:

https://accounts.google.com/o/oauth2/v2/auth?
response_type=code&
client_id=140797064495-b8b79j42m97nkkrlndfstikv8.apps.googleusercontent.com&
scope=openid%20email&
redirect_uri=http%3A//c18529.shared.hc.ru/wp-login.php&
state=765439764

Google es un poco más complicado porque Prestan más atención a la seguridad:

  • dirección es el punto de inicio de sesión en Google
  • response_type = code - espera recibir código en respuesta
  • client_id: ID de cliente emitida durante el registro
  • alcance = correo electrónico openid - a qué datos queremos acceder
  • redirect_uri - redirect_uri especificado durante el registro de la aplicación
  • estado: el número generado por el Cliente, que se transmite entre el Cliente y AS para proteger contra la interferencia de intrusos.

Paso 3: no hay formulario de ingreso de contraseña, como Ya estaba conectado a Google.

Paso 4: Google redirige la solicitud a la página de inicio, en esta solicitud vemos el código:

http://MySite?state=123&code=4/xAFkcMzhyJhUErRJYwIyntSYN-WeJjfZHLiwWL4IaT-WkHzMU18xABlPmev-M_87wVbqTkQ1y93w6GB5&scope=email+openid+https://www.googleapis.com/auth/userinfo.email&authuser=0&prompt=none

Como en el caso de GitHub, no hay un sitio web que funcione en esta dirección, pero esto no es necesario, lo principal para nosotros es conocer el código para formar el siguiente Paso 5. Esto también es un poco más complicado, porque Google requiere una solicitud POST, no una GET:

curl -d "code=4/xAFkcMzhyJhUErRJYwIyntSYN-WeJjfZHLiwWL4IaT-WkHzMU18xABlPmev-M_87wVbqTkQ1y93w6GB5&client_id=140797064495-b8b79j42m97nkkrlndfstikv8.apps.googleusercontent.com&
client_secret=HMVctrTicW6RC1Q8T&
redirect_uri=http%3A//c18529.shared.hc.ru/wp-login.php&
grant_type=authorization_code" 
-H "Content-Type: application/x-www-form-urlencoded" -X POST https://oauth2.googleapis.com/token

  • la dirección es el punto de recepción del token en Google
  • código es el código que acaba de enviar
  • client_id es el ID de cliente emitido durante el registro
  • client_secret es un secreto de cliente emitido durante el registro
  • grant_type = autorización_código: el único valor válido del estándar

Paso 6: En respuesta recibió access_token e id_token:

{
  "access_token": "ya29.Il_AB0KeKnjBJx0dhjm2nCLt1B-Mq0aQBW5T302JnlZfsxW1AXqLFfDJZRMi2R2WKG4OX4msKLjx4E4CSl4G_4ajAy3aqrf4pM0ic0jJr092pA67H9aktJktCbx",
  "expires_in": 3327,
  "scope": "openid https://www.googleapis.com/auth/userinfo.email",
  "token_type": "Bearer",
  "id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjE3ZDU1ZmY0ZTEwOTkxZDZiMGVmZDM5MmI5MWEzM2U1
………………………………_…………………………………………………….._4mUTiMNSAHljap1hLD2hAzgOZWuQ"
}

¿Qué hacer ahora con esta riqueza?

Paso 7: con access_token todo está claro: lo incluimos en una llamada API, por ejemplo, GMail:

curl -H "Authorization: Bearer ya29.a0Adw1xeWvFoxHKNICHnV6vFFj5TZdPQVlYD98h8wjW95ZEbHVui_pk7HGRoq3Q7MlVLV23xkVM0yyjSP8ClSlvfUy3b_IqvKQW5Lvwj38QzJhee-aH1grerB4pRpMzn_FGueigG_RGI56pKPgFBTr49cpynQy" https://www.googleapis.com/gmail/v1/users/alexey.p.sushkov@gmail.com/profile

Paso 8: En respuesta, obtenemos JSON con información útil:

{
 "emailAddress": "alexey.p.sushkov@gmail.com",
 "messagesTotal": 372543,
...
}

Ahora revisemos la declaración de que id_token contiene información para autenticar al usuario y mantener la sesión. Para hacer esto, debe descifrar el contenido. La forma más fácil de hacerlo es ponerse en contacto con la API de Google en
oauth2.googleapis.com/tokeninfo y especificar el id_token recibido como parámetro:

https://oauth2.googleapis.com/tokeninfo?id_token=eyJhbGciOiJSUzI1NiIsImtpZCI6IjE3ZDU1ZmY0ZTEwOTkxZDZiMGVmZDM5MmI5MWEzM2U1NGMwZTIxOGIiLCJ0eXAiOi
………………………_……………………………...
SVQ5GQni3irfOzOXYEiqijp6TjGa_a-3jKcEsU5TbasZmAIejsdVcNy2_4mUTiMNSAHljap1hLD2hAzgOZWuQ

Tengo JSON:
{
  "iss": "https://accounts.google.com",
  "email": "alexey.p.sushkov@gmail.com",
  "email_verified": "true",
  "iat": "1583257010",
  "exp": "1583260610",
  "typ": "JWT"
...
}

Vemos que id_token contiene información sobre el inicio de sesión del usuario, la hora de recepción y la vida útil del token. Podemos concluir que OpenID Connect de Google está funcionando y se puede usar para escenarios relevantes.

Webauthn


API de autenticación web (también conocida como WebAuthn):

  • El estándar permite a los usuarios identificarse en sitios web y en aplicaciones que utilizan claves de seguridad externas (por ejemplo, claves USB) o por huella digital y, posteriormente, por otros datos biométricos: cara, retina.
  • — / «Public key cryptography». Public key cryptography — , . Private key ( ) , public key ( ) .
  • W3C (World Wide Web Consortium) FIDO, Google, Mozilla, Microsoft, Yubico. W3C HTTP, HTML, XML . WebAuthn. WebAuthn : Chrome, Firefox, Edge, Safari.


En comparación con OAuth 2.0, los siguientes roles se agregan a WebAuthn:

Autenticador : una clave de seguridad externa (medios físicos o escáner de huellas digitales) que autentica al usuario utilizando diversas tecnologías, como BlueTooth / NFC / USB. Sirve para:

  • Generación de credenciales de clave pública (pares de clave pública / privada).
  • Authenticator almacena de forma segura la clave privada en su memoria
  • Pasa la clave pública a sistemas externos
  • Firma los datos con una clave privada y transfiere el resultado a sistemas externos

Authenticator utiliza el protocolo CTAP (Protocolos de cliente a autenticador) para interactuar con el navegador.

Parte dependiente : realiza la misma función que el "Servidor de autorización" en OAuth 2.0, es decir, verifica la identidad del usuario. Solo en OAuth 2.0 era el nombre de usuario / contraseña, y en WenAuthn eran las credenciales de clave pública.

Agente de usuario : integra el navegador y la aplicación de red, sirve para los mismos propósitos que el Cliente en OAuth 2.0, es decir, por un lado, interactúa con el usuario y le proporciona una GUI, y por otro lado, interactúa con sistemas que almacenan credenciales de usuario .

Flujo de autorización


Antes de comenzar el proceso de autenticación, al igual que en OAuth 2.0, debe realizar los pasos preparatorios, solo en OAuth 2.0 registramos la aplicación y en WebAuth 2.0 registramos al usuario. La API de autenticación web especifica dos llamadas:

  • navigator.credentials.create - para crear credenciales de usuario
  • navigator.credentials.get: verifica las credenciales del usuario

En consecuencia, para registrarse, debe llamar a navigator.credentials.create.

Como resultado de esto, el Autenticador del usuario almacenará la clave privada para un sitio específico, y la clave pública se almacenará en la Parte que confía.

imagen

Después de eso, el proceso de autenticación será el siguiente:

imagen

  1. “WebAuthn”. , , WebAuthn, “ ” “ ”. Relying Party Challenge. Challenge — , Code OAuth 2.0.
  2. Relying Party Challenge. , REST API.
  3. Authenticator- CTAP (Client to Authenticator Protocols). navigator.credentials.get c :

    • Challenge
  4. Authenticator , , .
  5. , Authenticator .
  6. La aplicación envía los datos firmados a la Parte que confía.
  7. Relying Party descifra los datos utilizando la clave pública, comprueba el desafío y autoriza al usuario.

Para arreglar el material hacemos trabajos de laboratorio:

WebAuthn: Lab (Google)


Para implementar WebAuthn, solo no se pueden prescindir de las solicitudes http, ya que debe llamar a la API del navegador para interactuar con el autenticador. Pero aquí Google está contento, creó un sandbox con instrucciones paso a paso: su primer WebAuthn .

Como resultado del trabajo, obtenemos una aplicación JS cliente-servidor que implementa la autenticación de huellas digitales. Un departamento de trabajo se encuentra en .

Si lo ejecuta en un teléfono inteligente con un sensor de huellas digitales, puede ver el resultado del trabajo. Como de costumbre, primera preparación: registre al usuario:

imagen

cree un nombre de usuario / contraseña y luego adjunte la huella digital:

imagen

después de eso, el programa muestra qué clave pública se adjunta a esta huella digital:

imagen

Ahora puede iniciar el script de autenticación. Como de costumbre, creemos que el paso 1 se ha completado y estamos en el sitio. Para ir al Paso 2, haga clic en "Probar reautorización". El navegador realizará el Paso 3 e interactuará con el Autenticador, que en el Paso 4 le pedirá que coloque su dedo:

imagen

Y si el dedo registrado está conectado, los Pasos 5 y 6 pasarán con éxito y en el Paso 7 la aplicación volverá a mostrar la ventana con la clave pública correspondiente:

imagen

Conclusión


Por lo tanto, examinamos los tres protocolos más comunes y prometedores para la identificación de usuarios: OAuth 2.0, OpenID Connect, WebAuthn. Entendimos el alcance de su aplicabilidad:

  • OAuth 2.0: se utiliza para registrar e iniciar sesión a los usuarios en sitios que utilizan redes sociales. Y también para obtener datos de los usuarios de las redes sociales.
  • OpenID Connect — . OpenID Connect SSO .
  • WebAuthn — .


  • , , .
  • , , .
  • Tiene sentido autenticar a los usuarios en plataformas en la nube como Facebook o Google, ya que Emplean a los mejores expertos en seguridad que pueden proporcionar todos los matices de seguridad.
  • Sugiero optimista sobre el futuro, porque Protocolo WebAuthn: ¡una oportunidad real de deshacerse de la contraseña del infierno de nuestro tiempo!

¡Es solo el comienzo!

Apéndice: otros protocolos de autenticación


Para completar, enumeraré los otros protocolos y tecnologías relevantes utilizados para identificar a los usuarios:

SAML 2.0 (lenguaje de marcado de aserción de seguridad)


El protocolo maduro de 2005, pero tiene un conjunto limitado de escenarios para construir sistemas SSO. Utiliza un formato de datos basado en XML. Se pueden encontrar más detalles en el artículo: "Quién usa el protocolo de autenticación SAML 2.0"

API de gestión de credenciales


El desarrollo lo lleva a cabo la misma organización que WebAuthn - W3C. El estándar de gestión de credenciales le permite:

  • Almacene la identidad de los suscriptores, lo que permite a los usuarios acceder a sitios sin ingresar contraseñas, pero usar contraseñas de la tienda.
  • Seleccione las cuentas necesarias para ingresar a ciertos sitios.
  • Le permite utilizar inicios de sesión / contraseñas ingresados ​​en un dispositivo en otros dispositivos.

Un ejemplo de implementación común de la API de administración de credenciales es el administrador de contraseñas de Google: passwords.google.com

Iniciativa para la autenticación abierta (OATH)


Recursos de juramento

Una lista completa de protocolos basados ​​en OAuth 2.0



All Articles