사용자의 사용자 인증 정보를 가져왔거나 로그인 힌트를 가져온 후 사용자 인증 정보에 사용할 수 있는 ID 토큰이 있는지 확인할 수 있습니다. ID 토큰은 사용자의 기본 프로필 정보(Google에서 인증한 이메일 주소 포함 가능)도 포함하는 사용자의 ID에 대한 서명된 어설션입니다. ID 토큰을 사용할 수 있는 경우 이를 사용하여 앱의 백엔드를 안전하게 인증하거나 새 계정을 만들 때 이메일 인증 단계를 건너뛸 수 있습니다.
ID 토큰은 Credential
객체의 사용자 ID가 기기에 로그인한 Google 계정의 사용자 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 라이브러리는 이러한 확인 작업을 일부 처리할 수 있습니다. 예를 들어 Java용 Google 인증 라이브러리를 사용하는 경우:
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 로그인 문서를 참고하세요.