41 lines
1.2 KiB
Go
41 lines
1.2 KiB
Go
package controller
|
|
|
|
import (
|
|
"context"
|
|
|
|
oapimw "github.com/nhost/nhost/internal/lib/oapi/middleware"
|
|
"github.com/nhost/nhost/services/auth/go/api"
|
|
"golang.org/x/oauth2"
|
|
)
|
|
|
|
func (ctrl *Controller) RefreshProviderToken( //nolint:ireturn
|
|
ctx context.Context, req api.RefreshProviderTokenRequestObject,
|
|
) (api.RefreshProviderTokenResponseObject, error) {
|
|
logger := oapimw.LoggerFromContext(ctx)
|
|
logger = logger.With("provider", req.Provider)
|
|
|
|
provider := ctrl.Providers.Get(string(req.Provider))
|
|
if provider == nil {
|
|
logger.ErrorContext(ctx, "provider not enabled")
|
|
return ctrl.sendError(ErrDisabledEndpoint), nil
|
|
}
|
|
|
|
if !provider.IsOauth2() {
|
|
logger.ErrorContext(ctx, "provider does not support OAuth2")
|
|
return ctrl.sendError(ErrOauthProviderError), nil
|
|
}
|
|
|
|
token, err := provider.Oauth2().Exchange(
|
|
ctx,
|
|
"",
|
|
oauth2.SetAuthURLParam("grant_type", "refresh_token"),
|
|
oauth2.SetAuthURLParam("refresh_token", req.Body.RefreshToken),
|
|
)
|
|
if err != nil {
|
|
logger.ErrorContext(ctx, "failed to exchange code for token", "error", err)
|
|
return ctrl.sendError(ErrOauthProviderError), nil
|
|
}
|
|
|
|
return api.RefreshProviderToken200JSONResponse(tokenToProviderSession(token)), nil
|
|
}
|