ID 토큰을 사용하여 로그인

사용자 인증 정보를 검색하거나 로그인 힌트를 검색한 후 사용자 인증 정보에 ID 토큰을 사용할 수 있는지 확인할 수 있습니다. ID 토큰은 사용자 ID의 서명된 어설션으로, 사용자의 기본 프로필 정보(Google에서 확인한 이메일 주소 포함)도 포함합니다. ID 토큰을 사용할 수 있게 되면 이 토큰을 사용하여 앱의 백엔드로 안전하게 인증하거나 새 계정을 만들 때 이메일 확인 단계를 건너뛸 수 있습니다.

ID 토큰은 Credential 객체의 사용자 ID가 기기에 로그인된 Google 계정의 사용자 ID와 일치할 때 사용할 수 있습니다.

ID 토큰으로 로그인하려면 먼저 getIdTokens 메서드를 사용하여 ID 토큰을 검색합니다. 그런 다음 ID 토큰을 앱의 백엔드로 전송합니다. 백엔드에서 Google API 클라이언트 라이브러리 또는 범용 JWT 라이브러리를 사용하여 토큰을 확인합니다.

시작하기 전에

사용자 인증 정보 객체에서 ID 토큰 가져오기

사용자 인증 정보를 가져온 후 Credentials 객체에 ID 토큰이 포함되어 있는지 확인합니다. 포함하는 경우 getIdTokens를 호출하여 가져오고 HTTPS POST를 통해 백엔드로 전송합니다.

if (!credential.getIdTokens().isEmpty()) {
    String idToken = credential.getIdTokens().get(0).getIdToken();

    HttpClient httpClient = new DefaultHttpClient();
    HttpPost httpPost = new HttpPost("https://yourbackend.example.com/tokensignin");

    try {
        List nameValuePairs = new ArrayList(1);
        nameValuePairs.add(new BasicNameValuePair("idToken", idToken));
        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        HttpResponse response = httpClient.execute(httpPost);
        int statusCode = response.getStatusLine().getStatusCode();
        final String responseBody = EntityUtils.toString(response.getEntity());
        Log.i(TAG, "Signed in as: " + responseBody);
    }
}

백엔드에서 ID 토큰 확인

HTTPS POST로 ID 토큰을 수신한 후에는 토큰의 서명을 확인하고 토큰의 aud, iss, exp 클레임을 확인해야 합니다.

비밀번호 대용 Smart Lock의 ID 토큰에 대한 aud 클레임의 형식은 다음과 같습니다.

android://SHA512_HASH@ANDROID_PACKAGE_NAME

SHA512HASH 값은 서명 인증서의 SHA-512 해시입니다. keytoolopenssl 유틸리티를 사용하여 이 값을 가져올 수 있습니다.

keytool -exportcert -keystore path-to-keystore -alias key-name 
| openssl sha -sha512 -binary
| base64 -w 0
| tr '+/' '-
'

또는 유효한 ID 토큰을 검사하여 SHA-512 해시를 가져올 수 있습니다.

JWT 라이브러리는 이러한 확인 작업 중 일부를 자동으로 처리할 수 있습니다. 다음은 Java용 Google API 클라이언트 라이브러리의 예입니다.

import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken.Payload;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;

...

// Verifier that checks that the token has the proper issuer and audience,
// and hasn't expired
private static GoogleIdTokenVerifier verifier =
    new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
        .setAudience(Arrays.asList(String.format("android://%s@%s", SHA512_HASH, PACKAGE_NAME)))
        .build();

// (Receive idTokenString by HTTPS POST)

GoogleIdToken idToken = verifier.verify(idTokenString);
if (idToken != null) {
  Payload payload = idToken.getPayload();
  System.out.println("User email: " + payload.getEmail());
  if (payload.getEmailVerified()) {
    System.out.println("Email verified by Google.");
  }
} else {
  System.out.println("Invalid ID token.");
}

자세한 내용은 Google 로그인 문서를 참조하세요.