2료일 2024. 3. 21. 00:05

클라이언트(즉 아이폰)에서 서버로 요청을 보낸다. 근데 그 서버에 닿기 직전에 이 벽(미들웨어)를 거쳐서 지나간다. 

ex) Authentication 미들웨어는 유저가 어? 너 회원이야? 아니야? 판단을 할수 있음!!

code로 보자 routes파일에다가 app.middleware.use(LogMiddleware())이거만 해주면 어떠한 우리가 요청을보내든 Log middleware가 찍히는것을 볼 수 있다. 주의행할것은 next.respond(to: request)를 해주지 않는다면 절대 우리가 가려던 곳에 reach할수 없어용

이제 아까 예시를 들었던 유효한 토큰이 있을때만 서버를 통신하도록 하는 코드를 작성해보자!!

struct AuthenticationMiddleware: AsyncMiddleware {
    func respond(to request: Request, chainingTo next: any AsyncResponder) async throws -> Response {
        // Headers: Authorization: Bearer EDFDFJOIJ
        guard let authorization = request.headers.bearerAuthorization else {
            throw Abort(.unauthorized)
        }
        print(authorization.token)
        return try await next.respond(to: request)
    }
}

vapor에 다 있어서 갖다쓰면댐. request.headers.bearerAuthorzation이 없다면!! unauthorized에러를 던져주고 아니면 다음동작을 하게끔 해주면 된다.

그러면 우리는 이 middleware를 아까처럼 모든요청에 다 검사하는것이 아닌 특정한 경우에만 통과해서 가게 하려면 어떻게 해야할까?

    // /members
    app.grouped(AuthenticationMiddleware()).group("members") { route in
        route.get { req async -> String in
            return "MEMBERS INDEX"
        }
        route.get("hello") { req async -> String in
            return "MEMBERS HELLO"
        }
    }

 

이런식으로 써주면 된다. 우리가 이전에 했던것은 group이라는 것을 통해 도메인의 주소를 모아뒀다면 grouped라는 얘는 여기들어오는애는 이 미들웨어를 거쳐서 갈꺼야~라고 설명하는것과 같다. 이러면 헤더에 bearercode가 있는 요청만 성공적으로 가게 된다. 아니면 다 abort 에러뜸