탭 한 번으로 새 계정 만들기

Google 계정 로그인을 지원하는 경우 원탭 로그인을 사용할 수 있습니다. 클라이언트로 제공하여 사용자에게 원활한 계정 생성 환경을 앱의 맥락에서 벗어나지 않습니다.

원탭 가입 UI

원탭 UI를 표시하면 사용자에게 앱에 액세스할 수 있습니다. 사용자가 선택하는 경우 계속하려면 기본 프로필 정보( 이름, 프로필 사진, 인증된 이메일 주소: 새 계정을 만듭니다.

원탭 계정 만들기 구현은 다음 두 부분으로 구성됩니다.

  • 원탭 클라이언트를 앱에 통합(이 페이지에 설명되어 있음) 이는 원탭 로그인을 사용하는 것과 거의 동일하지만 구성할 수 있습니다
  • Google ID에서 사용자 계정을 생성하는 기능을 백엔드에 추가 토큰에 대한 자세한 내용은 백엔드에서 ID 토큰 사용을 참조하세요.

원탭 가입은 어디에서 사용해야 하나요?

사용자에게 원탭 가입을 제공할 수 있는 가장 효과적인 위치는 다음과 같은 상황입니다 로그인하면 새 기능을 사용할 수 있습니다. 먼저 사용자 인증 정보를 저장합니다 저장된 사용자 인증 정보를 찾을 수 없는 경우 새 사용자 인증 정보를 생성하겠다고 제안합니다. 계정을 만들 수 있습니다

시작하기 전에

설명에 따라 Google API 콘솔 프로젝트 및 Android 프로젝트를 설정합니다. 원탭 로그인 시작하기에서 확인하세요.

1. 원탭 클라이언트 구성

계정 생성을 위해 원탭 클라이언트를 구성하려면 다음 단계를 따르세요.

  • 비밀번호 사용자 인증 정보 요청을 사용 설정하지 마세요. (원탭 가입은 토큰 기반 인증 사용)
  • setGoogleIdTokenRequestOptions() 및 설정할 수 있습니다.

자바

public class YourActivity extends AppCompatActivity {

  // ...

  private SignInClient oneTapClient;
  private BeginSignInRequest signUpRequest;

  @Override
  public void onCreate(@Nullable Bundle savedInstanceState,
                       @Nullable PersistableBundle persistentState) {
      super.onCreate(savedInstanceState, persistentState);

      oneTapClient = Identity.getSignInClient(this);
      signUpRequest = BeginSignInRequest.builder()
              .setGoogleIdTokenRequestOptions(GoogleIdTokenRequestOptions.builder()
                      .setSupported(true)
                      // Your server's client ID, not your Android client ID.
                      .setServerClientId(getString(R.string.your_web_client_id))
                      // Show all accounts on the device.
                      .setFilterByAuthorizedAccounts(false)
                      .build())
              .build();

      // ...
  }
}

Kotlin

class YourActivity : AppCompatActivity() {
    // ...

    private lateinit var oneTapClient: SignInClient
    private lateinit var signUpRequest: BeginSignInRequest

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        oneTapClient = Identity.getSignInClient(this)
        signUpRequest = BeginSignInRequest.builder()
            .setGoogleIdTokenRequestOptions(
                BeginSignInRequest.GoogleIdTokenRequestOptions.builder()
                    .setSupported(true)
                    // Your server's client ID, not your Android client ID.
                    .setServerClientId(getString(R.string.your_web_client_id))
                    // Show all accounts on the device.
                    .setFilterByAuthorizedAccounts(false)
                    .build())
            .build()
        // ...
    }
    // ...
}

2. 원탭 UI 취소 추적하기

사용자가 원탭 사용을 이미 거부했는지 추적해야 합니다. 메시지를 닫거나 메시지 외부를 탭하여 가입하세요. 다음과 같을 수 있습니다. 액티비티의 불리언 속성으로 단순하게 만듭니다. (원탭 표시 중지를 참조하세요.) UI 참고)

3. 원탭 가입 UI 표시

