졸작으로 만들고 있는 앱 서비스에 회원가입/로그인을 구현하기 위해서 Google OAuth2.0 을 사용해보기로 했다.
직접 회원가입/로그인 기능을 구현할 수도 있지만 직접 세션 관리나 DB 저장시 해시암호화 등의 보안 문제까지 생각하면 구글, 네이버, 카카오 등에서 제공하는 로그인 api를 사용하는 것이 편리할 것 같았다.
1단계
먼저 구글 클라우드에 들어가서 클라이언트 ID를 생성해준다.
방법은 아래 블로그를 참고하면 금방 할 수 있다.
난 안드로이드에서 디버그용으로만 테스트할 것이기 때문에 일단 안드로이드 유형 으로만 발급받아주었다.
💡 앱을 플레이스토어에 올려 테스트 하는 경우 릴리즈 따로 또 발급받아야 함 -> SHA-1 서명 인증서도 다름 (추후에 다룰 예정)
💡 따로 구축한 서버와 통신하여 auth_code 나 id token/access token 등을 넘여주는 경우에는 웹 클라이언트 유형도 필요할 수 있으나 나는 안드에서만 구현했기 때문에 필요 X
디버그 서명 인증서 SHA-1 값 얻는법 (Debug용, Gradle 기준)
방법1. 안드로이드 스튜디오 Terminal에 아래처럼 입력 *프젝에서 처음 시도하는 경우 이 방법 권장
./gradlew signingReport
방법2. 직접 Gradle 확인
https://singo112ok.tistory.com/49
방법3. ID 생성 클라우드 화면에서 제공하는 명령어 사용하기(Terminal 에 치기)
https://rkdxowhd98.tistory.com/168
2단계
구글 Sign-in 코드작성
그리고 코드는 안드로이드 구글 Sign-in 공식 문서와 아래 블로그들을 참고했다.
나의 경우 서버와 통신하는 부분이 없기 때문에 처음에 구글 Sign-in 빌더 옵션 설정에서 아래와 같이 간단하게 해줬다.
private val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build()
*내가 가장 많은 도움을 받은 블로그들이다!! 이것만 보고 하면 코드 구현하는데는 문제 없을듯
https://developers.google.com/identity/sign-in/android/sign-in?hl=ko
https://rkdxowhd98.tistory.com/168
[에러내용]
이렇게 착실하게 잘 따라했는데.......
자꾸만 다음과 같은 에러가 나는 문제가 발생했다
구글 계정을 선택하는 인텐트 까지는 나오는데 로그인할 계정을 선택하면 화면이 바뀌는 듯 하면서
ApiException 10 이 발생한다.
설상가상으로 여러번 시도하면 계정 선탠하는 인텐트도 안 나오고 버퍼링이 걸리는 듯 했다....
진짜 모든 방법을 다 찾아본 것 같다.
심지어 나는 Firebase를 사용하지 않는데 대부분의 블로그 예제가 Firebase를 사용하고 있어서 더 헷갈렸다.
[해결방법]
시도1. SHA-1 값 확인하기
Error 10은 대부분 이 값을 잘못 넣어주어 발생하는 문제란다. 그래서 위 SHA-1 서명값 얻는 방법 3가지 다 시도해보았지만 서명값에는 문제가 없었다.
또 대부분 Firbase를 사용하고 있어서 파이어베이스 프로젝트에도 json 값인지 뭔지를 잘 넣으라고 하는데 나랑은 관계없었다.
시도2. 웹클라이언트 ID 만들어주기
아래 블로그 분의 경우에도 나와 동일한 에러가 났다고 해서 정독했다. 안드로이드 유형과 웹 클라이언트 유형을 모두 만들었을 때 문제가 해결되셨다고 하셔서 나도 따라해봤지만 일단 난 빌더에서 서버 연결 자체를 빌요로 하지 않았기 때문에 해결방법이 되질 못했다. (그래도 시도는 해봄)
https://tral-lalala.tistory.com/60?category=980172
이렇게 했는데도 나만 안 되는 것 같아서 진짜 인도 영어 강의까지 찾아보면서 6시간 정도 이걸로 삽질을 오지게 했다....
어떤 인도 아저씨는 나와 같은 조건에서 잘만 되시길래 구글 인종차별 하냐고(??) 욕하면서ㅋㅋㅋ
속는셈치고 이 아저씨와 똑같이 새로운 프로젝트를 파서 로그인, 로그아웃 버튼만 만들고 간단하게 테스트 해봤다.
그런데 왠걸?????????? 여기서는 되는것이다....
그래서 다시 돌아와서 혹시 내가 Drawer Navigation Header 에서 호출해서 뭔가 생명주기가 꼬였나? 하는 마음으로
다른 액티비티 화면을 만들어 시도해봤으나 여전히 안 됐다.....
프로젝트 자체가 문제란건데, 의존성도 잘 넣어줬고 크게 걸릴게 없는데 뭐냐고!!!!!!ㅗㅗㅗㅗ 하면서 manifest 와 gradle 위주로 뒤지던 와중 내 눈에 들어온 한가지....
시도3. Manifest의 package name == applicationID == 구글 클라이언트 생성시 패지지명
내가 분명 인터넷을 마구 뒤지다가 깃헙 커뮤니티에서 위와 같이 3가지를 맞춰주고 에러를 해결했다는 사람을 봤었다.
난 분명 이 3가지를 모두 com.example.phodo 로 맞췄었기 때문에 이딴걸 해결방법이라고 내놓냐? 이미 맞췄다고오;;
이랬었다.......그런데 아래 사진과 같이 applicationId 에 opencv.org 이새끼가 중복으로 들어가 있었다,,,,,,,,
아오,,,,,, opencv 라이브러리를 깔면서 아무래도 이게 자동으로 추가가된 것 같다,,,,어쩐지 앱이 실행될때마다 이 이름으로 뜨더라...
정말 내가 이게 안 되가지고 어떤 감정을 느꼈었는지 할많하않이지만
아무튼 이부분을 주석처리 해주고 아래 사진처럼 성공적으로 로그인한 계정과 이메일 주소까지 얻어올 수 있었다!!
하지만 사실 개발하려면 여기서 MVVM 패턴도 적용해줘야 하고 코드도 더 이쁘게 작성해줘야 한다.
그리고 백엔드 친구는 JWT 토큰 관리 방식으로 세션까지 고려해서 구현하려는 것 같은데 일단 관련 프젝을 찾아봤으나 무슨 멍소리인지 몰라서 좀 더 공부하고 삽질할 예정...ㅎㅎ
-> 안드로이드 유형이 아닌 웹 클라이언트 유형으로 sign-in 하여 auth_code를 백엔드 친구에게 넘겨주는 방식을 말한 것 같다. 보통 access token 까지는 내가 추출해서 주는 것 같은데 auth_code면 된다고 하니 일단은 개꿀이다.
앱을 끄고 켰을때 로그인 유지(세션관리) 등은 어떻게 하는지 나는 따로 토큰을 저장할 필요가 없는지 궁금하다.
'Android' 카테고리의 다른 글
[안드로이드/소셜로그인&Oauth] AWS와 통신하는 안드로이드 앱에서 Google Oauth2.0 사용하기 (4) | 2023.07.13 |
---|---|
[안드로이드/센서] GPS 사용하기 (0) | 2023.05.16 |
[안드로이드/데이터입출력] assets (0) | 2023.04.29 |
[안드로이드/데이터 관리] Raw 파일 읽어오기 (0) | 2023.04.29 |
[안드로이드/데이터 관리] 파일 입출력 (4) | 2023.04.29 |