Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Coroutine
- 알고리즘
- room
- onMeasure
- notification
- HTTP
- CollapsingToolbarLayout
- View
- 안드로이드
- Algorithm
- hilt
- onLayout
- Android
- 백준
- Behavior
- kotlin
- CoordinatorLayout
- activity
- sqlite
- lifecycle
- BOJ
- 코틀린
- ViewModel
- CustomView
- DataBinding
- recyclerview
- LiveData
- AppBarLayout
- 알림
- Navigation
Archives
- Today
- Total
개발일지
Android in A..Z - OAuth (People) 본문
Google의 OAuth를 통해 사용자 인증을 얻고 People API를 통해 사용자의 개인 정보를 얻을 수 있다.
1. OAuth 클라이언트 ID 등록하기 (People과 연동할 수 있는 웹 에플리케이션 등록하기)
* 웹 에플리케이션으로 등록한다.
2. API Key 발급하기
3. People API 신청하기
4. People 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
'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