
URTURN 프로젝트에서 회고를 저장하면 자동으로 지정된 Github Repository에 저장하도록 기능을 구현하고자 했다. 이를 위해 Github 에서 제공하는 Refresh Token을 통해 scope=repo를 포함한 Access Token을 재발급받아 구현하려고 했었다.
참고로 깃허브에서 제공하는 access token은 scope=repo로 요청하면 레포지토리 수정 권한까지 받을 수 있다.
다만 기존 OAuth2 로 소셜로그인할 때는 이 부분이 필요하지 않았기 때문에 요청하지 않았고, 따라서 scope=repo를 추가하면 깃허브에서 제공하는 access token으로 repository 수정 권한도 받을 수 있다.
그러나 결론부터 말하면 OAuth App에서 사용하는 github API에는 Refresh Token이 없다..!
결국 scope에 repo를 추가한 인증 요청을 매번 보내서 권한을 새로 받아서 repository update API를 사용해야했다.
마지막 회고 페이지에서 회고를 저장할 때 분기를 해야 했다.
1) 해당 유저가 깃허브 레포지토를 등록하지 않았거나 존재하지 않는 레포지토리를 등록한 경우, RDBMS에만 회고 내용을 저장하고 깃허브에는 올리지 않고 마이 페이지로 이동한다.
2) 해당 유저가 존재하는 깃허브 레포지토리명을 등록한 경우, 회고를 레포지토리에 업로드하기 전에 Github Access Token을 새로 발급 받아야 한다.
2-1) 해당 유저의 Github Access Token을 다시 요청. 이 과정에서 클라이언트 auth/github page로 redirect하여 깃허브에서 제공하는 code를 받아와야 한다. 받은 code를 서버로 넘겨 서버와 깃허브 인증 서버가 통신하도록 한다. 이 플로우는 oAuth와 동일하다.
참고로 Github Authorization callback URL을 ~/auth/github으로 등록해두었다면 하위 주소도 redirect Url로 등록할 수 있다! 공식 문서 참고


요청 URL
https://github.com/login/oauth/authorize?client_id={{APP_CLIENT_ID}}&scope=repo
응답
code=""
해당 코드를 통해서 토큰을 반환받을 수 있다.
2-2) access token을 재발급 받았으면 그 토큰을 사용하여 repository에 마크 다운 파일을 업로드하는 github API를 요청한다.
요청
POST https://github.com/login/oauth/access_token
응답
access_token=gho_16C7e42F292c6912E7710c838347Ae178B4a&scope=repo%2Cgist&token_type=bearer
응답결과를 보면 보통 oAuth 앱에서는 refresh token 을 주지 않는다..
결론적으로 사용자 repository에 접근하기 위해서는 매번 새로 인증을 해서 access_token을 받아야 한다. (이 내용이 깃허브 API 문서에 나와있지가 않아서 엄청 헤멨다..!)
API 문서를 보면 access_token은 기본적으로 1시간까지만 유효한 것으로 보인다
(어디는 access token이 8시간, refresh token은 6개월이라고 하는데 보통 oAuth App에서 사용할 수 없는 것 같다)