본문 바로가기

Back

passport.js refresh token 발급 + 재발급 받기

refresh token이 발급되지 않아 로그인이 됐다가 안됐다가를 반복했다. 찾아보니 방법은 간단. offline access 옵션을 넣어주면 된다. 

 

 

 

 

https://developers.google.com/identity/protocols/oauth2/web-server#offline

 

 

access_type을 offline으로 해야한다고 쓰여있다. 앱이 백업 서비스를 실행할 때, 유저가 접속중이지 않아도 알아서 access token을 refresh할 수 있게끔 하는 게 offline access의 용도인듯. 

 

그런데 이 간단한 한 줄 넣으면 되는 걸 왜 이렇게 오래 걸렸냐면, 엉뚱한 곳에다가 넣었었기 때문.

 

 

passport.use(new GoogleStrategy({
        clientID : process.env.GOOGLE_CLIENT_ID,
        clientSecret : process.env.GOOGLE_CLIENT_SECRET,
        callbackURL : process.env.absoluteURI+"/api/user/google/callback",
       	//여태 여기다가 accessType을 넣어주었었다. 여기넣으면 안됨.
    },

 

router.get(
   "/google",
   passport.authenticate("google", {
     scope: [
       "profile",
       "https://www.googleapis.com/auth/calendar",
       "https://www.googleapis.com/auth/calendar.events",
     ],
     accessType: "offline", //여기에 넣어줘야한다.
   })
 );

 

여기 passport.authenticate가 호출될 때 저 옵션을 넣어주면 된다. passport.authenticate를 call하면서 요청을 인증하는 것. 위에는 그냥 로그인 전략을 수행하는 미들웨어니까, 저 옵션이 추가로 요청되는 것이 아니다!! 라우터에 넣어줘야 offline access를 요청하는 것 ㅠ

 

(저기에 prompt 옵션도 추가할 수 있는데, 안넣으면 처음 액세스 요청할 때만 동의화면이 뜨게 된다. prompt : "consent" 옵션을 넣지 않으면 refresh token이 발급되지 않는 경우도 있는 것 같은데, 난 넣지 않아도 발급이 됐다. 

consent를 추가하면 로그아웃하고 다시 로그인 할 때마다 동의화면이 뜨는데, 보안상엔 더 좋을 것 같긴 해도 사용자들은 귀찮을 듯? 시중 앱에서 저 화면이 여러 번 뜨는 건 못본 거 같다.)

 

 

 

++

 

 

refresh token은 이렇게 액세스 권한을 부여해줄 때 한 번만 발행해준다. 

 

 

 

 

 

 

따라서, 테스트한다고 DB에서 유저 정보 삭제했다가 다시 로그인해봤다가 했더니 엥? refresh token 발급 안됐네 뭐가 문제지... 하면 이미 전에 refresh token을 발급해줬어서 다시 로그인할 땐 안해준거. 

그러니까 맞는 코드인데도 처음에 로그인할 때 발급해줬어서 다시 안찍히는 것일 수도 있다.  

 

그 땐, 

myaccount.google.com/permissions?pli=1로 들어가면, 구글에서 내 계정권한을 허용해준 앱들이 나온다. 

 

 

 

 

 

 

여기서 액세스 권한을 삭제하고 다시 테스트해보면 refresh token이 무사히 발급된다. 

여기까지 몇 시간이 걸렸는지 ㅠ 

다음에 사용할 땐 헤매는 일 없겠지