https://d226lax1qjow5r.cloudfront.net/blog/blogposts/how-to-add-two-factor-authentication-using-java-and-spark/Blog_2FA_SparkJava_1200x600.png

JavaとSparkを使って二要素認証(2FA)を追加する方法

最終更新日 April 27, 2023

所要時間:3 分

この記事は2025年4月に更新されました。

サイバー脅威の増加に伴い、不正なサインアップからウェブアプリやサービスを保護することがますます重要になってきています。幸運なことに、二要素認証(2FA)は、ユーザーの携帯電話に送信される認証コードを要求することで、保護レイヤーを追加することができます。

このチュートリアルでは、Web アプリケーションやサービスに 2FA を実装する手順を説明します。まず、ユーザーに携帯電話番号の登録を求めるユーザーフレンドリーなウェブページを作成することから始めます。ユーザーの電話番号に SMS で確認コードを送信するために Verify APIを使います。.

ユーザーがコードを受け取ったら、それをアプリケーションに入力するだけで登録が完了します。

2FAは、多要素認証(MFA)の最も基本的で最も一般的なタイプです。JavaでMFAを追加することで、不正なサインアップの可能性を大幅に減らし、ユーザーデータの全体的なセキュリティを高めることができます。

より安全なアプリケーションの構築を始めよう!

前提条件

アプリケーションをビルドするには Java 8スパーク・ウェブ・フレームワーク.また、UIエレメント用の基本的なビューも作成します。 テンプレートエンジン.

その前に、以下のことを確認しておこう:

  • A Vonage APIアカウント

    API設定ページを開く API設定ページを開き、Vonage API KeyとSecretにアクセスしてください。両者は以下のスクリーンショットのように表示されます。APIキーはページの上部にあり、APIシークレットにアクセスするには、"Account secret "サブセクションを参照してください。

    注:以前に作成したAPIシークレットを覚えていない場合は、"+ Create new secret "をクリックし、安全に保存してください。

  • JDKまたはそれに相当するオープンソースの オープンJDK

  • グラドル(バージョン 3.4 以降) で依存関係を管理し、プロジェクトをビルドします。

始めるにあたって助けが必要な場合もご心配なく!私たちがサポートします。このチュートリアルのMark Lewinのソースコードは GitHub.

使用方法

以下に、Javaで多要素認証を追加するためのステップ・バイ・ステップの手順を、チュートリアルの例を含めて示します。このチュートリアルでは、SMS 2FAを使用します。SMS 2FAは、ユーザーの携帯電話に検証コードを含むテキストメッセージを送信します。認証コードには制限時間が組み込まれており、この方法は時間ベースのワンタイムパスワード(TOTP)認証に似ています。

以下は、Javaを使って2FAを実装するために必要な手順である:

  1. 製品を作る

  2. Spark Webアプリケーションの作成

  3. Javaクライアント・ライブラリを初期化する

  4. ビューの作成

  5. 初期登録ページの表示

  6. 検証リクエストの提出

  7. 確認コードをチェックする

  8. お試しあれ!

プロジェクトの作成

まず、"というディレクトリを作ります。"というディレクトリを作ります。次に、そのディレクトリに移動し、プロジェクトを初期化するためにGradleを利用します。すべてのデフォルトを受け入れ、生成されたプロジェクトをIDEで開きます。

ファイルを探し build.gradleファイルを見つけ dependenciesセクションを以下のように置き換える:

dependencies {
    // This dependency is used by the application.
    //implementation 'com.google.guava:guava:27.1-jre'

    // Use JUnit test framework
    testImplementation 'junit:junit:4.13.2'

    // Javalin framework
    //implementation 'io.javalin:javalin:5.4.2'

    // Spark framework
    implementation 'com.sparkjava:spark-core:2.9.4'

    // Vonage client library
    implementation 'com.vonage:client:7.2.0'

    // Templating engine
    implementation 'com.sparkjava:spark-template-handlebars:2.7.1'
}

この例ではユニットテストは書かないが、今のところ JUnitを残しておくことができる。しかし、後でgreetingメソッドを見逃して怒鳴られないようにするには、次のように src/test/java/two/factor/auth/AppTest.javaを以下のようにコメントアウトしてください:

public class AppTest {
  /*
   * @Test public void testAppHasAGreeting() { App classUnderTest = new App();
   * assertNotNull("app should have a greeting", classUnderTest.getGreeting()); }
   */
}

Spark Webアプリケーションの作成

