Maison  >  Article  >  Java  >  Comment SpringBoot implémente la connexion par analyse de code QR

Comment SpringBoot implémente la connexion par analyse de code QR

PHPz
PHPzavant
2023-05-10 20:25:111595parcourir

1. Le principe de la connexion en scannant le code QR avec votre téléphone portable

Le scan du code QR pour vous connecter est une méthode de connexion autorisée basée sur le protocole OAuth3.0. De cette manière, l'application n'a pas besoin d'obtenir le nom d'utilisateur et le mot de passe de l'utilisateur, mais uniquement l'autorisation de l'utilisateur. Il y a principalement les étapes suivantes pour scanner le QR code pour se connecter :

  • L'application génère un QR code et affiche le QR code à l'utilisateur.

  • Les utilisateurs utilisent l'outil de numérisation de code pour scanner le code QR et autoriser sur la page d'autorisation.

  • Une fois que l'utilisateur a autorisé l'application, l'application obtiendra un code d'autorisation.

  • L'application utilise ce code d'autorisation pour demander un jeton d'accès au serveur d'autorisation.

  • Le serveur d'autorisation renvoie un jeton d'accès à l'application.

  • L'application utilise ce jeton d'accès pour accéder au serveur de ressources.

Comment SpringBoot implémente la connexion par analyse de code QR

Grâce aux étapes ci-dessus, la connexion par numérisation de code QR peut réaliser la connexion rapide de l'utilisateur et garantir la sécurité et la confidentialité de l'utilisateur.

2. Comment SpringBoot implémente l'analyse et la connexion du code QR

Dans SpringBoot, Spring Security OAuth3.0 peut être utilisé pour implémenter la fonction d'analyse et de connexion du code QR. Spring Security OAuth3.0 est un framework de sécurité basé sur le protocole OAuth3.0, qui assure la mise en œuvre d'un serveur d'autorisation et d'un serveur de ressources. Ensuite, je vais vous présenter comment utiliser Spring Security OAuth3.0 pour implémenter la connexion par numérisation de code QR.

Ajouter des dépendances
Tout d'abord, vous devez ajouter la dépendance Spring Security OAuth3.0 dans le fichier pom.xml :

<dependency>
    <groupId>org.springframework.security.oauth</groupId>
    <artifactId>spring-security-oauth3</artifactId>
    <version>2.4.0</version>
</dependency>

Configurer le serveur d'autorisation
Dans SpringBoot, vous pouvez configurer le serveur d'autorisation via l'annotation @Configuration. Voici un exemple simple de configuration de serveur d'autorisation :

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("client")
                .secret("{noop}secret")
                .authorizedGrantTypes("authorization_code")
                .scopes("read", "write")
                .redirectUris("http://localhost:8080/callback");
    }

    @Override
    public void configure(AuthorizationServerEndpoints endpoints) throws Exception {
    endpoints.authenticationManager(authenticationManager);
}
}

Dans le code ci-dessus, utilisez l'annotation @EnableAuthorizationServer pour activer le serveur d'autorisation. Ensuite, spécifiez la classe en tant que classe de configuration via l'annotation @Configuration. Dans la méthode configure(), un client d'autorisation est configuré et le type d'autorisation est spécifié comme authorisation_code. Le serveur d'autorisation utilise la méthode inMemory() pour spécifier les informations client, notamment l'ID client, la clé client, le type d'autorisation, la portée de l'autorisation, l'adresse de redirection et d'autres informations. Dans la méthode configure(), vous devez également configurer AuthenticationManager pour vérifier les informations d'identité de l'utilisateur.

Configurer le serveur de ressources

Dans SpringBoot, vous pouvez configurer le serveur de ressources via l'annotation @Configuration. Voici un exemple simple de configuration de serveur de ressources :

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
  @Override
public void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .antMatchers("/api/**").authenticated()
            .anyRequest().permitAll();
}

@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
    resources.resourceId("resource");
}
}

Dans le code ci-dessus, utilisez l'annotation @EnableResourceServer pour activer le serveur de ressources. Ensuite, spécifiez la classe en tant que classe de configuration via l'annotation @Configuration. Dans la méthode configure(), la politique de sécurité du serveur de ressources est configurée, la méthode antMatchers() est utilisée pour spécifier les interfaces qui nécessitent une authentification et la méthode permitAll() est utilisée pour spécifier que d'autres interfaces sont accessibles de manière anonyme. Dans la méthode configure(), vous devez également configurer l'ID de ressource du serveur de ressources.

Configuration du client

Dans SpringBoot, le client peut être configuré via le fichier de configuration. Voici un exemple simple de configuration client :

