사수께 예제 받고 공부한 내용을 정리하려고 올립니다 ...
먼저, 공식 문서부터 참고 하는 것을 추천합니다. Adapting and Retrying
Interceptor 기능을 사용하려고 합니다.
Interceptor 는 서버에 요청을 보낼 때, 중간에 가로채서 어떤 작업을 한 뒤 다시 서버로 보내는 역할을 합니다.
다른 함수와 달리 직접 호출해서 사용하는 것이 아닌, 구현만 해주면 알아서 작동합니다.
아무튼 저는 토큰 값 갱신을 위해 사용했습니다.
갱신을 위해서 토큰은 token과 refreshToken을 갖고 있어야 합니다.
기존 토큰값이 만료되었을 때, refreshToken 을 통해 토큰을 갱신하기 때문입니다.
그런데 Interceptor는 서버쪽에도 작업이 필요합니다.
만료된 토큰을 받았다면 어떤 상태 코드로 보내줄건지, refreshToken을 받았다면 갱신을 해주는 등 서버 작업도 필요합니다.
클라이언트 혼자 테스트 하기 위해서는 MockLab 이라는 사이트를 사용하면 됩니다.
protocol RequestInterceptor : RequestAdapter, RequestRetrier
구현해야 할 함수는 다음 두 가지입니다.
func adapt(_ urlRequest: URLRequest, for session: Alamofire.Session, completion: @escaping (Result<URLRequest, Error>) -> Void)
가로채서 토큰 넣고 request 합니다.
깃헙 예제처럼 static func authorization(_ value: String) -> HTTPHeader
함수를 사용하여 다음과 같이 쓸 수 있습니다.
urlRequest.headers.add(.authorization(bearerToken: accessToken)
mutating func addValue(_ value: String, forHTTPHeaderField field: String)
이 함수를 사용할 수도 있습니다.
request.addValue(token, forHTTPHeaderField: "token")
func retry(_ request: Request, for session: Alamofire.Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void)
토큰 만료로 서버에서 에러 코드를 반환할 때 작동
AF.request(convertible:interceptor:)
사용, 토큰 갱신하는 서버에다 refreshToken을 넣어서 request
request()
: 어디선가 request 호출
adapt()
: 서버로 가기 전 가로채서 로컬에 있는 토큰 넣고 보냄
{SERVER} : 토큰 만료, 에러 코드 보냄
retry()
: 에러 코드 받음, refresh 토큰 넣고 다시 request (callback)
request()
adapt()
: (retry가 갱신을 위해 request 했기 때문에, adapt는 또 나타납니다.)
{SERVER} : refersh 토큰 확인, token/refreshToken 갱신
retry()
: (callback) 도착한 토큰을 로컬에 업데이트, request
request()
adapt()
: (얘는 retry가 뭐했는지 모릅니다, 그저 언제나 가로채서 로컬 토큰을 넣을 뿐...)
{SERVER} : 성공