Gradleは Appクラスを src/main/java/two/factor/auth/App.javaフォルダに作成されます。

開く App.javaをIDEで開いてください。メソッドを削除します。 getGreeting()メソッドを削除します。 gradleを削除し、必要な importステートメントを追加します。 sparkパッケージに必要なステートメントを追加します。

次に、Sparkの portメソッドを呼び出して、アプリケーションがポート3000でリクエストをリッスンしていることを示します。

あなたの App.javaはこのようになるはずだ:

package two.factor.auth;

import static spark.Spark.*;

public class App {

  public static void main(String[] args) {
    port(3000);

    // Your code goes here
  }
}

Javaクライアント・ライブラリを初期化する

Verify APIにアクセスするには、次のものを使うことになる。 Java用REST APIクライアント・ライブラリ.

を以下のように置き換えてインスタンス化する。 YOUR_API_KEYYOUR_API_SECRETを API キーとシークレットに置き換えてください。 開発者ダッシュボード.Verify API を使用するために必要な import文が含まれていることを確認しましょう:

package two.factor.auth;

import static spark.Spark.*;
// REST API Client Library for Java imports
import com.vonage.client.VonageClient;
import com.vonage.client.verify.*;

public class App {

  static String API_KEY = "YOUR_API_KEY";
  static String API_SECRET = "YOUR_API_SECRET";

  public static void main(String[] args) {
    port(3000);

    VonageClient client = VonageClient.builder().apiKey(API_KEY).apiSecret(API_SECRET).build();

  }
}

ビューの作成

申請書は3ページあります:

  • 最初の 登録ページユーザーが携帯電話番号を入力し、サービスに登録するページです。

  • A 確認ページここで、Verify APIによってモバイルデバイスに送信された確認コードを入力するよう求められます。

  • A 結果ページ正しい確認コードを入力した場合は登録に成功した、入力していない場合は登録に失敗したと表示されます。

Sparkはさまざまな テンプレートエンジンをサポートしており、HTMLページにコンテンツを動的に挿入したり、HTMLのブロックを再利用したりすることができます。このチュートリアルでは ハンドルバー.

ここではVerify APIの使い方を教えることに集中したいので、この記事ではこれらの仕組みは説明せず、必要なコンテンツを GitHub リポジトリ.

まず、以下のインポートを App.javaファイルに以下のインポートを入れてください:

import spark.template.handlebars.HandlebarsTemplateEngine;
import spark.ModelAndView;

次に src/main/resources/publicそして src/main/resources/templatesディレクトリを作成する。

の内容をコピーする。 の内容をコピーしてファイルの内容を src/main/resources/public/styles.css.

次に *.hbsテンプレートファイルを のテンプレートファイルをにコピーします。 src/main/resources/templates.

アプリケーションが styles.cssの親フォルダ(public) の mainメソッドで指定します。 App.java:

