진짜 개발자
본문 바로가기

App/Android

Android - 구글 로그인(Google Sign in Api) 이용

728x90

(참조 - https://developers.google.com/identity/sign-in/android/start-integrating)



구글 로그인을 해볼 것이다


*개념

- oauth를 통해 사용자로부터 허가를 받고 얻어낸 Access Token 을 이용하여 

  Resource Server에서 얻어온 사용자 ID를 이용하여 사용자를 인증한다


- User(Resource Owner)로 부터 허가를 받아 얻어온 Access Token을 이용하여 가져온 ID이므로

  Pw가 없이도 해당 User임을 증명할 수 있다.


*과정


1) 환경 구성

1. build.gradle에 google()을 추가한다


2. build.gradle에서  'com.google.android.gms:play-services-auth:16.0.1' 의존성을 추가한다

   appcompat을 27.1.1 버전을 이용하고 있었으나 의존성 충돌이 일어나 26.1.0으로 다운그레이드했다

   sdk 버전도 26으로 맞춰준다.


3. File -> Project Structure 를 누른다


4. app -> Properites탭의 Compile Sdk Version을 API 26으로 맞추어 준다.




2) 코드


  구글의 Sign-in Document를 참조하며 개발을 진행할 것이다.



 1.


사용자의 ID와 기본 Profile 정보를 요청하기 위해 GoogleSignInOptions 객체를 DEFAULT_SIGN_IN 인자와 함께 생성을 하라고한다

*가장 최고의 사용자경험을 제공하기위해 앱에서 필요로하는 범위만을 요청할 것을 권고 하고 있다

 또한 추가적인 범위에 대한 허가를 원한다면 그역시 사용자의 화면에 나타남을 말하고있다.




 2. 

그다음 Sign-in Activity의 onCreate() 메소드에 GoogleSignInClient 객체를 위에서 생성한 gso객체를 인자로 주어 생성한다.




3.


기존의 로그인한 사용자가 있는지 확인을 하는 부분이다

onStart()메소드에 위의 코드를 추가할것을 권고 하고 있다

GoogleSignIn.getLastSignedInAccount(this); 메소드를 사용하면 기존에 로그인된 사용자 객체를 얻을 수 있다.

기존의 사용자가 있는 경우의 코드를 추가하면 된다 

(우리 앱에선 추가하지 않겠다)




4. 


다음은 구글에서 제공하는 버튼을 xml에 추가한다

오른쪽에 보이는 것과 같은 모양의 버튼이 추가된다.




5.

1) 버튼이 눌렸을 때의 행동을 추가한다

2) 우리들이 허가를 요청할 gso객체를 인자로하여 만든 mGoogleSignInClient객체의 getSignInIntent(); 메소드를 이용하여 

   Intent를 만든다.

3) 만들어진 Intent를 startActivityForResult()에 인수로 전달하여 실행한다

4) 사용자에게 인증허가를 요청하는 화면(Activity)가 보여진다.


*startActivityForResult

 - startActivityForResult()는 Intent에 입력된 Activity로 부터 결과를 받을 때 이용하는 메소드

 - 사용자가 startActivityForResult()로 호출된 Activity의 작업을 마치면 onActivityResult() 메소드가 호출이 된다.

사용자가 google SignIn 버튼을 클릭하면 

onClick 메소드가 실행되고 이어 signIn() 메소드를 호출한다

signIn() 메소드는 사용자에게 허가를 요청하는 엑티비티를 띄우며

그것을 startActivityForResult를 이용하여 사용자의 행동에 대한 결과를 응답 받는다.




6. 


사용자가 SignIn을 하고 난뒤에는 onActivityResult()가 호출되며 GoogleSignInAccount 객체를 얻어낼 수 있다 

이것을 handleSignInResult를 호출하며 인자로 전달한다


사용자가 Activity에서 한 행동을 onActivityResult()에서 data로 받을 수 있으며

GoogleSignIn.getSignedInAccountFromIntent(data); 메소드를 통해 Task<GoogleSignInAccount> 객체로 변환할 수 있다.

task객체를 인수로 handleSignInResult() 메소드를 호출한다




7.

Task<GoogleSignInAccount> 객체의 getResult() 메소드를 이용하여 GoogleSignInAccount 객체를 반환 받을 수 있다.

GoogleSignInAccount 객체를 통해 사용자의 Google계정 정보를 얻어올 수 있다.

얻어온 account객체를 통해 사용자의 정보를 Log로 출력해본다.




8. 

사용자의 Google 계정 정보를 잘 받아온 것을 볼 수있다.