概要
今回はこちらの記事の続きです。
Google OAuth 2.0 認証を使ったGoogle Sign-Inの実装(JS編)
クライアントサイドでログインしてバックエンドサーバーで認証といった感じでやります。
前回の記事でユーザー情報などをレスポンスで取得することができました。
ただこれをこのままサーバーサイドに送ったりするのは危険です。
例えば、ユーザーIDをサーバーに送信する際にユーザーを偽装できちゃったりします。。
なので、その代わりに検証可能なIDトークンを使用して、サーバー側でサインインしているユーザー情報を安全に取得します。
さっそく実装していきましょう。
フロントサイドの実装
まずJSの部分を書きかえます。
function onSignIn(googleUser) {
  var id_token = googleUser.getAuthResponse().id_token; // IDトークンを取得
  // IDトークンをサーバー側に送る処理
}
ここのサーバー側に送る処理はAjax使ったり、hidden属性で送ったりいろいろなやり方があると思いますが、
今回はAjaxのXMLHttpRequestを使用してHTTPリクエストを発行する方法でサーバーとの通信をやって来ます。
先ほどの処理に追加して
var req = new XMLHttpRequest();
req.open('POST', '[URL]’);
req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
req.onload = function() {
req.send('idtoken=' + id_token);
こんな感じでサーバー側に送信しましょう。
***[URL]***の部分にはサーバー側のURLを入れましょう。
サーバー側の実装
今回は、JavaのSpring bootを使って実装していきます。
まずは依存関係の追加です。
dependencies {
implementation("com.google.api-client:google-api-client:1.30.5")
}
Googleクライアントライブラリを使えば簡単にIDトークンの検証ができます。
 GoogleIdTokenVerifier verifier =
        new GoogleIdTokenVerifier.Builder(
                new NetHttpTransport(), JacksonFactory.getDefaultInstance())
            .setAudience(Collections.singletonList("YOUR_CLIENT_ID.apps.googleusercontent.com"))
            .build();
 var idtokenStriing = getIdToken(); // 取得したIDトークン
 GoogleIdToken idToken = verifier.verify(idTokenString); // IDトークン検証
 
YOUR_CLIENT_IDには自分のクライアントIDを入れてください。
もしGoogleクライアントライブラリを使わない場合はGoogleの公開鍵(PEM形式)を使用して、トークンの署名を検証する方法もありますが、GoogleでもGoogleクライアントライブラリを使って検証することを推奨しているので使いましょう。
あとはユーザー情報を取得するだけです。
  Payload payload = idToken.getPayload();
  String userId = payload.getSubject(); // ユーザーID
  String email = payload.getEmail(); // ユーザーメールアドレス
  String name = (String) payload.get("name"); // ユーザー名
  String pictureUrl = (String) payload.get("picture"); // ユーザープロフィール画像
  
こんな感じで取得できちゃいます。
まとめ
今はいろんなサイトでOAuth認証使ってるところが増えてますね。
今回はGoogleですがFacebookやAppleなどのOAuth認証もまたあげていこうと思います。