0

googleapis lib를 사용하여 Google Oauth 플로업 설정을 사용하고 oauthClient.getToken(code, ..)을 사용한 후 tog et a가 refresh_token 인 것처럼 보이지 않습니다. access_tokenid_token 만 반환합니다.googleapis lib를 사용하여 refresh_token 가져 오기

다음은 코드에서 내 결과입니다 :

{ 
    access_token: "...", 
    expiry_date: 1475080667529, 
    id_token: "...", 
    token_type: "Bearer" 
} 

여기 내 코드입니다 :

function getOauth() { 
    var oauthClient = new google.auth.OAuth2(
    config.googleOauth.id, 
    config.googleOauth.secret, 
    `${config.https ? 'https' : 'http'}://${config.baseUrl}/google` 
); 
    return Bluebird.promisifyAll(oauthClient); 
} 

/** 
* Initialize session based of the auth code, which 
* gives us the accessToken and the payload. 
* 
* Returns a session with the user tokenized and 
* the accessToken for use to restore on page refresh. 
*/ 
router.get('/initial', function * (req, res) { 
    try { 
    let oauth = getOauth(); 
    let code = req.query.authorizationCode; 
    let results = yield oauth.getTokenAsync(code); 
    let tokens = results[0]; 
    let result = yield oauth.verifyIdTokenAsync(tokens.id_token, config.googleOauth.id); 
    let payload = result.getPayload(); 
    let user = yield User.findOneByEmail(payload.email, req.communityConfig); 
    let data = { user }; 

    if (user.role) { 
     let role = yield Role.findOne(user.role, req.communityConfig); 
     data.roles = [role]; 
    } 

    let token = auth.createToken(data); 

    res.json(extend({}, req.query, { token, accessToken: tokens.id_token })); 
    } catch(error) { 
    console.log(error.message); 
    throw new StatusError(401, error); 
    } 
}); 

/** 
* Use the google provider's fetch method to restore the session 
* data using the accessToken. 
* 
* Returns a token created from the user and role, along with 
* all of the query props passed in. 
*/ 
router.get('/restore', function * (req, res) { 
    try { 
    let oauth = getOauth(); 

    oauth.setCredentials({ 
     access_token: req.query.accessToken 
    }); 

    let tokens = yield oauth.getAccessTokenAsync(); 
    let result = yield oauth.verifyIdTokenAsync(tokens[0], config.googleOauth.id); 
    let payload = result.getPayload(); 
    let user = yield User.findOneByEmail(payload.email, req.communityConfig); 
    let data = { user }; 

    if (user.role) { 
     let role = yield Role.findOne(user.role, req.communityConfig); 
     data.roles = [role]; 
    } 

    let token = auth.createToken(data); 

    res.json(extend({}, req.query, { token })); 
    } catch(error) { 
    console.log(error.message); 
    throw new StatusError(401, error); 
    } 
}); 

그래서 모든 초기와 새로 고침, 작동하지만 access_token이 만료 된 후에, 그것은 더 이상 인증합니다.

토큰, 너무 늦게> 1475005777

내가 'offline'- access_type를 지정해야하지만이 경우에도 내 경우에는 그 설정 방법 모르는 heared

1475070618.739을 사용하고 그가 줄 알았는데 백그라운드 동기화 같은 것들. 무엇보다도 만료되기까지 하루가 걸리기 때문에 테스트하기가 어렵습니다.

답변

0

와우, 여기에 또 다른 질문이 내 문제를 해결하는 데 도움이되었습니다.

access_type 옵션은 FRONTEND 옵션입니다. 그래서 제 경우에는 여기에 위치해있었습니다 : https://github.com/Vestorly/torii/blob/master/addon/providers/google-oauth2.js 그리고 나는 광산을 'offline'으로 설정했습니다.

사용자의 액세스 권한 취소 (여기 https://security.google.com/settings/security/permissions) 후 다시 동의하면 refresh_token이 반환되었습니다.

이 덧글 Not receiving Google OAuth refresh token by zack-morris가 정말 도움이되었습니다.