¿Cómo funciona OAuth 2.0?

Esto se basa en el borrador actual a partir de hoy, 17:
http://tools.ietf.org/html/draft…

OAuth 2.0 es un protocolo basado en HTTPS que permite al propietario de un recurso (el usuario final), utilizando un agente de usuario (generalmente un navegador), permite que un cliente (generalmente un consumidor de API) acceda a un recurso protegido en un servidor de recursos (generalmente un proveedor de API) usando credenciales almacenadas en un servidor de autorización. El acceso al recurso protegido está autorizado por un token de acceso.

A los clientes se les asignan secretos que se comparten con el servidor de autorización.

1. Flujos de autorización

Hay 4 flujos disponibles.

1.1. Flujo de código de autorización

El flujo del Código de autorización se utiliza cuando el cliente es un servidor o aplicación web de terceros, que realiza el acceso al recurso protegido.

El cliente no tiene acceso a las credenciales del propietario del recurso.

El agente de usuario se conecta a una URL alojada por el cliente. El cliente redirige al agente de usuario al servidor de autorización, incluida la información que se identifica a sí mismo (una identificación del cliente), la solicitud (alcance – los permisos solicitados) y una URL que apunta hacia el cliente (URL de redireccionamiento – se conoce como un URI en la especificación, aunque siempre es una URL HTTP).

El servidor de autorización autoriza al propietario del recurso y puede realizar la autenticación, como la verificación del nombre de usuario / contraseña y la confirmación de la acción solicitada. En caso de éxito, dirige al usuario-agente de regreso al cliente a través de la URL de redireccionamiento proporcionada, agregando un código de autorización a la URL.

La URL de redireccionamiento generalmente apunta a un script del lado del servidor que solicita el token de acceso a través de una POST al servidor de autorización. La POST está autenticada por el secreto del cliente y proporciona el código de autorización recibido como prueba de que el propietario del recurso realmente ha autorizado la solicitud. El servidor responde con el token de acceso y un tiempo de vencimiento en la respuesta POST.

1.2. Flujo de concesión implícito

El flujo de concesión implícita se utiliza cuando el agente de usuario accederá directamente al recurso protegido, como en una aplicación web enriquecida o una aplicación móvil. El secreto del cliente no se usa.

