ID 토큰을 사용하여 로그인

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

Credential 객체의 사용자 ID가 기기에 로그인한 Google 계정의 사용자 ID와 일치하는 경우 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 라이브러리는 이러한 확인 작업 중 일부를 처리할 수 있습니다. 예를 들어 자바용 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 로그인 문서를 참고하세요.