사용자 인증 정보를 검색하거나 로그인 힌트를 검색하면 사용자 인증 정보에 ID 토큰을 사용할 수 있는지 확인할 수 있습니다. ID 토큰은 Google의 확인을 거친 이메일 주소를 포함할 수 있는 사용자의 기본 프로필 정보도 포함되어 있는 사용자의 ID에 대한 서명된 어설션입니다. ID 토큰을 사용할 수 있으면 이 토큰을 사용하여 앱의 백엔드에 안전하게 인증하거나 새 계정을 만들 때 이메일 인증 단계를 건너뛸 수 있습니다.
Credential
객체의 사용자 ID가 기기에 로그인한 Google 계정의 사용자 ID와 일치하는 경우 ID 토큰을 사용할 수 있습니다.
ID 토큰으로 로그인하려면 먼저 getIdTokens
메서드로 ID 토큰을 검색합니다. 그런 다음 ID 토큰을 앱의 백엔드로 보냅니다. 백엔드에서 Google API 클라이언트 라이브러리 또는 범용 JWT 라이브러리 중 하나를 사용하여 토큰을 확인합니다.
시작하기 전에
- 앱에서 사용자의 사용자 인증 정보를 검색하거나 로그인 힌트를 검색할 수 있어야 합니다.
CredentialRequest
및HintRequest
객체를 빌드할 때setAccountTypes(IdentityProviders.GOOGLE)
를 호출해야 합니다.
사용자 인증 정보 객체에서 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 해시입니다. keytool
및 openssl
유틸리티를 사용하여 이 값을 가져올 수 있습니다.
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 로그인 문서를 참고하세요.