>Java >java지도 시간 >SpringBoot가 QR 코드 스캔 로그인을 구현하는 방법

SpringBoot가 QR 코드 스캔 로그인을 구현하는 방법

PHPz
PHPz앞으로
2023-05-10 20:25:111645검색

1. 휴대폰으로 QR코드를 스캔하여 로그인하는 원리

QR코드를 스캔하여 로그인하는 것은 OAuth3.0 프로토콜을 기반으로 인증된 로그인 방식입니다. 이러한 방식으로 애플리케이션은 사용자의 사용자 이름과 비밀번호를 얻을 필요가 없으며 사용자 인증만 얻을 수 있습니다. QR 코드를 스캔하여 로그인하는 작업은 주로 다음 단계로 구성됩니다.

  • 애플리케이션에서 QR 코드를 생성하고 사용자에게 QR 코드를 표시합니다.

  • 사용자는 코드 스캔 도구를 사용하여 QR 코드를 스캔하고 인증 페이지에서 승인합니다.

  • 사용자가 승인하면 애플리케이션에서 승인 코드를 받게 됩니다.

  • 애플리케이션은 이 인증 코드를 사용하여 인증 서버에 액세스 토큰을 요청합니다.

  • 인증 서버는 애플리케이션에 액세스 토큰을 반환합니다.

  • 애플리케이션은 이 액세스 토큰을 사용하여 리소스 서버에 액세스합니다.

SpringBoot가 QR 코드 스캔 로그인을 구현하는 방법

위 단계를 통해 QR 코드 스캔 로그인은 사용자의 빠른 로그인을 실현하고 사용자의 보안과 개인 정보 보호를 보장할 수 있습니다.

2. SpringBoot가 QR 코드 스캔 및 로그인을 구현하는 방법

SpringBoot에서는 Spring Security OAuth3.0을 사용하여 QR 코드 스캔 및 로그인 기능을 구현할 수 있습니다. Spring Security OAuth3.0은 인증 서버 및 리소스 서버 구현을 제공하는 OAuth3.0 프로토콜을 기반으로 하는 보안 프레임워크입니다. 다음으로 Spring Security OAuth3.0을 사용하여 QR 코드 스캔 로그인을 구현하는 방법을 소개하겠습니다.

종속성 추가
먼저 pom.xml 파일에 Spring Security OAuth3.0 종속성을 추가해야 합니다.

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

인증 서버 구성
SpringBoot에서는 @Configuration 주석을 통해 인증 서버를 구성할 수 있습니다. 다음은 간단한 인증 서버 구성 예입니다.

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

위 코드에서 @EnableAuthorizationServer 주석을 사용하여 인증 서버를 활성화합니다. 그런 다음 @Configuration 주석을 통해 클래스를 구성 클래스로 지정합니다. 구성() 메소드에서는 인증 클라이언트가 구성되고 인증 유형은 인증_코드로 지정됩니다. 인증 서버는 inMemory() 메소드를 사용하여 클라이언트 ID, 클라이언트 키, 인증 유형, 인증 범위, 리디렉션 주소 및 기타 정보를 포함한 클라이언트 정보를 지정합니다. 구성() 메소드에서는 사용자의 신원 정보를 확인하기 위해 AuthenticationManager도 구성해야 합니다.

리소스 서버 구성

SpringBoot에서는 @Configuration 주석을 통해 리소스 서버를 구성할 수 있습니다. 다음은 간단한 리소스 서버 구성 예입니다.

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

위 코드에서 @EnableResourceServer 주석을 사용하여 리소스 서버를 활성화합니다. 그런 다음 @Configuration 주석을 통해 클래스를 구성 클래스로 지정합니다. configure() 메소드에서는 리소스 서버의 보안 정책을 구성하고, antMatchers() 메소드를 사용하여 인증이 필요한 인터페이스를 지정하고,permitAll() 메소드를 사용하여 다른 인터페이스에 익명으로 접근할 수 있도록 지정합니다. configure() 메서드에서는 리소스 서버의 리소스 ID도 구성해야 합니다.

클라이언트 구성

SpringBoot에서는 구성 파일을 통해 클라이언트를 구성할 수 있습니다. 다음은 간단한 클라이언트 구성 예입니다.

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

위 코드에서 클라이언트 구성 정보는 security.oauth3.client 접두사를 통해 지정되며 클라이언트 ID, 클라이언트 키, 액세스 토큰 URI, 사용자 권한 부여 URI, 권한 범위 등이 포함됩니다. , 리디렉션 주소 및 기타 정보.

QR 코드 생성

SpringBoot에서는 타사 라이브러리를 사용하여 QR 코드를 생성할 수 있습니다. 다음은 간단한 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());
}

위 코드에서 @GetMapping 어노테이션을 사용하여 메소드를 GET 요청 처리 메소드로 지정하고, 요청 경로 "/qrcode"를 지정하여 메소드를 매핑합니다. getQRCode() 메서드에서 먼저 인증 요청의 URL을 생성하고 타사 라이브러리를 사용하여 QR 코드 이미지를 생성합니다. 마지막으로 생성된 QR 코드 이미지는 바이트 배열 형태로 클라이언트에 반환됩니다.

QR 코드를 스캔하여 로그인
SpringBoot에서 WebSocket을 사용하여 QR 코드 로그인 기능을 구현할 수 있습니다. 다음은 간단한 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);
        }
    }
}

위 코드에서 @EnableWebSocket 주석을 사용하여 WebSocket 지원을 활성화합니다. 그런 다음 @Configuration 주석을 통해 클래스를 구성 클래스로 지정합니다. RegisterWebSocketHandlers() 메소드에는 WebSocket 프로세서를 등록하고 해당 프로세서의 요청 경로를 지정합니다. QRCodeHandler 클래스에서는 WebSocket 프로세서의 비즈니스 로직이 구현됩니다. handlerTextMessage() 메소드에서는 QR 코드를 스캔한 후 생성된 토큰을 키로 사용하고 WebSocket 세션 객체를 Map에 저장합니다. 동일한 토큰에 해당하는 WebSocket 세션 객체가 이미 존재한다면 사용자가 코드를 스캔하여 인증을 통과했다는 의미입니다. 이때 두 WebSocket 세션 객체는 인증이 통과되었음을 서로에게 알려야 합니다. 동일한 토큰에 해당하는 WebSocket 세션 객체가 존재하지 않는 경우 WebSocket 세션 객체가 Map에 저장됩니다. afterConnectionClosed() 메서드에서 닫힌 WebSocket 세션 객체를 제거합니다.

클라이언트 콜백
SpringBoot에서는 @Controller 주석을 사용하여 클라이언트 콜백 기능을 구현할 수 있습니다. 다음은 간단한 콜백 예시입니다:

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

위 내용은 SpringBoot가 QR 코드 스캔 로그인을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제