프로젝트에서 Github API를 사용하고 있다.
사용자가 커밋을 했는지 안 했는지 파악할 필요가 있어서 Github API를 통해서 조회 중, public 리포지토리만 조회가 되고 private 리포지토리는 조회가 안 되고 있다는 걸 알았다. (분명히 커밋을 했는데 커밋 카운드가 안 올랐다.)
커밋 기록을 알기 위해서는 public, private 리포지토리 모두 조회해야하기 때문에 개선이 필요했다.
슬기롭게 시작했지만 삽질을 1주일 동안 했다.
그동안 내가 삽질하면서 배운 것들, 혹은 어떤 점에서 삽질이 됐는지 설명도 하면서 해결 방식도 같이 풀어보겠다.
일단 Github API를 통해서 레포지토리 조회를 토큰 없이 바로 할 수 있다.
하지만 기본 트래픽률 제한 때문에 제한을 초과하면 Github측에서 403에러를 반환 한다. 
그렇기 때문에 몇번 요청을 하면 바로 에러가 날 수 있다.
그리고 public정보만 조회가 가능하기 때문에
private 정보와 트래픽 제한을 늘리기 위해서는 Token이 필요하다.
그래서 Github에서 제공하는 Token이 3가지가 있는데

가 있다.
여기에서 거의 대부분의 시간을 삽질했다.
나는 처음에 OAuth Apps에서 받아오는 Token을 사용하고 있었는데 private 정보를 조회할 수 없는걸 알고 OAuth Apps Token 문제로 생각했다.
밑에 사진처럼 따로 권한을 설정하는 곳도 없었고

리처치 중에 이런 글고 같이 보게 되면서

GitHub Apps에서 Token을 받아오면 문제 없겠다고 생각했다.
결과는 GitHub Apps를 사용하면 문제없이 private 리포지토리를 조회할 수 있었다.
하지만 다른 문제점이 생겼다. 밑에 사진처럼 권한 설정을 추가한 Github Apps를 권한을 주고 싶은 계정과 organization에게 따로 Install를 해줘야 내가 설정한 권한을 적용시켜줄 수 있었다.

내 정보만 알기에는 문제가 없지만 나는 다른 사용자도 조회돼야 하기에 이 방법은 내상황에서는 잘못 된 방식이었다.
왜냐하면 다른 사용자에게 install 하라고 할 수가 없기 때문이다.
그래서 다시 리서치를 해본 결과 처음 사용했던 OAuth Apps에서 권한을 설정할 수 있다는 걸 알았다.
Github에서 권한 설정을 하는것이 아니라, Github에서 login 요청을 할 때 보내는 url에 scope를 추가를 해서 권한을 줄수 있었다. (이걸 알기 까지 너무 많은 시간과 과정이 있었다..)
const loginWithGithub = () => {
window.location.assign(
`https://github.com/login/oauth/authorize?client_id=${process.env.NEXT_PUBLIC_GITHUB_CLIENT_ID}&scope=repo`
);
};
url 밑에 &scope=repo를 추가해서 private 정보를 조회할 수 있는 권한을 줬다.
그럼 이제 login시 권한이 포함된 AccessToken이 발급이 되면서 private 정보도 조회할 수 있다.
그리고 마지막에 권한도 줬지만 organization에서 private 리포지토리 조회가 안 된다고 하면 login시
조직 접근에 승인을 안 눌러서 그렇다.(나는 이걸로 많이 헤맸다.)

이렇게 해서 개인 저장소 및 organization에서 public, private 리포지토리 모두 조회할 수 있게 되었다.
그리고 Github에서 제공하는 Token 관련된 부분에서 3개의 차이점과 어느 시점이 어떤 걸 사용하는지 먼저 파악하고 시작했으면 이렇게 삽질을 길게 안 하지 않았을까 라는 반성도 되었다.
scope를 추가해서 원하는 권한을 줄 수 있다.https://bibi6666667.tistory.com/389
https://docs.github.com/ko/rest/guides/discovering-resources-for-a-user?apiVersion=2022-11-28
https://docs.github.com/ko/apps/oauth-apps/building-oauth-apps/authorizing-oauth-apps#scopes
https://docs.github.com/en/rest/orgs/orgs?apiVersion=2022-11-28
https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/scopes-for-oauth-apps