개발일지

Android in A..Z - OAuth (People) 본문

Android (안드로이드)/OAuth

Android in A..Z - OAuth (People)

강태종 2021. 5. 4. 18:14

Google의 OAuth를 통해 사용자 인증을 얻고 People API를 통해 사용자의 개인 정보를 얻을 수 있다.

rkdxowhd98.tistory.com/168

 

Android in A..Z - OAuth (Google)

Google API를 사용해서 Google인증과 Google OAuth로 얻은 idToken값으로 People API를 사용하여 사용자의 다양한 정보를 얻을 수 있다. OAuth를 사용하면 프로젝트 자체에서 회원관리 기능을 구현할 필요가 없

rkdxowhd98.tistory.com


1. OAuth 클라이언트 ID 등록하기 (People과 연동할 수 있는 웹 에플리케이션 등록하기)

* 웹 에플리케이션으로 등록한다.


2. API Key 발급하기


3. People API 신청하기


4. People Dependency 등록하기

Dependency

dependencies {

    // Google OAuth
    implementation 'com.google.android.gms:play-services-auth:19.0.0'

    // People
    implementation 'com.google.apis:google-api-services-people:v1-rev20210419-1.31.0'

}

5. Key 등록하기

발급받은 키들을 string.xml에 API Key, client_id, client_secret 3개를 등록한다.

 

* API Key와 client_id는 복사해서 사용할 수 있지만 client_secret은 다운로드 버튼을 눌러서 json파일을 받은 후 파일에 내용을 복사해서 사용한다.

* client_id와 client_secret은 웹 에플리케이션으로 만든 클라이언트 ID를 사용한다.

<resources>
    <string name="api_key">AIzaSyCZQAq7v-WpglGy-VILtgQn2X3eBesanAM</string>
    <string name="client_id">880557432158-eu828hif0lu8q7ltlfsedls5cf9s6cd4.apps.googleusercontent.com</string>
    <string name="client_secret">7cFAkgl6W6QYERETF5VXIInk</string>
</resources>

6. Google Login 옵션 설정

requestServerAuthCode를 client_id를 통해 얻고 추가로 얻고 싶은 개인정보는 requestScopes를 통해 얻는다.

val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
        .requestEmail()
        .requestScopes(
                Scope(PeopleServiceScopes.USER_BIRTHDAY_READ),
                Scope(PeopleServiceScopes.USER_GENDER_READ)
        )
        .requestServerAuthCode(getString(R.string.client_id))
        .build()
        
val client = GoogleSignIn.getClient(requireActivity(), gso)

7. account로 People API 사용하기

account로 id와 serverAuthCode를 통해 accessToken을 얻고 People API를 사용한다.

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    when(requestCode) {
        GOOGLE_LOGIN -> {
            try {
                val task = GoogleSignIn.getSignedInAccountFromIntent(data)
                val account = task.result!!

                updateViewModelWithGoogleAccount(account)
                findNavController().navigate(LoginFragmentDirections.actionLoginFragmentToProfileFragment())
            } catch (e: ApiException) {
                e.printStackTrace()
            }
        }
    }
}

private fun updateViewModelWithGoogleAccount(account: GoogleSignInAccount) {
    val transport = NetHttpTransport()
    val jsonFactory = JacksonFactory.getDefaultInstance()

    runBlocking(Dispatchers.IO) {
        val response = GoogleAuthorizationCodeTokenRequest(
                transport,
                jsonFactory,
                getString(R.string.client_id),
                getString(R.string.client_secret),
                account.serverAuthCode,
                ""
        ).execute()

        (URL("https://people.googleapis.com/v1/people/${account.id}?personFields=birthdays,genders&key=${getString(R.string.oauth_key)}").openConnection() as HttpsURLConnection).apply {
            setRequestProperty("Authorization", "Bearer ${response.accessToken}")

            inputStream.bufferedReader().use {
                val json = JSONObject(it.readText())
                val genderJson = json.getJSONArray("genders").getJSONObject(0)
                val birthJson = json.getJSONArray("birthdays").getJSONObject(0).getJSONObject("date")

                with(viewModel) {
                    email = account.email
                    name = account.displayName
                    gender = genderJson.getString("value")
                    birth = "${birthJson.getString("year")} / ${birthJson.getString("month")} / ${birthJson.getString("day")}"
                    type = GOOGLE
                }
            }
        }
    }
}


Git (예제코드)

github.com/KangTaeJong98/Example/tree/main/Android/OAuth

 

KangTaeJong98/Example

My Example Code. Contribute to KangTaeJong98/Example development by creating an account on GitHub.

github.com


developers.google.com/people/api/rest/v1/people/get?apix_params=%7B%22resourceName%22%3A%22people%2F103500598334683195902%22%2C%22personFields%22%3A%22birthdays%2Cgenders%2CemailAddresses%2Cnames%2Cnicknames%22%7D

 

'Android (안드로이드) > OAuth' 카테고리의 다른 글

Android in A..Z - OAuth (Naver)  (0) 2021.05.07
Android in A..Z - OAuth (Kakao)  (0) 2021.05.05
Android in A..Z - OAuth (Google)  (2) 2021.05.04
Comments