2015년 5월 3일 일요일

passport를 통하여 google, kakao oauth 사용시에 access token갱신하기.

google과 kakao의 경우에 refresh token과 함께 expires_in(초단위)를 주는데 그 시간 안에 access token을 갱신해야 한다.

access token의 만기 시간과 refresh token의 만기 시간이 다르기 때문에 rest api 요청시에 error 401이 발생하면 access token을 갱신해주어도 되지만, 이러면 rest api 사용하는 모든 부분에 대하여 401처리를 해주어야 한다.

blogsync의 경우에는 정기적인 스케줄러(2분)가 돌아가고 있기 때문에 그때 갱신해줘야 하는 타임이 넘은 경우에 갱신해주도록 하였다.

로그인했을때, expires_in값을 가지고 expireTime으로 저장하도록 만들었다.

UserMgr.makeTokenExpireTime = function (expires_in) {
    var expireDate;
    if (expires_in) {
        expireDate = new Date();
        expireDate.setSeconds(expireDate.getSeconds()+expires_in);
    }

    return expireDate;
};
function(req, accessToken, refreshToken, params, profile, done) {
    var meta = {"cName": GOOGLE_PROVIDER, "fName":"passport.use" };

    log.debug("accessToken:" + accessToken, meta);
    log.debug("refreshToken:" + refreshToken, meta);
    log.debug("params:"+JSON.stringify(params), meta);
    log.debug("profile:" + JSON.stringify(profile), meta);

    //It's not correct information. but I confirmed by /blogger/v3/users/self"
    var providerId = "g"+profile.id;

    var provider = {
        "providerName": profile.provider,
        "accessToken": accessToken,
        "refreshToken": refreshToken,
        "providerId": providerId.toString(),
        "tokenExpireTime": userMgr.makeTokenExpireTime(params.expires_in),
        "displayName": profile.displayName
    };
}

expire time이 되기 전에 access token을 갱신한다.

function _updateAccessToken(user, provider, callback) {
    var url = "https://kauth.kakao.com" + "/oauth/token";
    var data = {
        grant_type: 'refresh_token',
        client_id: clientConfig.clientID,
        refresh_token: provider.refreshToken
    };

    _requestPost(url, provider.accessToken, data, function (error, response, body) {
        if (error) {
            log.error(error);
            return callback(error);
        }
        log.info(body);

        var newProvider = userMgr.updateAccessToken(user, provider, body.access_token, body.refresh_token, body.expires_in);
        return callback(null, newProvider);
    });
}

아래와 들어오는 결과를 가지고 기존 값은 변경하면 된다.

[Response]

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
{
    "access_token":"wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww",
    "token_type":"bearer",
    "refresh_token":"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz",  //optional
    "expires_in":43199,
}

google도 kakao랑 동일한 방법으로 동작된다.

참고

http://ift.tt/1zmUaxp

http://ift.tt/1bO5FD7




from WordPress http://ift.tt/1bO5CY3

댓글 없음:

댓글 쓰기