El agente de usuario se conecta a una URL en el servidor de autorización. Esto podría ser una conexión directa o una redirección realizada desde el cliente. La solicitud contiene la identificación del cliente, el alcance de la solicitud y la URL de redireccionamiento. Si el servidor de autorización pasa la solicitud, realiza una redirección a la URL de redireccionamiento con el token de acceso y el tiempo de caducidad en el fragmento (después del hash #).

Si bien la URL de redireccionamiento apunta al cliente, el código dentro del cliente (es decir, la aplicación del lado del servidor) no lo ve. En cambio, la URL se puede usar para cargar JavaScript que toma el token de acceso de la URL y lo usa. O bien, una aplicación móvil puede capturar la redirección, extraer el token de acceso y usarlo en su código, en cuyo caso la URL solo puede apuntar a contenido estático.

1.3. Flujo de credenciales de contraseña del propietario del recurso

El flujo de credenciales de la contraseña del propietario del recurso se utiliza cuando el propietario del recurso confía en el cliente para obtener su nombre de usuario y contraseña. El cliente obtiene las credenciales a través de otros medios que están fuera del alcance, luego las pasa directamente al servidor de autorización para solicitar un token de acceso. Este flujo se puede usar para migrar esquemas tradicionales de autenticación de nombre de usuario / contraseña.

1.4. Flujo de credenciales del cliente

El flujo de credenciales del cliente obtiene el token de acceso basado únicamente en el secreto compartido del cliente.

2. Acceso al recurso protegido

Una vez que el cliente o agente de usuario (en el flujo de concesión implícito) tiene el token de acceso, puede usarlo para acceder al recurso protegido. Hay 2 formas estándar de enviar las credenciales, aunque se pueden definir más.

2.1. Token al portador

El token de acceso se debe colocar en el encabezado HTTP de autorización y solo se puede colocar en un cuerpo de solicitud POST o en los parámetros GET URL como una opción alternativa.

2.2. MAC

Un MAC criptográfico (Código de autenticación de mensaje) se calcula utilizando elementos de la solicitud y se envía en el encabezado de Autorización. El propietario del recurso calcula y compara el MAC al recibir la solicitud.

El token de acceso solo se puede colocar en el encabezado HTTP de autorización

3. Actualizar tokens

En los flujos de Código de autorización y Credenciales de propietario de recurso, la implementación del servidor de autorización puede optar por emitir un token de actualización. Este token de actualización se puede usar para obtener un nuevo token de acceso sin solicitar autorización nuevamente.

  • SampleApp se ha registrado inicialmente como una “aplicación” con Linkedin . Al hacerlo, se les proporciona un conjunto de tokens llamado “clave de consumidor” y su “secreto de clave de consumidor” emparejado. SampleApp los utiliza en su código de aplicación y como parte del modelo OAuth para generar solicitudes.
  • Desde la perspectiva del usuario, cuando inicia sesión en SampleApp y hace clic en el botón “Iniciar sesión con Linkedin”, SampleApp usa su clave de consumidor para contactar a Linkedin y generar un “token de solicitud”. Luego se le proporciona una URL especial que lo redirige al sitio web de Linkedin.
  • Si aún no ha iniciado sesión en Linkedin, se le pedirá que se le presente y luego se le presentará una pantalla que le preguntará si desea proporcionar a SampleApp acceso a su cuenta.
  • Al hacer clic en “Permitir”, se le dice a Linkedin que SampleApp ha solicitado acceso utilizando su clave de consumidor particular que debería tener acceso a su cuenta de Linkedin. Luego, Linkedin lo redirige a su SampleApp con una cadena de verificación codificada adjunta.
  • Luego, SampleApp lee el token de solicitud generado anteriormente y toma la verificación devuelta para pedirle a Linkedin que genere un conjunto de tokens final llamado “token de acceso” y “secreto de token de acceso”.

Y en medio de todo esto, su nombre de usuario y contraseña de Linkedin nunca son vistos, y mucho menos almacenados, por SampleApp.

Es posible que desee consultar este enlace para obtener una referencia completa.

El marco de autorización de OAuth 2.0

Lo he usado en mi proyecto hace un par de semanas.

Es muy fácil de entender, escribiré en inglés simple para que pueda pasar rápidamente, incluso con una experiencia más fresca.

Explicaré cómo funciona el “servicio al servicio oauth2”, que se explica aquí: Azure AD Service to Service Auth usando OAuth2.0


Primero algunos términos simples :

  1. Autenticación
  1. Es una forma de verificar, si el nombre de usuario y la contraseña dados son correctos o no, para acceder a algo / algún recurso.
  2. Ejemplo:
  1. si el recurso es correo electrónico, entonces gmail es un servicio, y necesita un nombre de usuario y una contraseña para verificar su correo electrónico, por lo que está siendo “autenticado” a través del nombre de usuario y la contraseña para acceder al correo electrónico .
  2. ¿Por qué se requiere esto? Debido a que su correo electrónico debe ser accedido “solo” por usted, por lo que su nombre de usuario y contraseña ayudan a lograrlo.
  3. Además, hoy en día, mientras inicia sesión en el sistema operativo Windows, hace un año, puede iniciar sesión con su propio correo electrónico (como Outlook, Hotmail, Live.com), esto también es autenticación de correo electrónico para acceder a su computadora
  4. Hoy he visto que el sistema operativo más nuevo no cree que las contraseñas sean seguras, dice que las personas pueden adivinarlo fácilmente, por lo que ahora están solicitando un PIN, posiblemente un PIN de 4 dígitos que ayudará a iniciar sesión en su computadora, esto es autenticación de PIN para acceder a su computadora
  • Autorización
    1. Es una forma de verificar, si tiene el nivel de acceso correcto, por ejemplo, si es usuario administrador (administrador) o usuario normal.
    1. Ejemplo:
    2. Si puede instalar software como MS Office, MS Excel, etc. en el sistema operativo Windows, entonces es un usuario avanzado O un usuario administrador, es decir, tiene más privilegios.
    3. Sin embargo, si es un usuario normal O invitado, entonces no puede instalar el software en el sistema operativo Windows, solo puede usar el software, por ejemplo, puede ver un documento de MS Word y leer un currículum escrito en ese. Aquí tienes menos privilegios, no puedes instalar un software
    4. Entonces, esencialmente, un usuario normal O invitado no está autorizado para instalar software . Un administrador o usuario avanzado está autorizado para instalar el software. Por lo tanto, la autorización son permisos, usted tiene menos o más permisos para realizar ciertas acciones.
  • Active Directory, AD es (Active Directory – Wikipedia)
    1. Aquí es donde tenemos almacenados nuestros nombres de usuario y contraseñas, de usuario, de computadora y otras computadoras en la red -de-computadoras-y-otros-dispositivos-como-impresora.
    2. Por lo tanto, puede autenticar y autorizar a todos los usuarios en todas las computadoras en la red de computadoras y otros dispositivos como impresoras.
  • Azur:
    1. Microsoft Azure es una colección cada vez mayor de servicios en la nube para crear, implementar y administrar aplicaciones a través de nuestra red global de centros de datos
    1. esto es similar a
    2. GCP (Google Cloud Computing, servicios de alojamiento y API | Google Cloud Platform)
    3. AWS (Amazon Web Services (AWS) – Servicios de computación en la nube)
  • piense en ello como computadoras que están muy lejos, en todo el mundo, pero que funcionan para usted. Puede crear aplicaciones de servidor (compiladas con HTML, CSS, Angular, React) y de servidor (compiladas con Java, Nodejs, Python, etc.).

  • Ahora

    el problema:

    Supongamos que tenemos una aplicación, digamos que es el recurso a proteger , al igual que nuestro correo electrónico O computadora, etc.

    1. Esto debería estar abierto a internet, para que los usuarios puedan acceder.
    2. Pero no todos los usuarios en Internet deberían poder acceder a él.
    1. Solo unos pocos deberían tener acceso a él.
  • Esta aplicación es nuestro recurso seguro, eso significa que no debe verse comprometida. Es decir, por ejemplo, debe estar bloqueado de forma segura.
  • Incluso si alguien puede encontrar dónde está, es decir, está comprometido,
    1. luego, cuando se ve comprometido, todos los clientes no deberían verse afectados, es decir, el daño debería ser mínimo.
    2. Además, deberíamos poder asegurarlo nuevamente, sin mucha dificultad e inmediatamente. Es decir, puede que cambiemos la cerradura muy pronto, para que no se vea comprometida por completo.

    ¿Cómo resolver esto?

    Responder:

    Ok, tenemos una aplicación, que es el recurso que se debe asegurar.

    1. Para poder “abrirse en Internet, para que los usuarios puedan acceder”, esta aplicación puede tener una URL, similar a github, yahoo mail, gmail, (como http://example.com/mySecureAppli …) para que se pueda acceder desde Internet. Si está utilizando una aplicación móvil en el teléfono / pestaña para acceder al correo electrónico, entonces esa aplicación usa la URL de Gmail detrás de escena
    1. entonces, el punto # 1 de la pregunta anterior está satisfecho simplemente por tener una URL similar.
  • “No todos los usuarios en Internet deberían poder acceder a él”, para hacer esto, podemos tener un nombre de usuario y contraseña para la URL anterior, luego solo unas pocas personas seleccionadas que tienen ese nombre de usuario y contraseña pueden acceder.
    1. entonces, el punto # 2 de la pregunta anterior se satisface simplemente con un nombre de usuario y contraseña.
  • el punto 3 de la pregunta es difícil de satisfacer
    1. Sí, tenemos nombre de usuario y contraseña, pero necesitamos dar a los usuarios seleccionados para que solo ellos puedan acceder
    2. sin embargo, el nombre de usuario y la contraseña pueden ser filtrados por esos usuarios, por lo que es difícil compartir el nombre de usuario y la contraseña de la aplicación directamente
    3. así que el punto 3 de la pregunta debe resolverse todavía
  • el punto 4 de la pregunta también es difícil de satisfacer
    1. debido al punto # 3, una fuga de nombre de usuario y contraseña comprometerá la aplicación, y
    2. “Cuando se ve comprometido, todos los clientes no deben verse afectados, es decir, el daño debe ser mínimo” tampoco puede ocurrir cuando la aplicación tiene un solo usuario y contraseña, para esos usuarios seleccionados. Todos esos usuarios seleccionados se verán afectados si tenemos un único nombre de usuario y contraseña.
    3. así que el punto 4 de la pregunta también debe resolverse todavía

    Supongamos que resuelve los puntos 3 y 4, podemos hacer a continuación:

    1. Tenemos la aplicación A para asegurar
    2. Tenemos algo llamado como Registro de aplicación
    1. Esto significa que podemos tener
    1. un nombre de usuario y (esto permanece fijo)
    2. una contraseña (esto podemos eliminar o generar muchas contraseñas)
  • Ahora suponga que tenemos:
    1. Aplicación A
    1. vinculado a un registro de aplicación (AAppReg) (es decir, tenemos nombre de usuario ( recurso ) y contraseña)
    2. NOTA: para asegurarnos de que nuestra aplicación se mantenga segura, no usaremos contraseña, de hecho, no necesitamos generarla.
  • Otra aplicación de registro para el departamento de finanzas (FinanceTeamAppReg), por lo que separamos el nombre de usuario ( ID de cliente 1 ) y la contraseña ( secreto de cliente 1 ) para esto.
  • Sin embargo, otro registro de aplicación para el departamento de TI (ITTeamAppReg), por lo que separamos otro nombre de usuario ( ID de cliente 2 ) y una contraseña ( secreto de cliente 2 ) para esto.

  • Finalmente tenemos

    1. Entonces, la aplicación tiene un registro de aplicación, esto solo tiene nombre de usuario / recurso, no contraseña
    2. Y, team1 tiene un registro de aplicación, con nombre de usuario / clientid1 y contraseña / clientsecret1
    3. Y, team2 tiene un registro de aplicación, con nombre de usuario / clientid2 y contraseña / clientsecret2

    dado que application, team1, team2 están todos bajo el mismo “directorio activo” / house, podemos acceder entre nosotros, así que

    1. La aplicación / recurso solo tiene un nombre de usuario (digamos A)
    2. usando el nombre de usuario y contraseña del equipo1 (clientid / clientsecret) puede acceder a la aplicación / recurso (por ejemplo, B)
    3. y, usando el nombre de usuario y contraseña del equipo2 (clientid / clientsecret) puede acceder a la aplicación / recurso (por ejemplo, C)

    ahora volviendo a las partes de pregunta n. ° 3 y n. ° 4:

    1. “El recurso asegurado no debe verse comprometido. Es decir, por ejemplo, debe estar bloqueado de forma segura ”
    1. obviamente, de ( A ) anterior, no tenemos contraseña para el recurso, por lo que es seguro
  • “Si se ve comprometido, no se debe afectar a todos los clientes, es decir, el daño debe ser mínimo”
    1. esto se logra desde ( B & C ) porque si el nombre de usuario y la contraseña de B se filtran a Internet, solo B se ve afectado, no C, por lo que el daño es solo para B, no para C, el equipo de C continúa trabajando normalmente.
    2. también, “debería poder asegurarlo nuevamente, sin mucha dificultad e inmediatamente”, de modo que cuando B se ve comprometida / se filtró su contraseña, podemos eliminar esa contraseña y regenerarla, para que B tenga un nuevo secreto de cliente.

    Arriba está el concepto Outh2 detrás del servicio a servicio usando Azure Active Directory.

    Esta es una extensión de mi github escribiendo aquí: manoharreddyporeddy / application-security

    Espero que haya ayudado.