Das Scannen des QR-Codes zum Anmelden ist eine autorisierte Anmeldemethode, die auf dem OAuth3.0-Protokoll basiert. Auf diese Weise muss die Anwendung nicht den Benutzernamen und das Passwort des Benutzers einholen, sondern nur die Autorisierung des Benutzers. Es gibt mehrere Hauptschritte zum Anmelden durch Scannen des QR-Codes:
Die Anwendung generiert einen QR-Code und zeigt den QR-Code dem Benutzer an.
Benutzer verwenden das Code-Scan-Tool, um den QR-Code zu scannen und auf der Autorisierungsseite zu autorisieren.
Nach der Autorisierung durch den Benutzer erhält die Anwendung einen Autorisierungscode.
Die Anwendung verwendet diesen Autorisierungscode, um ein Zugriffstoken vom Autorisierungsserver anzufordern.
Der Autorisierungsserver gibt ein Zugriffstoken an die Anwendung zurück.
Die Anwendung verwendet dieses Zugriffstoken, um auf den Ressourcenserver zuzugreifen.
Durch die oben genannten Schritte kann die QR-Code-Scan-Anmeldung eine schnelle Anmeldung des Benutzers ermöglichen und die Sicherheit und den Datenschutz des Benutzers gewährleisten .
In SpringBoot können Sie Spring Security OAuth3.0 verwenden, um die Anmeldefunktion zum Scannen von QR-Codes zu implementieren. Spring Security OAuth3.0 ist ein Sicherheitsframework, das auf dem OAuth3.0-Protokoll basiert und die Implementierung eines Autorisierungsservers und eines Ressourcenservers bereitstellt. Als Nächstes werde ich Ihnen vorstellen, wie Sie Spring Security OAuth3.0 verwenden, um die QR-Code-Scan-Anmeldung zu implementieren.
Abhängigkeiten hinzufügen
Zuerst müssen Sie die Abhängigkeit von Spring Security OAuth3.0 im POM hinzufügen. Sie können den Autorisierungsserver über die Annotation @Configuration konfigurieren. Hier ist ein einfaches Beispiel für die Konfiguration eines Autorisierungsservers:
<dependency> <groupId>org.springframework.security.oauth</groupId> <artifactId>spring-security-oauth3</artifactId> <version>2.4.0</version> </dependency>
Verwenden Sie im obigen Code die Annotation @EnableAuthorizationServer, um den Autorisierungsserver zu aktivieren. Geben Sie dann die Klasse über die Annotation @Configuration als Konfigurationsklasse an. In der Methode configure() wird ein Autorisierungsclient konfiguriert und der Autorisierungstyp als „authorization_code“ angegeben. Der Autorisierungsserver verwendet die Methode inMemory(), um Clientinformationen anzugeben, einschließlich Client-ID, Clientschlüssel, Autorisierungstyp, Autorisierungsbereich, Umleitungsadresse und andere Informationen. In der Methode configure() müssen Sie auch den AuthenticationManager konfigurieren, um die Identitätsinformationen des Benutzers zu überprüfen.
@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); } }Verwenden Sie im obigen Code die Annotation @EnableResourceServer, um den Ressourcenserver zu aktivieren. Geben Sie dann die Klasse über die Annotation @Configuration als Konfigurationsklasse an. In der Methode configure () wird die Sicherheitsrichtlinie des Ressourcenservers konfiguriert, mit der Methode antMatchers () werden die Schnittstellen angegeben, die eine Authentifizierung erfordern, und mit der Methode „permitAll ()“ wird angegeben, dass auf andere Schnittstellen anonym zugegriffen werden kann. In der Methode configure() müssen Sie auch die Ressourcen-ID des Ressourcenservers konfigurieren. Client konfigurierenIn SpringBoot kann der Client über die Konfigurationsdatei konfiguriert werden. Das Folgende ist ein einfaches Client-Konfigurationsbeispiel:
@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"); } }Im obigen Code werden die Client-Konfigurationsinformationen durch das Präfix security.oauth3.client angegeben, einschließlich Client-ID, Client-Schlüssel, Zugriffstoken-URI und Benutzer Autorisierungs-URI, Autorisierungsumfang, Weiterleitungsadresse und andere Informationen. QR-Code generierenIn SpringBoot können Sie eine Bibliothek eines Drittanbieters verwenden, um QR-Code zu generieren. Das Folgende ist ein einfaches Beispiel für die Generierung eines QR-Codes:
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/callbackVerwenden Sie im obigen Code die Annotation @GetMapping, um die Methode als GET-Anforderungsverarbeitungsmethode anzugeben, indem Sie den Anforderungspfad „/qrcode“ angeben. Ordnen Sie dies zu Verfahren. Generieren Sie in der Methode getQRCode() zunächst die URL der Autorisierungsanforderung und verwenden Sie eine Bibliothek eines Drittanbieters, um ein QR-Code-Bild zu generieren. Abschließend wird das generierte QR-Code-Bild in Form eines Byte-Arrays an den Client zurückgegeben. Scan-Code-Anmeldung
In SpringBoot kann WebSocket verwendet werden, um die Scan-Code-Anmeldefunktion zu implementieren. Das Folgende ist ein einfaches QR-Code-Anmeldebeispiel:
@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()); }
Verwenden Sie im obigen Code die Annotation @EnableWebSocket, um die WebSocket-Unterstützung zu aktivieren. Geben Sie dann die Klasse über die Annotation @Configuration als Konfigurationsklasse an. In der Methode registerWebSocketHandlers() wird ein WebSocket-Prozessor registriert und der Anforderungspfad des Prozessors angegeben. In der Klasse QRCodeHandler ist die Geschäftslogik des WebSocket-Prozessors implementiert. In der Methode handleTextMessage() wird das nach dem Scannen des QR-Codes generierte Token als Schlüssel verwendet und das WebSocket-Sitzungsobjekt in der Map gespeichert. Wenn das WebSocket-Sitzungsobjekt, das demselben Token entspricht, bereits vorhanden ist, bedeutet dies, dass der Benutzer den Code gescannt und die Authentifizierung bestanden hat. Zu diesem Zeitpunkt müssen sich die beiden WebSocket-Sitzungsobjekte gegenseitig darüber informieren, dass die Authentifizierung erfolgreich war. Wenn das WebSocket-Sitzungsobjekt, das demselben Token entspricht, nicht vorhanden ist, wird das WebSocket-Sitzungsobjekt in der Karte gespeichert. Entfernen Sie in der Methode afterConnectionClosed() das geschlossene WebSocket-Sitzungsobjekt.
In SpringBoot können Sie die Annotation @Controller verwenden, um die Rückruffunktion des Clients zu implementieren. Hier ist ein einfaches Rückrufbeispiel:
@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和客户端秘钥等参数作为请求体发送。在获取到访问令牌之后,重定向到应用程序的主页。
Das obige ist der detaillierte Inhalt vonSo implementiert SpringBoot die QR-Code-Scan-Anmeldung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!