coding etude
[flutter]Google_sign_in 7.1.0 이상 버전 초기화에 대해..(initialize) 본문
오랜만에 구글 로그인 좀 적용하려고 패키지를 설치했는데, 웬걸?
뭔가 초기화 방식이 변경되고 사용 방법이 변경 됐어. 지금 3일 만에 해결함..ㅠ
최신버전 Google_sign_in: ^7.2.0
* 성질 급한분은 설명 필요없이 가장 아래쪽 요점 정리만 봐도됨.
증상
//IOS
PlatformException(google_sign_in, Your app is missing support for the following URL schemes: com.googleusercontent.apps., NSInvalidArgumentException, null)
// ANDROID
GoogleSignInException(code GoogleSignInExceptionCode.unknownError, [28404] Failed to retrieve an ID token, null)
원인
우선 기존의 initialize 방식이 변경 되었음.
signIn.initialize(clientId: clientId, serverClientId: serverClientId)
여기서 serverClientId 값은 필수 값으로 변경되어서 무조건 입력해줘 하는것으로 변경 되었는데, 보통 google cloud console 에서 생성한 clientId 값을 입력해 주면 된다.
serverClientId 값은 내가 가진 서버에서 인증요청을 하면 구글에서 serverClientId 값을 비교해서 인증을 해주는 형식으로 진행하기 때문에 필수로 변경 되었어.
그래서, 우선 생성한 clientId 값을 수동으로 입력해서 테스트를 했는데, 해당 id는 인증할수 없다는 에러가 발생해.
흠.. 인증 절차를 간소화 하기 위해서 firebase를 이용하기로 했어. 다들 알겠지만, firebase와 google cloud는 서로 자동으로 연동되니까 firebase에서 프로젝트 생성 후 bundle ID 값만 일치 한다면 google cloud의 정보를 자동으러 연동해주고, 또 flutter 에서 plug in을 설정해 주면 자동으로 정보를 사용 할 수 있도록 해주거든.
그래서 firebase에서 프로젝트 생성 후 앱을 추가해서 google-servervices.json 파일과 google-services.plist 파일을 다운 받아서 각 os 폴더에 고이 넣어주고, 다시 진행 했지.
동일한 오류로 인증 거부... 흠.. 계속 검색을 했지만 모든 자료가 7.1.0 버전 이전의 구 버전 데이터 ... 흠....
그래서 애초에 이런 오류는 있을 수 없다.. 뭔가 내가 놓친 부분이 있을거다. 라고 생각하고 공식문서를 정독했지..
그런데 똭!! 하고 한줄이 눈에 보이더라고..
만약 google-services.json 을 사용 중이라면, 그 안에 Web OAuth 클라이언트 (client_type = 3)가 포함되어 있어야
serverClientId를 코드에서 생략해도 될 수 있음.
아하... 필수로 변경 됐다고 제일 위에 써놓고.. 이걸 아래쪽에 작게 써놨구나.. 하하...;;;;;;;;
그래서, GCP(google cloud console) 에서 바로 OAuth client ID 를 web 로 생성하고,
다시 firebase에 프로젝트로 가서 각각의 앱(IOS, ANDROID)에서 google-services 파일을 다시 받아서 각 os 폴더에 넣어줬지.
그리고 초기화를 간소화 했어.
signIn.initialize();
바로 로그인 성공....
내용 요약
1. Google_sign_in 7.1.0 부터 초기화 및 사용 방법이 변경됨.
2. 초기화 시 serviceClientId 값을 필수로 입력해야함.
3. 하지만, google-services.json / Google-services.plist 파일 내부에 client_type=3 인 clientId 값이 포함되어 있으면,
serviceClientId 값을 입력하지 않아도 됨.
4. GCP(google cloud console) 에서 OAuth client id 를 web으로 생성.
5. firebase 에서 프로잭트 생성 후 동일한 bundle ID 값으로 앱 생성하고 google-services 파일을 받아서 다시 각 os 폴더에 넣어줌.
과정요약
1. GCP에서 ios, android, web 용으로 각각 OAuth Client ID를 생성.
2. firebase 프로젝트 생성, 앱 추가(ios, android)
3. google-service.json / Google-Services.plist 파일 다운 후 각 OS 폴더에 저장
4. GoogleSignIn.initialize() 실행 후 정상 작동 확인.
참고
1. firebase 를 사용하려면 build gradle에 'com.google.gms.google-services' 추가해 줘야함.
(두 곳에 추가해야함. flutter 공식문서에 나와 있지만, 모르겠거나 귀찮다면 댓글로 문의)
2. firebase authentication 을 사용하면 이딴거 필요없다고 함. firebase가 자동으로 인증을 해줌.
(자체 서버 구동 및 AWS 등 사용할 때 참조)
3. 사용 방법도 변경 되었지만, 그 부분은 친절하게 공식문서에 이미지 첨부되서 깔끔하게 나와 있음.
4. 이런거 다 귀찮으면 그냥 7.1.0 이하 버전 사용하면 됨.(7.1.0이상 부터는 뭔가 더 명확해지고 보안적으로 안전해 졌다고 하긴함.)
끝.