사용자가 원탭 사용을 거부하지 않아 새 계정을 만드는 것을 거부하지 않았다면 클라이언트 객체의 beginSignIn() 메서드에 전달하여 리스너를 Task에 연결 반환합니다. 앱은 일반적으로 원탭 로그인 요청에서 찾을 수 없는 경우 이 단계를 실행합니다. 저장된 사용자 인증 정보(로그인 로그인의 실패 리스너에 저장된 사용자 인증 정보) 합니다.

사용자에게 하나 이상의 태그가 있는 경우 원탭 클라이언트는 성공 리스너를 호출합니다. 기기에 설정된 Google 계정 성공 리스너에서 대기 중인 인텐트를 Task 결과에서 가져와 startIntentSenderForResult()에 전달합니다. 원탭 UI를 시작합니다.

사용자의 기기에 Google 계정이 없는 경우 원탭 클라이언트 실패 리스너를 호출합니다. 이 경우 별도의 조치가 필요하지 않습니다. 앱의 로그아웃 환경을 계속해서 표시하면 사용자가 일반적인 계정 만들기 절차에 따라 가입하세요.

자바

oneTapClient.beginSignIn(signUpRequest)
        .addOnSuccessListener(this, new OnSuccessListener<BeginSignInResult>() {
            @Override
            public void onSuccess(BeginSignInResult result) {
                try {
                    startIntentSenderForResult(
                            result.getPendingIntent().getIntentSender(), REQ_ONE_TAP,
                            null, 0, 0, 0);
                } catch (IntentSender.SendIntentException e) {
                    Log.e(TAG, "Couldn't start One Tap UI: " + e.getLocalizedMessage());
                }
            }
        })
        .addOnFailureListener(this, new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                // No Google Accounts found. Just continue presenting the signed-out UI.
                Log.d(TAG, e.getLocalizedMessage());
            }
        });

Kotlin

oneTapClient.beginSignIn(signUpRequest)
    .addOnSuccessListener(this) { result ->
        try {
            startIntentSenderForResult(
                result.pendingIntent.intentSender, REQ_ONE_TAP,
                null, 0, 0, 0)
        } catch (e: IntentSender.SendIntentException) {
            Log.e(TAG, "Couldn't start One Tap UI: ${e.localizedMessage}")
        }
    }
    .addOnFailureListener(this) { e ->
        // No Google Accounts found. Just continue presenting the signed-out UI.
        Log.d(TAG, e.localizedMessage)
    }

4. 사용자 응답 처리

원탭 가입 메시지에 대한 사용자의 응답이 앱에 보고됩니다. Activity의 onActivityResult() 메서드 사용 사용자가 Google ID 토큰이 나오게 됩니다. 사용자가 가입을 거부하면 원탭 UI를 닫거나 외부를 탭하면 결과가 코드 RESULT_CANCELED를 사용합니다. 앱은 두 가지 가능성을 모두 처리해야 합니다.

Google ID 토큰으로 계정 만들기

사용자가 Google 계정으로 가입하기로 선택하면 onActivityResult()에서 원탭으로 인텐트 데이터를 전달하여 사용자 클라이언트의 getSignInCredentialFromIntent() 메서드와 함께 사용해야 합니다. 사용자 인증 정보에는 null이 아닌 googleIdToken 속성입니다.

ID 토큰을 사용하여 백엔드에 계정을 만듭니다. 백엔드를 사용)하고 사용자를 로그인 처리합니다.

사용자 인증 정보에는 다음과 같은 사용자가 요청한 추가 세부정보도 포함됩니다. 계정의 인증된 전화번호(있는 경우)

자바

public class YourActivity extends AppCompatActivity {

  // ...
  private static final int REQ_ONE_TAP = 2;  // Can be any integer unique to the Activity.
  private boolean showOneTapUI = true;
  // ...

  @Override
  protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
      super.onActivityResult(requestCode, resultCode, data);

      switch (requestCode) {
          case REQ_ONE_TAP:
              try {
                  SignInCredential credential = oneTapClient.getSignInCredentialFromIntent(data);
                  String idToken = credential.getGoogleIdToken();
                  if (idToken !=  null) {
                      // Got an ID token from Google. Use it to authenticate
                      // with your backend.
                      Log.d(TAG, "Got ID token.");
                  }
              } catch (ApiException e) {
                  // ...
              }
              break;
      }
  }
}

Kotlin

class YourActivity : AppCompatActivity() {

    // ...
    private val REQ_ONE_TAP = 2  // Can be any integer unique to the Activity
    private var showOneTapUI = true
    // ...

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        when (requestCode) {
             REQ_ONE_TAP -> {
                try {
                    val credential = oneTapClient.getSignInCredentialFromIntent(data)
                    val idToken = credential.googleIdToken
                    when {
                        idToken != null -> {
                            // Got an ID token from Google. Use it to authenticate
                            // with your backend.
                            Log.d(TAG, "Got ID token.")
                        }
                        else -> {
                            // Shouldn't happen.
                            Log.d(TAG, "No ID token!")
                        }
                    }
                } catch (e: ApiException) {
                    // ...
            }
        }
    }
    // ...
}

원탭 UI 표시 중지

사용자가 로그인을 거부한 경우 getSignInCredentialFromIntent() 호출 CommonStatusCodes.CANCELED 상태 코드와 함께 ApiException이 발생합니다. 이 경우 원탭 로그인 UI 표시를 일시적으로 중지해야 합니다. 반복적인 프롬프트로 사용자를 귀찮게 하지 않아야 합니다. 다음 예를 참고하세요. 이는 액티비티에 속성을 설정하여 사용자에게 원탭 로그인 제공 여부 결정 Cloud Shell에서 값을 SharedPreferences에 저장하거나 다른 메서드를 사용합니다.

원탭 로그인 메시지에 자체 비율 제한을 구현하는 것이 중요합니다. 그렇게 하지 않고 사용자가 연속으로 여러 메시지를 취소하는 경우 원탭 클라이언트는 다음 24시간 동안 사용자에게 메시지를 표시하지 않습니다.

자바

public class YourActivity extends AppCompatActivity {

  // ...
  private static final int REQ_ONE_TAP = 2;  // Can be any integer unique to the Activity.
  private boolean showOneTapUI = true;
  // ...

  @Override
  protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
      super.onActivityResult(requestCode, resultCode, data);

      switch (requestCode) {
          case REQ_ONE_TAP:
              try {
                  // ...
              } catch (ApiException e) {
                  switch (e.getStatusCode()) {
                      case CommonStatusCodes.CANCELED:
                          Log.d(TAG, "One-tap dialog was closed.");
                          // Don't re-prompt the user.
                          showOneTapUI = false;
                          break;
                      case CommonStatusCodes.NETWORK_ERROR:
                          Log.d(TAG, "One-tap encountered a network error.");
                          // Try again or just ignore.
                          break;
                      default:
                          Log.d(TAG, "Couldn't get credential from result."
                                  + e.getLocalizedMessage());
                          break;
                  }
              }
              break;
      }
  }
}

Kotlin

class YourActivity : AppCompatActivity() {

    // ...
    private val REQ_ONE_TAP = 2  // Can be any integer unique to the Activity
    private var showOneTapUI = true
    // ...

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        when (requestCode) {
            REQ_ONE_TAP -> {
                try {
                    // ...
                } catch (e: ApiException) {
                    when (e.statusCode) {
                        CommonStatusCodes.CANCELED -> {
                            Log.d(TAG, "One-tap dialog was closed.")
                            // Don't re-prompt the user.
                            showOneTapUI = false
                        }
                        CommonStatusCodes.NETWORK_ERROR -> {
                            Log.d(TAG, "One-tap encountered a network error.")
                            // Try again or just ignore.
                        }
                        else -> {
                            Log.d(TAG, "Couldn't get credential from result." +
                                " (${e.localizedMessage})")
                        }
                    }
                }
            }
        }
    }
    // ...
}

다음 단계

사용자가 원탭 가입 과정을 완료하면 Google ID 토큰을 받게 됩니다. 여기에는 사용자의 이메일 주소, 성명, 프로필 사진 URL을 입력합니다. 많은 앱에서는 이 정보로도 백엔드에서 사용자를 인증하고 새 계정을 만듭니다.

계정 생성을 완료하기 위해 추가 정보가 필요한 경우(예: 사용자의 생년월일 - 사용자에게 가입 세부정보 흐름을 제시합니다. 이 추가 정보를 요청할 수 있습니다 그런 다음 백엔드로 전송하여 계정 생성을 완료합니다.