auth/internal/metadata/delivery/http/metadata_http.go

78 lines
2.6 KiB
Go

package http
import (
"net/http"
"github.com/goccy/go-json"
"source.toby3d.me/toby3d/auth/internal/common"
"source.toby3d.me/toby3d/auth/internal/domain"
)
type Handler struct {
metadata *domain.Metadata
}
func NewHandler(metadata *domain.Metadata) *Handler {
return &Handler{
metadata: metadata,
}
}
func (h *Handler) Handler() http.Handler {
return http.HandlerFunc(h.handleFunc)
}
func (h *Handler) handleFunc(w http.ResponseWriter, r *http.Request) {
if r.Method != "" && r.Method != http.MethodGet {
http.Error(w, http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed)
return
}
w.Header().Set(common.HeaderContentType, common.MIMEApplicationJSONCharsetUTF8)
scopes, responseTypes, grantTypes, codeChallengeMethods := make([]string, 0), make([]string, 0),
make([]string, 0), make([]string, 0)
for i := range h.metadata.ScopesSupported {
scopes = append(scopes, h.metadata.ScopesSupported[i].String())
}
for i := range h.metadata.ResponseTypesSupported {
responseTypes = append(responseTypes, h.metadata.ResponseTypesSupported[i].String())
}
for i := range h.metadata.GrantTypesSupported {
grantTypes = append(grantTypes, h.metadata.GrantTypesSupported[i].String())
}
for i := range h.metadata.CodeChallengeMethodsSupported {
codeChallengeMethods = append(codeChallengeMethods,
h.metadata.CodeChallengeMethodsSupported[i].String())
}
_ = json.NewEncoder(w).Encode(&MetadataResponse{
AuthorizationEndpoint: h.metadata.AuthorizationEndpoint.String(),
IntrospectionEndpoint: h.metadata.IntrospectionEndpoint.String(),
Issuer: h.metadata.Issuer.String(),
RevocationEndpoint: h.metadata.RevocationEndpoint.String(),
ServiceDocumentation: h.metadata.ServiceDocumentation.String(),
TokenEndpoint: h.metadata.TokenEndpoint.String(),
UserinfoEndpoint: h.metadata.UserinfoEndpoint.String(),
AuthorizationResponseIssParameterSupported: h.metadata.AuthorizationResponseIssParameterSupported,
CodeChallengeMethodsSupported: codeChallengeMethods,
GrantTypesSupported: grantTypes,
IntrospectionEndpointAuthMethodsSupported: h.metadata.IntrospectionEndpointAuthMethodsSupported,
ResponseTypesSupported: responseTypes,
ScopesSupported: scopes,
// NOTE(toby3d): If a revocation endpoint is provided, this
// property should also be provided with the value ["none"],
// since the omission of this value defaults to
// client_secret_basic according to RFC8414.
RevocationEndpointAuthMethodsSupported: h.metadata.RevocationEndpointAuthMethodsSupported,
})
w.WriteHeader(http.StatusOK)
}