public static void main(String[] args) {
  port(3000);
  staticFiles.location("/public");

  VonageClient client = VonageClient.builder().apiKey(API_KEY).apiSecret(API_SECRET).build();

初期登録ページの表示

ユーザが初めてサイトにアクセスしたときに、登録ページを表示したいとします。デフォルトルート(/)を定義し sparkを定義し register.hbsテンプレートをレンダリングします:

public static void main(String[] args) {
  port(3000);
  staticFiles.location("/public");

  VonageClient client = VonageClient.builder().apiKey(API_KEY).apiSecret(API_SECRET).build();

  get("/", (request, response) -> {
    return new ModelAndView(null, "register.hbs");
  }, new HandlebarsTemplateEngine());

を実行してアプリケーションをテストしてください。 gradle runを実行し http://localhost:3000を実行し、ブラウザでアクセスしてみてください。正しくセットアップされていれば、以下のページが表示されます:

Two-factor authentication page prompting user to register to access this device2FA Registration Page

検証リクエストの提出

ユーザーは登録ページのテキストボックスに携帯電話番号を入力し 登録をクリックしてください。

Verify APIは、この番号に国際ダイヤルコードが含まれるが、先頭のゼロは省略されることを期待する。例えば、英国の Numbers は 07700 900001447700900001.

本番アプリケーションでは、正しいロケールや国コードをプログラムで決定したいと思うかもしれません!そのための Number Insight API をご覧ください。.今のところは、シンプルにしておきましょう。

ユーザーが 登録をクリックすると、入力された番号を取得し、検証リクエストを送信します。

各確認リクエストには、確認IDが関連付けられます。後でユーザーが正しい確認コードを入力したかどうかをチェックするために使用できるように、これも記録しておく必要がある。

そこで、この情報を格納する2つのクラスレベル変数を API_KEYAPI_SECRET変数の下に追加します:

static String number, requestId;

検証リクエストは /registerルートから検証リクエストを送信します:

post("/register", (request, response) -> {
    number = request.queryParams("number");

    VerifyResponse verifyResponse = client.getVerifyClient().verify(number, "VONAGE");
    if (verifyResponse.getStatus() == VerifyStatus.OK) {
      requestId = verifyResponse.getRequestId();
      System.out.printf("RequestID: %s", requestId);
    }
    else {
      System.out.printf("ERROR! %s: %s", verifyResponse.getStatus(), verifyResponse.getErrorText());
    }

    return new ModelAndView(null, "verify.hbs");
  }, new HandlebarsTemplateEngine());

このコードは、最初に VerifyClientのインスタンスを取得し verifyメソッドを呼び出し、検証したい番号と、SMS メッセージ本文で送信者を特定するために使われる英数字の文字列を渡します。

これは VerifyResponseオブジェクトを返す。このオブジェクトを使って、リクエストが正常に発行されたかどうかを調べることができる。成功した場合は、検証リクエストIDを取得し、次のステップでその特定の検証試行に対してユーザーに送信されたコードを確認するために使用します。

認証リクエストを送信すると、SMSで認証コードが送信されます:

Text message with verification code for two-factor authentication2FA Verification SMS Shown in iPhone

私たちは verify.hbsビューを表示し、受け取ったコードを入力できるようにします:

Two-factor authentication page prompting user to enter verification code2FA Check Verification

デフォルトでは、SMS送信後、Verify APIは125秒間コードを待つ。その時間内に受信できなかった場合、最終的に諦めて検証を失敗させる前に、2回の音声合成電話によるフォローアップを行う。デフォルトのワークフローの詳細と、さまざまなワークフローを有効にする方法については ドキュメントを読む.

確認コードをチェックする

入力されたコードをVerifyするために必要なロジックを用意する必要がある。そのために /checkルートを作成します:

  post("/check", (request, response) -> {
    String code = request.queryParams("code");
    CheckResponse checkResponse = client.getVerifyClient().check(requestId, code);
    return new ModelAndView(null, checkResponse.getStatus() == VerifyStatus.OK ? "success.hbs" : "failed.hbs");

  }, new HandlebarsTemplateEngine());

このコードでは VerifyClient.checkメソッドを使用し、検証リクエストステップから保存したリクエストIDと、ユーザーが verify.hbsビューに入力されたコードを渡します。

メソッドは checkメソッドは CheckResponseオブジェクトを返します。その getStatusメソッドを使用して、ユーザーが正しいコードを入力したかどうかを判断し、適切なレスポンスを result.hbsビューに表示します。ユーザーがコードを正しく入力した場合、次のようなメッセージが表示されます:

Two-factor authentication page with verification success messageVerification Success

ユーザーがコードを間違って入力した場合、次のようなメッセージが表示される。

Two-factor authentication page with verification failed messageVerification Failed

お試しあれ!

  1. ターミナルで gradle runを実行する。

  2. 訪問 http://localhost:3000をご覧ください。

  3. 携帯電話番号を入力し 登録する.しばらくすると、認証コードが記載されたSMSが届きます。

  4. 認証コードを入力し チェック.

  5. コードの入力に成功すると、「登録成功」のメッセージが表示されます。

結論

以上が、Verify API を使用して Java Web アプリケーションに二要素認証を実装するための基本的な手順です。詳細については、以下のドキュメントリンクを参照してください。

質問や共有したいことがありますか?Vonageコミュニティ VonageコミュニティSlackまたは 開発者向けニュースレターでフォローしてください。 X(旧Twitter)YouTubeチャンネル YouTubeチャンネルビデオチュートリアルを購読する。 LinkedInのVonage開発者ページ開発者が学び、コミュニティとつながるためのスペースです。つながりを維持し、進捗状況を共有し、最新の開発者向けニュース、ヒント、イベントを把握してください!

さらに読む

シェア:

https://a.storyblok.com/f/270183/384x384/b68093ec17/diana-pham.png
Diana Phamデベロッパー・アドボケイト

ダイアナはVonageのデベロッパー・アドボケイト。新鮮な牡蠣を食べるのが好き。