안녕하세요?
오늘은 Localization을 구글 스프레드 시트와 연동하여 사용할 때 생길 수 있는 오류인 TokenResponseException Error:"invalid_grant"과 해결 방법에 대해 알아보도록 하겠습니다.
저는 며칠동안 사정으로 인해 손대지 못했던 프로젝트를 하던 중 이 오류가 발생했습니다.
구글 시트에서 대사를 수정하고, localtable의 pull을 누르자 제대로 작동하지 않고 해당 오류가 발생한 것입니다..
먼저 이 오류는 왕규왈 “리프레시 토큰(refresh token)이나 인증 코드(auth code)가 더 이상 유효하지 않다”는 뜻이라고 합니다.
아마도 토큰 만료 때문에 이 사단이 나지 않았을까.. 하는 개인적 추측이 있었고요.
인증 코드 문제는 아닐 것 같다는 생각을 했습니다. 그냥 저의 촉이었습니다.
해당 오류에 대해 찾아보니
1. 토큰이 만료되었기 때문에 캐시 파일을 삭제하고 재로그인을 해서 해결한 경우와
2. OAuth 요청할 때 서버/클라이언트 시간(clock skew)이 구글 서버랑 5분 이상 차이나면 에러 날 수 있어서 서버 시간을 맞춘 후에 해결한 경우를 찾아볼 수 있었습니다.
저의 경우는 전자로 해결을 완료하였습니다.
그렇다면 해결 방법은 토큰 캐시 파일을 지우고 재로그인하기!
정말 쉬운 방법이지만 저는 캐시 파일을 찾는 것도 힘들었고 재로그인을 하는 것도 힘들었습니다.
저처럼 찾기 힘드셨던 분들을 위해 이 글을 작성합니다.
말로는 쉽지만 대체 이 파일은 어디있는 것인가 찾아 헤맸는데요.
그냥 한번에 쉽게 알려드리겠습니다.
프로젝트 파일 > Library > Google > Google Sheets Service
안에 있는 Google.Apis.Auth.OAuth2.Responses.TokenResponse어쩌구.com 파일입니다.
상세 폴더 명이나 파일 명은 개인마다 차이가 있을 수 있는데 대충 저런 경로와 형식일 겁니다.
재로그인하는 방법은 Sign in이나 Log in 버튼을 찾는 게 아니고,
위 과정처럼 OAuth 토큰 캐시 파일 지우고 유니티 프로젝트를 종료 후 재시작 한 후 pull 버튼을 누르면 됩니다. (저는 pull하고 싶어서 pull했고, push하고 싶으시면 push하셔도 될 것 같습니다.)
처음에 구글 시트를 연동했던 것처럼 구글 계정 로그인 창이 뜨고, 해당 과정을 완료하면 정상적으로 Localization이 작동하는 걸 볼 수 있습니다!
Unity Localization이 구글 시트와 연동할 때 내부적으로 Google OAuth 2.0을 사용합니다.
그렇기 때문에 OAuth 토큰이 필요한 것이고요.
처음 로그인하면 Access Token + Refresh Token을 발급받습니다.
Unity는 이 토큰을 캐시 파일에 저장하는 것입니다.
그 캐시 파일이 과정1에서 제거하였던 파일이고요,
Access Token이 만료되면 구글 시트와 연동이 되지 않고, TokenResponseException이 발생하는 것이지요..
따라서 토큰 캐시 파일을 제거하고 재로그인을 하면
새 Access Token + 새 Refresh Token 발급이 되고
캐시 파일 생성 → Unity가 다시 정상적으로 Google API 호출 가능한 과정이 이루어지는 것입니다.
참 알고보면 쉬운데 모를 때는 한없이 어려워지는 것 같습니다.
저에겐 인생 모든 일이 그렇네요..
아무쪼록 해당 오류가 발생해서 구글링을 하시는 분들께 도움이 되는 글이었으면 좋겠습니다.
감사합니다.