Colección de citas famosas - Consulta de diccionarios - Inicio de sesión único JWT y Spring Security OAuth

Inicio de sesión único JWT y Spring Security OAuth

Al utilizar JWT con Spring Security OAuth2, puede evitar la programación remota de servicios de autenticación y autorización para cada solicitud. El servidor de recursos solo necesita autenticarse una vez desde el servidor de autorización y devolver el JWT. El JWT devuelto contiene toda la información del usuario, incluida la información de permisos.

1. ¿Qué es JWT?

JSON Web Token (JWT) es un estándar abierto (RFC 7519 define un estándar compacto y autónomo diseñado para empaquetar la información de cada sujeto). un objeto JSON. La información del sujeto se cifra y se verifica mediante firmas digitales. El algoritmo HMAC o el algoritmo RSA (cifrado asimétrico de clave pública/clave privada) se utilizan a menudo para firmar JWT, que es altamente seguro.

2. La estructura de JWT

La estructura de JWT consta de tres partes: Header (encabezado), Payload (carga útil) y Signature (firma). Entonces, el formato habitual de JWT es xxxxx.yyyyy.zzzzz.

2.1. Encabezado

El encabezado generalmente consta de dos partes: el tipo de token (es decir, JWT) y el tipo de algoritmo utilizado, como HMAC, SHA256 y RSA. Por ejemplo:

Utilice la codificación Base64 del encabezado como primera parte del JWT. No se recomienda colocar información confidencial en el encabezado del JWT.

2.2. Carga útil

El siguiente es un ejemplo de la parte de carga útil:

Utilice la codificación Base64 de la carga útil como segunda parte del JWT. No se recomienda utilizar la carga útil en el JWT.

2.3. Firma

Para crear la parte de la firma, debe utilizar la clave secreta para cifrar el encabezado y la carga útil codificados en Base64. La fórmula del algoritmo de cifrado es la siguiente:

Las firmas se pueden utilizar para verificar que un mensaje no ha sido alterado durante la entrega. Para los tokens firmados con una clave privada, también puede verificar que el remitente del JWT es quien dice ser.

3. Cómo funciona JWT

Una vez que el cliente obtiene el JWT, para cada solicitud posterior, no es necesario utilizar el servicio de autorización para determinar el usuario de la solicitud y el nombre del usuario. permisos de identidad. En un sistema de microservicio, JWT se puede utilizar para implementar el inicio de sesión único. El diagrama de flujo de autenticación es el siguiente:

4. Estructura del proyecto del caso

El diagrama de principios de ingeniería es el siguiente:

5. Construir un servicio de autorización de servicio de autenticación

UserServiceDetail.java

UserRepository.java

La clase de entidad Usuario es la misma que en el artículo anterior. Necesita implementar la interfaz UserDetails y la entidad. El rol de clase necesita implementar la interfaz GrantedAuthority.

User.java

Role.java

Para generar el archivo jks, debe utilizar la herramienta Java keytool para asegurarse de que las variables de entorno de Java estén bien. Ingrese el comando de la siguiente manera:

p>

Entre ellos, la opción -alias es el alias, -keyalg es el algoritmo de cifrado, -keypass y -storepass son las opciones de contraseña, -keystore es. el nombre del archivo jks y -validity es el tiempo de vencimiento del archivo jks configurado (unidad: días).

El archivo jks generado se utiliza como una clave privada, que solo puede ser retenida por el servicio de autorización y utilizada para el cifrado para generar JWT. Simplemente coloque el archivo jks generado en el directorio src/main/resource del módulo auth-service.

Para servicios de recursos como el servicio de usuario, se debe utilizar la clave pública de jks para descifrar el JWT. El comando para obtener la clave pública del archivo jks es el siguiente:

Este comando requiere la instalación de la dirección de descarga de openSSL y luego configura manualmente el directorio donde se encuentra el openssl.exe instalado en el entorno. variable.

Después de ingresar la contraseña fzp123, se muestra mucha información. Solo necesita extraer la CLAVE PÚBLICA, como se muestra a continuación:

Cree un nuevo archivo public.cert y copie el. información de clave pública anterior al archivo public.cert y guárdelo. Y coloque el archivo en el directorio src/main/resources de servicios de recursos como servicio de usuario. En este punto, se completa el servicio de autenticación.

Cuando maven compila el proyecto, puede compilar el archivo jks, lo que hace que el archivo jks sea confuso y, en última instancia, inutilizable. Es necesario agregar el siguiente contenido al archivo pom.xml:

6. Cree un servicio de recursos de servicio de usuario

Inyecte un Bean de tipo JwtTokenStore, inicialice el convertidor JWT JwtAccessTokenConverter y configúrelo para descifrar la clave pública del JWT.

Configure la gestión de autenticación de los servicios de recursos. Además de las interfaces de registro e inicio de sesión, otras interfaces requieren autenticación.

Cree una nueva clase de configuración GlobalMethodSecurityConfig y habilite la verificación de seguridad a nivel de método a través de la anotación @EnableGlobalMethodSecurity.

Copie las tres clases Usuario, Rol y UserRepository del módulo auth-service a este módulo. Escriba un método para insertar usuarios en el UserService de la capa de Servicio. El código es el siguiente:

Configure la clase de herramienta BPwdEncoderUtil para el cifrado de contraseñas de usuarios:

Implemente una interfaz API de registro de usuarios. /usuario/registro, el código es el siguiente:

Agregue un método login() en UserServiceDetail de la capa de Servicio, el código es el siguiente:

AuthServiceClient como cliente Feign, A través de la interfaz de servicio de autenticación /oauth/ Llamada remota del token para obtener JWT.

En la interfaz API que solicita /oauth/token, debe pasar la información de autorización, el tipo de autenticación (grant_type), el nombre de usuario (nombre de usuario) y la contraseña (contraseña) en el encabezado de la solicitud. El código es el siguiente:

.

Entre ellos, AuthServiceHystrix Es el disyuntor de AuthServiceClient. El código es el siguiente:

JWT contiene información como access_token, token_type y refresco_token. p> UserLoginDTO contiene un usuario y un atributo de miembro JWT para la entidad que devuelve datos:

Clase de excepción de inicio de sesión UserLoginException

Clase de aspecto de manejo de excepciones global ExceptionHandle

Agregar un La nueva interfaz API de inicio de sesión en la clase UserController de la capa web /user/login es la siguiente:

Inicie los tres servicios eureka-service, auth-service y user-service en secuencia.

7. Utilice Postman para probar.

El acceso está denegado porque no hay permiso. Agregue manualmente permisos ROLE_ADMIN a la base de datos y asócielos con el usuario. Vuelva a iniciar sesión y obtenga el JWT, solicitando la interfaz /user/foo nuevamente.

En este caso, el usuario obtiene el JWT cifrado del servicio de autorización a través de la interfaz de inicio de sesión. Una vez que el usuario obtiene con éxito el JWT, debe transportar el JWT en cada solicitud posterior para acceder al servicio de recursos. El servicio de recursos descifra el JWT a través de la clave pública. Después de un descifrado exitoso, se puede obtener la información del usuario y la información de permisos para determinar quién es el usuario correspondiente al JWT y qué permisos tiene.

Obtenga un Token una vez y úselo varias veces. El servicio de recursos ya no accede al servicio de autorización cada vez. Ya no se accede a la información del usuario y la información de permiso del usuario correspondiente al Token.

Una vez que la información del usuario o la información de permiso cambia, la información relevante almacenada en el Token no cambia y debe iniciar sesión nuevamente para obtener un nuevo Token. Incluso si se vuelve a adquirir el Token, si el Token original no ha caducado, aún se puede utilizar. Un método de mejora es almacenar en caché el token obtenido en la puerta de enlace después de iniciar sesión correctamente. Si los permisos del usuario cambian, elimine el token almacenado en caché en la puerta de enlace. Cuando la solicitud pasa a través de la puerta de enlace, se determina si el token solicitado existe en la memoria caché. Si el token no existe en la memoria caché, se solicita al usuario que inicie sesión nuevamente.