Rumah  >  Artikel  >  Java  >  Bagaimana SpringBoot melaksanakan log masuk pengimbasan kod QR

Bagaimana SpringBoot melaksanakan log masuk pengimbasan kod QR

PHPz
PHPzke hadapan
2023-05-10 20:25:111592semak imbas

1. Prinsip mengimbas kod QR untuk log masuk dengan telefon bimbit

Imbas kod QR untuk log masuk ialah kaedah log masuk yang dibenarkan berdasarkan protokol OAuth3.0. Dengan cara ini, aplikasi tidak perlu mendapatkan nama pengguna dan kata laluan pengguna, hanya kebenaran pengguna. Terdapat beberapa langkah utama untuk log masuk dengan mengimbas kod QR:

  • Aplikasi menjana kod QR dan memaparkan kod QR kepada pengguna.

  • Pengguna menggunakan alat pengimbasan kod untuk mengimbas kod QR dan membenarkannya pada halaman kebenaran.

  • Selepas pengguna membenarkan aplikasi, aplikasi akan mendapatkan kod kebenaran.

  • Aplikasi menggunakan kod kebenaran ini untuk meminta token akses daripada pelayan kebenaran.

  • Pelayan kebenaran mengembalikan token akses kepada aplikasi.

  • Token akses digunakan oleh aplikasi untuk mengakses pelayan sumber.

Bagaimana SpringBoot melaksanakan log masuk pengimbasan kod QR

Melalui langkah di atas, log masuk pengimbasan kod QR boleh merealisasikan log masuk pantas pengguna dan memastikan keselamatan dan privasi pengguna.

2. Cara SpringBoot melaksanakan log masuk pengimbasan kod QR

Dalam SpringBoot, Spring Security OAuth3.0 boleh digunakan untuk melaksanakan fungsi log masuk pengimbasan kod QR. Spring Security OAuth3.0 ialah rangka kerja keselamatan berdasarkan protokol OAuth3.0, yang menyediakan pelaksanaan pelayan kebenaran dan pelayan sumber. Seterusnya, saya akan memperkenalkan kepada anda cara menggunakan Spring Security OAuth3.0 untuk melaksanakan log masuk pengimbasan kod QR.

Tambah kebergantungan
Pertama, anda perlu menambah kebergantungan Spring Security OAuth3.0 dalam fail pom.xml:

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

Konfigurasikan pelayan kebenaran
Dalam SpringBoot, anda boleh lulus anotasi @Configuration untuk mengkonfigurasi pelayan kebenaran. Berikut ialah contoh konfigurasi pelayan kebenaran yang mudah:

@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);
}
}

Dalam kod di atas, gunakan anotasi @EnableAuthorizationServer untuk mendayakan pelayan kebenaran. Kemudian, tentukan kelas sebagai kelas konfigurasi melalui anotasi @Configuration. Dalam kaedah configure(), klien kebenaran dikonfigurasikan dan jenis kebenaran ditentukan sebagai authorization_code. Pelayan kebenaran menggunakan kaedah inMemory() untuk menentukan maklumat klien, termasuk ID klien, kunci klien, jenis kebenaran, skop kebenaran, alamat ubah hala dan maklumat lain. Dalam kaedah configure(), anda juga perlu mengkonfigurasi AuthenticationManager untuk mengesahkan maklumat identiti pengguna.

Mengkonfigurasi pelayan sumber

Dalam SpringBoot, pelayan sumber boleh dikonfigurasikan melalui anotasi @Configuration. Berikut ialah contoh konfigurasi pelayan sumber mudah:

@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");
}
}

Dalam kod di atas, gunakan anotasi @EnableResourceServer untuk mendayakan pelayan sumber. Kemudian, tentukan kelas sebagai kelas konfigurasi melalui anotasi @Configuration. Dalam kaedah configure(), dasar keselamatan pelayan sumber dikonfigurasikan, kaedah antMatchers() digunakan untuk menentukan antara muka yang memerlukan pengesahan, dan kaedah permitAll() digunakan untuk menentukan bahawa antara muka lain boleh diakses tanpa nama. Dalam kaedah configure(), anda juga perlu mengkonfigurasi ID sumber pelayan sumber.

Mengkonfigurasi klien

Dalam SpringBoot, klien boleh dikonfigurasikan melalui fail konfigurasi. Berikut ialah contoh konfigurasi klien mudah:

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

Dalam kod di atas, maklumat konfigurasi klien ditentukan melalui awalan security.oauth3.client, termasuk ID klien, kunci klien dan URI token akses URI kebenaran, skop kebenaran, alamat ubah hala dan maklumat lain.

Jana kod QR

Dalam SpringBoot, anda boleh menggunakan perpustakaan pihak ketiga untuk menjana kod QR. Berikut ialah contoh mudah penjanaan kod 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());
}

Dalam kod di atas, gunakan anotasi @GetMapping untuk menentukan kaedah sebagai kaedah pemprosesan permintaan GET, dan petakan kaedah dengan menentukan laluan permintaan "/ kaedah qrcode". Dalam kaedah getQRCode(), mula-mula jana URL permintaan kebenaran dan gunakan perpustakaan pihak ketiga untuk menjana imej kod QR. Akhirnya, imej kod QR yang dihasilkan dikembalikan kepada klien dalam bentuk tatasusunan bait.

Imbas kod QR untuk log masuk
Dalam SpringBoot, WebSocket boleh digunakan untuk melaksanakan fungsi log masuk kod QR. Berikut ialah contoh log masuk kod QR ringkas:

@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);
        }
    }
}

Dalam kod di atas, gunakan anotasi @EnableWebSocket untuk mendayakan sokongan WebSocket. Kemudian, tentukan kelas sebagai kelas konfigurasi melalui anotasi @Configuration. Dalam kaedah registerWebSocketHandlers(), pemproses WebSocket didaftarkan dan laluan permintaan pemproses ditentukan. Dalam kelas QRCodeHandler, logik perniagaan pemproses WebSocket dilaksanakan. Dalam kaedah handleTextMessage(), gunakan token yang dijana selepas mengimbas kod QR sebagai kunci dan simpan objek sesi WebSocket dalam Peta. Jika objek sesi WebSocket yang sepadan dengan token yang sama sudah wujud, ini bermakna pengguna telah mengimbas kod dan lulus pengesahan Pada masa ini, kedua-dua objek sesi WebSocket perlu memberitahu satu sama lain bahawa pengesahan telah berlalu. Jika objek sesi WebSocket yang sepadan dengan token yang sama tidak wujud, objek sesi WebSocket disimpan dalam Peta. Dalam kaedah afterConnectionClosed(), alih keluar objek sesi WebSocket tertutup.

Panggil balik pelanggan
Dalam SpringBoot, anda boleh menggunakan anotasi @Controller untuk melaksanakan fungsi panggil balik pelanggan. Berikut ialah contoh panggilan balik yang mudah:

@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和客户端秘钥等参数作为请求体发送。在获取到访问令牌之后,重定向到应用程序的主页。

Atas ialah kandungan terperinci Bagaimana SpringBoot melaksanakan log masuk pengimbasan kod QR. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam