Android 앱에 Google 로그인 통합

Google 로그인을 Android 앱에 통합하려면 Google 로그인 및 로그인 흐름을 시작하는 버튼을 앱 레이아웃에 추가합니다.

시작하기 전에

Google API 콘솔 프로젝트 구성 및 Android 스튜디오 프로젝트 설정

Google 로그인 및 GoogleSignInClient 객체 구성

  1. 로그인 활동의 onCreate 메서드에서 다음과 같이 Google 로그인을 구성합니다. 사용자 데이터를 요청할 수 있어야 합니다. 예를 들어 사용자 요청을 위한 Google 로그인 ID 및 기본 프로필 정보가 있는 경우 GoogleSignInOptions 객체를 DEFAULT_SIGN_IN 매개변수로 사용하세요. 사용자의 이메일 GoogleSignInOptions 객체를 만듭니다. requestEmail 옵션.

    // Configure sign-in to request the user's ID, email address, and basic
    // profile. ID and basic profile are included in DEFAULT_SIGN_IN.
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .build();

    Google API에 액세스하기 위해 추가 범위를 요청해야 하는 경우 해당 범위를 지정합니다. requestScopes와 함께 사용할 수 있습니다. 최상의 사용자 환경을 위해 로그인 시 최소 요구 사항을 충족해야 합니다 추가 범위 요청 필요한 경우에만 맥락에 맞게 수집됩니다 추가 범위 요청을 참고하세요.

  2. 그런 다음 로그인 활동의 onCreate 메서드에서도 다음을 만듭니다. GoogleSignInClient 객체를 반환합니다.

    // Build a GoogleSignInClient with the options specified by gso.
    mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

기존에 로그인한 사용자 확인

활동의 onStart 메서드에서 사용자가 이미 Google 계정으로 앱에 로그인했는지 확인합니다.

// Check for existing Google Sign In account, if the user is already signed in
// the GoogleSignInAccount will be non-null.
GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
updateUI(account);

GoogleSignIn.getLastSignedInAccountGoogleSignInAccount 객체를 반환하는 경우 사용자가 이미 Google로 앱에 로그인했습니다(null이 아님). 이에 따라 UI를 업데이트합니다. 즉, 로그인 버튼을 숨기고 기본 활동 또는 앱에 적합한 모든 활동을 포함할 수 있습니다.

GoogleSignIn.getLastSignedInAccountnull를 반환하면 사용자가 아직 Google 계정으로 앱에 로그인했습니다. Google 로그인을 표시하도록 UI 업데이트 버튼을 클릭합니다.

앱에 Google 로그인 버튼 추가

  1. 표준 Google 로그인 버튼 SignInButton 추가 합니다.

    <com.google.android.gms.common.SignInButton
     android:id="@+id/sign_in_button"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content" />
    
  2. 선택사항: 기본 로그인 버튼 그래픽을 사용하는 경우 자체 로그인 버튼 애셋을 제공하면 버튼에 대한 setSize로 크기 조절 메서드를 사용하여 축소하도록 요청합니다.

    // Set the dimensions of the sign-in button.
    SignInButton signInButton = findViewById(R.id.sign_in_button);
    signInButton.setSize(SignInButton.SIZE_STANDARD);
  3. Android 활동 (예: onCreate 메서드)에서 클릭 시 사용자를 로그인 처리하기 위해 버튼의 OnClickListener를 설정합니다.

    findViewById(R.id.sign_in_button).setOnClickListener(this);
    

로그인 과정 시작

  1. 로그인 계정 선택기 이미지 활동의 onClick 메서드에서 다음을 생성하여 로그인 버튼 탭을 처리합니다. getSignInIntent를 사용한 로그인 인텐트 메서드를 호출하고 startActivityForResult로 인텐트를 시작합니다.

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.sign_in_button:
                signIn();
                break;
            // ...
        }
    }
    
    private void signIn() {
        Intent signInIntent = mGoogleSignInClient.getSignInIntent();
        startActivityForResult(signInIntent, RC_SIGN_IN);
    }

    인텐트를 시작하면 사용자에게 로그인할 Google 계정을 선택하라는 메시지가 표시됩니다. 있습니다. profile, email, openid 이외의 범위를 요청한 경우 요청된 리소스에 대한 액세스 권한을 부여하라는 메시지도 표시됩니다.

  2. 사용자가 로그인하면 GoogleSignInAccount가 표시될 수 있습니다. 활동의 onActivityResult 메서드에서 사용자의 객체를 초기화합니다.

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        // Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
        if (requestCode == RC_SIGN_IN) {
            // The Task returned from this call is always completed, no need to attach
            // a listener.
            Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
            handleSignInResult(task);
        }
    }

    GoogleSignInAccount 객체에는 로그인한 사용자의 사용자(예: 사용자 이름)

    private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
        try {
            GoogleSignInAccount account = completedTask.getResult(ApiException.class);
    
            // Signed in successfully, show authenticated UI.
            updateUI(account);
        } catch (ApiException e) {
            // The ApiException status code indicates the detailed failure reason.
            // Please refer to the GoogleSignInStatusCodes class reference for more information.
            Log.w(TAG, "signInResult:failed code=" + e.getStatusCode());
            updateUI(null);
        }
    }

    getEmail를 사용하여 사용자의 이메일 주소를 가져올 수도 있습니다. getId를 포함하는 사용자의 Google ID (클라이언트 측용) getIdToken로 사용자의 ID 토큰을 반환합니다. 현재 로그인한 사용자를 백엔드 서버에 전달해야 하는 경우 백엔드 서버로 ID 토큰을 전송 서버에서 토큰의 유효성을 검사합니다