security:
oauth3:
client:
clientId: client
clientSecret: secret
accessTokenUri: http://localhost:8080/oauth/token
userAuthorizationUri: http://localhost:8080/oauth/authorize
scope: read,write
redirectUri: http://localhost:8080/callback

Dans le code ci-dessus, les informations de configuration client sont spécifiées via le préfixe security.oauth3.client, y compris l'ID client, la clé client, l'URI du jeton d'accès et l'URI d'autorisation utilisateur, la portée de l'autorisation. , rediriger l'adresse et d'autres informations.

Générer un code QR

Dans SpringBoot, vous pouvez utiliser des bibliothèques tierces pour générer des codes QR. Voici un exemple simple de génération de code QR :

@GetMapping("/qrcode")
public ResponseEntity<byte[]> getQRCode() throws IOException, WriterException {
String codeUrl = "http://localhost:8080/oauth/authorize?response_type=code&client_id=client&redirect_uri=http://localhost:8080/callback";
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
BitMatrix bitMatrix = new MultiFormatWriter().encode(codeUrl, BarcodeFormat.QR_CODE, 200, 200);
MatrixToImageWriter.writeToStream(bitMatrix, "png", outputStream);
return ResponseEntity.ok().contentType(MediaType.IMAGE_PNG).body(outputStream.toByteArray());
}

Dans le code ci-dessus, utilisez l'annotation @GetMapping pour spécifier la méthode en tant que méthode de traitement de requête GET et mappez la méthode en spécifiant le chemin de requête "/qrcode". Dans la méthode getQRCode(), générez d'abord l'URL de la demande d'autorisation et utilisez une bibliothèque tierce pour générer une image de code QR. Enfin, l'image du code QR générée est renvoyée au client sous la forme d'un tableau d'octets.

Scannez le code QR pour vous connecter
Dans SpringBoot, WebSocket peut être utilisé pour implémenter la fonction de connexion par code QR. Voici un exemple simple de connexion par code QR :

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new QRCodeHandler(), "/qrcodeHandler");
    }

    class QRCodeHandler extends TextWebSocketHandler {

        private final Map<String, WebSocketSession> sessions = new ConcurrentHashMap<>();

        @Override
        public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
            String token = message.getPayload();
            if (sessions.containsKey(token)) {
                WebSocketSession clientSession = sessions.get(token);
                clientSession.sendMessage(new TextMessage("authenticated"));
                session.sendMessage(new TextMessage("authenticated"));
            } else {
                sessions.put(token, session);
            }
        }

        @Override
        public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
            sessions.values().remove(session);
        }
    }
}

Dans le code ci-dessus, utilisez l'annotation @EnableWebSocket pour activer la prise en charge de WebSocket. Ensuite, spécifiez la classe en tant que classe de configuration via l'annotation @Configuration. Dans la méthode registerWebSocketHandlers(), un processeur WebSocket est enregistré et le chemin de requête du processeur est spécifié. Dans la classe QRCodeHandler, la logique métier du processeur WebSocket est implémentée. Dans la méthode handleTextMessage(), utilisez le jeton généré après avoir scanné le code QR comme clé et enregistrez l'objet de session WebSocket dans la carte. Si l'objet de session WebSocket correspondant au même jeton existe déjà, cela signifie que l'utilisateur a scanné le code et réussi l'authentification. A ce moment, les deux objets de session WebSocket doivent se notifier que l'authentification a réussi. Si l'objet de session WebSocket correspondant au même token n'existe pas, l'objet de session WebSocket est enregistré dans la Map. Dans la méthode afterConnectionClosed(), supprimez l'objet de session WebSocket fermé.

Rappel client
Dans SpringBoot, vous pouvez utiliser l'annotation @Controller pour implémenter la fonction de rappel client. Voici un exemple de rappel simple :

@Controller
public class CallbackController {

    @Autowired
    private OAuth3RestTemplate restTemplate;

    @GetMapping("/callback")
    public String callback(@RequestParam("code") String code) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
        params.add("grant_type", "authorization_code");
        params.add("code", code);
        params.add("redirect_uri", "http://localhost:8080/callback");
        params.add("client_id", "client");
        params.add("client_secret", "secret");
        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(params, headers);
        OAuth3AccessToken token = restTemplate.postForObject("http://localhost:8080/oauth/token", request, OAuth3AccessToken.class);
        return "redirect:/home";
    }
}

在上面的代码中,使用@Controller注解来指定该类为一个控制器。在callback()方法中,首先使用OAuth3RestTemplate来发送POST请求获取访问令牌,并将授权码、回调URL、客户端ID和客户端秘钥等参数作为请求体发送。在获取到访问令牌之后,重定向到应用程序的主页。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer