m-cmp / mc-iam-manager

https://github.com/m-cmp/docs/tree/main
Apache License 2.0
3 stars 5 forks source link

MC-IAM-MANAGER other Framework Middleware Pkg #18

Closed raccoon-mh closed 3 months ago

raccoon-mh commented 5 months ago

M-CMP 내에서 사용가능한 미들웨어 패키지 개발

대상 지원 프레임워크

필수 요구 사항

환경설정

yunkon-kim commented 5 months ago

@innodreamer (cc. @powerkimhub, @seokho-son, @dongjae)

개발하기에 앞서서 이대로 추진해도 괜찮을지 최종 검토 및 조율이 필요할 것 같습니다.

raccoon-mh commented 5 months ago

우선 package mcimw 로 아래와 같이 echo 및 buffalo에서 PoC 테스트 하였습니다. 필요한 기능 및 향상 이번 릴리즈 이후로 일정 조율 따로 드리겠습니다.

echo

mcimw.AuthMethod = mcimw.EnvKeycloak
mcimw.GrantedRoleList = []string{}

app.Any("/**", echo.WrapHandler(http.HandlerFunc(mcimw.BeginAuthHandler)))
app.GET("/alive/protected", mcimw.EchoMcimw(func(c echo.Context) error {
    return c.String(http.StatusOK, "alive")
}))

buffalo

mcimw.AuthMethod = mcimw.EnvKeycloak
mcimw.GrantedRoleList = []string{}
api.Use(mcimw.BuffaloMcimw)
api.GET("/{targetController}", GetRouteController)
api.POST("/{targetController}", PostRouteController)
raccoon-mh commented 4 months ago

@yunkon-kim @seokho-son @dogfootman

MC-IAM-MANAGER 내에서 미들웨어 필수 함수 하기 3개에 대하여 패키지화 예정, 미들웨어는 각 프레임워크에서 직접 개발 및 echo, buffalo 등 golang 프레임워크 기반 미들웨어 예제 제공 예정

raccoon-mh commented 4 months ago

@yunkon-kim @seokho-son @dogfootman

https://github.com/raccoon-mh/iamtokenvalidatorpoc 위 레포지토리에서 iamtokenvalidator 패키지 PoC 퍼블리싱 진행했습니다. PoC가 어느정도 진행되고, MC-IAM-MANAGER 에서 진행하는 쪽으로 하는게 좋을 것 같습니다.. 의견 부탁드립니다..!

https://github.com/raccoon-mh/mc-iam-manager-tokenValidator-middleware-PoC Echo Framework 에서는 위 레포지토리 예제처럼 사용할 수 있을 것으로 보입니다.

아래는 echo 미들웨어 예제 입니다.

// 공용키 설정
func init() {
    // mc-iam-manager certs endpoint is require, this endpoint is v0.2.0..
    err := iamtokenvalidatorpoc.GetPubkeyIamManager("https://example.com:5000/api/auth/certs") 
    if err != nil {
        panic(err.Error())
    }
}

// token 의 valid를 확인
func isTokenValid(next echo.HandlerFunc) echo.HandlerFunc {
    return func(c echo.Context) error {
        accesstoken := strings.TrimPrefix(c.Request().Header.Get("Authorization"), "Bearer ")
        err := iamtokenvalidatorpoc.IsTokenValid(accesstoken)
        if err != nil {
            return c.String(http.StatusUnauthorized, "Authorization is not valid..")
        }
        c.Set("accesstoken", accesstoken)
        return next(c)
    }
}

// usrRole을 컨텍스트에 Set
func setUserRole(next echo.HandlerFunc) echo.HandlerFunc {
    return func(c echo.Context) error {
        accesstoken := c.Get("accesstoken").(string)
        claims, err := iamtokenvalidatorpoc.GetTokenClaimsByIamManagerClaims(accesstoken)
        if err != nil {
            return c.String(http.StatusUnauthorized, "Authorization is not valid..")
        }
        c.Set("realmAccess", claims.RealmAccess.Roles) // IAM manager 기준 현재 제공하고 있는 Role 위치. 커스텀 Claims 사용가능
        return next(c)
    }
}
yunkon-kim commented 4 months ago

@raccoon-mh (cc. @seokho-son @dogfootman)

공유해주신 Pkg 및 예제를 활용하여, https://github.com/cloud-barista/cb-tumblebug/pull/1627 개선을 진행하겠습니다. (Echo Web Framework의 공식 JWT 미들웨어에 적용 및 테스트 예정)

PoC에서 활용하신 Go version이 1.22.3으로 파악되는데요. 우선, 개발하신 패키지에서 1.22.3이 필수인지 문의드립니다.

추가로, PublicKey 획득을 위한 URL 엔트포인트로 지난번 온라인 회의에서 공유해주신, MC-IAM-MANAGER 엔트포인트를 활용할 예정입니다. 혹시 다른 엔드포인트를 사용해야할 경우, Slack DM 주시기 바랍니다.

raccoon-mh commented 4 months ago

@yunkon-kim

yunkon-kim commented 4 months ago

@raccoon-mh 확인 감사합니다!

현재 태그가 v0.0.0으로 잡히는데, v0.2.1 로 맞추겠습니다.

관련하여 말씀드립니다.

https://github.com/raccoon-mh/iamtokenvalidatorpoc 을 대상으로 통합 및 테스트를 진행하고 있습니다. Go vesion을 맞춰주시면, latest main을 활용하면 될 것 같습니다.

raccoon-mh commented 4 months ago

@yunkon-kim

우선 해당 저장소로 진행하시는건가요?

PoC 패키지 테스트용으로 잠시 해놓았던 것이라, 통합하여 TB 메인 테스트로 사용하기에 부적절 할 수 있어보입니다.

진행중이시라면, https://github.com/raccoon-mh/iamtokenvalidatorpoc 를 대상으로 테그 및 go 버전 수정 하겠습니다.

-- 현재 진행중인 커밋은 다음과 같습니다. 915e5de292523efe96f08fb943589aebcff6bd62 582963e45e7a480fb16c0472333d6458d99a675d

yunkon-kim commented 4 months ago

@raccoon-mh

위에서 PoC 진행 후, IAM-Manager에 적용하신다고 말씀해주셔서 개인 저장소 버전으로 진행하는 것으로 이해했었습니다.

TB 에 통합 및 테스트를 위한 대상을 말씀해 주시는 것이 좋을 것 같습니다.

raccoon-mh commented 4 months ago

@yunkon-kim

혼선을 드려 죄송합니다...

PoC 테스트 만을 위해 해당 저장소를 제공하는 것으로 했고, TB 통합을 위해서는 M-CMP/mc-iam-manager 내부 패키지를 사용하는 것이 바람직할 것 같습니다.

테스트를 위한 준비는 끝났고, 문제 없을시 MC-IAM-MANAGER 에서 제공하는 패키지로 경로 변경하심 좋을 것 같습니다...

번거로우시다면, 현재 MC-IAM-MANAGER 패키지 테그 문제가 해결 된 이후 다시 언급드리겠습니다. go version 및 태그를 정리중입니다.

yunkon-kim commented 4 months ago

@raccoon-mh (cc. @dogfootman @seokho-son @powerkimhub @innodreamer)

온라인 회의에서 기존 사항들을 검토 하였고, 다음과 같이 진행하는 것으로 협의되었습니다.

iamtokenvalidator.GetPubkeyIamManager("https://example.com:5000/api/auth/certs")
iamtokenvalidator.Keyfunction
iamtokenvalidator.GetTokenClaimsByIamManagerClaims(accesstoken)

Role 및 Authorization(인가)관련한 기능 및 메커니즘에 대해서는, 이후에 협의가 필요한 사항으로 남겨 놓았습니다.

아래 내용을 참고하시기 바랍니다. (혹시 다르게 설명드린 부분이 있으면, 정정하여 주시기 바랍니다.)

yunkon-kim commented 4 months ago

@raccoon-mh (cc. @dogfootman @seokho-son @powerkimhub @innodreamer)

먼저, 적극적으로 공통 기능과 Pkg를 개발 및 지원해 주셔서 감사드립니다.

MC-IAM-MANAGER에서 제공되는 JWT 관련 공통 기능 및 pkg를 활용하여, CB-Tumblebug에 Echo용 JWT Middleware 적용 및 테스트를 완료하였습니다.

자세한 내용은 아래 PR을 참고하시기 바랍니다.

생각보다 많은 시간이 소요되었지만 유의미한 시간이었다고 생각됩니다. 공통 기능 및 Pkg 개발, 외부에서 pkg 참조를 위한 메커니즘 및 Challenging 포인트 등을 확인할 수 있었기 때문입니다.

이후, 실제로 사용하면서 몇 차례 추가 보완이 있을 것으로 예상합니다. 전체 서브시스템으로 확대 적용 시기를 정하실 때, 이점 참고하시면 될 것 같습니다.