ホームページ  >  記事  >  Java  >  SpringBoot が QR コード スキャン ログインを実装する方法

SpringBoot が QR コード スキャン ログインを実装する方法

PHPz
PHPz転載
2023-05-10 20:25:111592ブラウズ

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 アノテーションを使用してクラスを構成クラスとして指定します。 configure() メソッドでは、認可クライアントが構成され、認可タイプが authorization_code として指定されます。認可サーバーは、inMemory() メソッドを使用して、クライアント ID、クライアント キー、認可タイプ、認可スコープ、リダイレクト アドレス、その他の情報を含むクライアント情報を指定します。 configure() メソッドでは、ユーザーの 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

上記のコードでは、クライアント ID、クライアント キー、アクセス トークンなどのクライアント構成情報が security.oauth3.client プレフィックスによって指定されています。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 コード画像がバイト配列の形式でクライアントに返されます。

スキャンコードログイン
SpringBootではWebSocketを利用してスキャンコードログイン機能を実装できます。以下は、簡単な 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 プロセッサのビジネス ロジックが実装されています。 handleTextMessage() メソッドでは、QR コードのスキャン後に生成されたトークンをキーとして使用し、WebSocket セッション オブジェクトをマップに保存します。同じトークンに対応する WebSocket セッション オブジェクトが既に存在する場合は、ユーザーがコードをスキャンして認証を通過したことを意味するため、このとき 2 つの 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。