[iOS - Swift] 카카오 로그인 -401 오류 "this access token does not exist"

신태원·2023년 1월 18일
0

iOS

목록 보기
1/3
post-thumbnail

"this access token does not exist" 이라는 에러 메세지가 콘솔에 찍혔다. 😱
정확히는 다음과 같다.

response:
 	Optional({
   	 	code = "-401";
    	msg = "this access token does not exist";
	})

카카오 SDK에는 이미 2달짜리 RefreshToken이 존재하고, 12시간(iOS, AOS 기준)짜리 accessToken을 서버에 넘기고, 서버가 카카오서버에 아무 api를 날리는것만으로도 RefreshToken과 AccessToken이 자동으로 갱신되기때문에, 따로 갱신해줘야할 필요는 없다.(카카오피셜 ㅇㅇ)

근데 만약에 서버를 거쳐서 카카오서버에 날리는 api가 없고 클라이언트 자체에서 토큰을 갱신해줘야할때 조금 까다로워진다..

무슨 말이냐면..

앞서 말했듯 AccessToken의 만료시간은 12시간이기 때문에 카카오 서버에 직접(서버 안거침) 로그인 요청을 할때 AccessToken이 만료되지 않았으면 정상적으로 로그인이 되지만, 만약 만료되었으면

   	 	code = "-401";
    	msg = "this access token does not exist";

이러한 에러메세지를 뱉어버리고 로그인에 실패하게 된다..

그래서 카카오서버에 직접 로그인 요청을 하기전에 현재 가지고 있는 AccessToken을 갱신하고 싶다!!!
라고 할때 쓸 수 있는 코드는 다음과 같다.

func renewToken(){
        AuthApi.shared.refreshToken(completion: {_,_ in })
    }

renewToken()이라는 함수를 만들어서 ViewDidLoad()의 맨 처음에 실행시켜주면 AccessToken이 만료되었더라도 자동으로 갱신된다!

/// 기존 토큰을 갱신합니다.
    public func refreshToken(token oldToken: OAuthToken? = nil,
                             completion:@escaping (OAuthToken?, Error?) -> Void) {
        API.responseData(.post,
                                Urls.compose(.Kauth, path:Paths.authToken),
                                parameters: ["grant_type":"refresh_token",
                                             "client_id":try! KakaoSDK.shared.appKey(),
                                             "refresh_token":oldToken?.refreshToken ?? AUTH.tokenManager.getToken()?.refreshToken,
                                             "ios_bundle_id":Bundle.main.bundleIdentifier,
                                             "approval_type":KakaoSDK.shared.approvalType().type].filterNil(),
                                sessionType:.Auth,
                                apiType: .KAuth) { (response, data, error) in
                                    if let error = error {
                                        completion(nil, error)
                                        return
                                    }
                                    
                                    if let data = data {
                                        if let newToken = try? SdkJSONDecoder.custom.decode(Token.self, from: data) {

                                            //oauthtoken 객체가 없으면 에러가 나야함.
                                            guard let oldOAuthToken = oldToken ?? AUTH.tokenManager.getToken()
                                            else {
                                                completion(nil, SdkError(reason: .TokenNotFound))
                                                return
                                            }
                                            
                                            var newRefreshToken: String {
                                                if let refreshToken = newToken.refreshToken {
                                                    return refreshToken
                                                }
                                                else {
                                                    return oldOAuthToken.refreshToken
                                                }
                                            }
                                            
                                            var newRefreshTokenExpiresIn : TimeInterval {
                                                if let refreshTokenExpiresIn = newToken.refreshTokenExpiresIn {
                                                    return refreshTokenExpiresIn
                                                }
                                                else {
                                                    return oldOAuthToken.refreshTokenExpiresIn
                                                }
                                            }
                                            
                                            let oauthToken = OAuthToken(accessToken: newToken.accessToken,
                                                                        expiresIn: newToken.expiresIn,
                                                                        tokenType: newToken.tokenType,
                                                                        refreshToken: newRefreshToken,
                                                                        refreshTokenExpiresIn: newRefreshTokenExpiresIn,
                                                                        scope: newToken.scope,
                                                                        scopes: newToken.scopes,
                                                                        idToken: newToken.idToken)
                                            
                                            AUTH.tokenManager.setToken(oauthToken)
                                            completion(oauthToken, nil)
                                            return
                                        }
                                    }
                                    
                                    completion(nil, SdkError())
                                }
        
    }

이건 카카오 SDK 내부에 있는 코드를 가져온것이고 혹시 모르니 카카오 Document 링크도 첨부하겠다!
https://developers.kakao.com/sdk/reference/ios/release/KakaoSDKAuth/Classes/AuthApi.html

profile
일단 배우는거만 정리해보자 차근차근,,

0개의 댓글