9 "github.com/bitly/go-simplejson"
10 "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/options"
11 "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/sessions"
12 "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/logger"
13 "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/requests"
16type GroupsClaimList []GroupClaimEntry
18type GroupClaimEntry struct {
19 GroupID string `json:"groupId"`
20 Roles []string `json:"roles"`
23// CIDAASProvider represents an CIDAAS based Identity Provider
24type CIDAASProvider struct {
28var _ Provider = (*CIDAASProvider)(nil)
31 CidaasProviderName = "CIDAAS"
32 CidaasGroupName = "cidaas"
33 CidaasDefaultScope = "openid email profile roles groups"
36// NewCIDAASProvider initiates a new CIDAASProvider
37func NewCIDAASProvider(p *ProviderData, opts options.Provider) *CIDAASProvider {
38 p.setProviderDefaults(providerDefaults{
39 name: CidaasProviderName,
40 scope: CidaasDefaultScope,
43 return &CIDAASProvider{
44 OIDCProvider: NewOIDCProvider(p, opts.OIDCConfig),
48// RefreshSession uses the RefreshToken to fetch new Access and ID Tokens
49func (p *CIDAASProvider) RefreshSession(ctx context.Context, s *sessions.SessionState) (bool, error) {
50 if s == nil || s.RefreshToken == "" {
54 if err := p.redeemRefreshToken(ctx, s); err != nil {
55 return false, fmt.Errorf("unable to redeem refresh token: %w", err)
58 if err := p.EnrichSession(ctx, s); err != nil {
59 return false, fmt.Errorf("unable to enrich session data after refresh: %w %v", err, s)
65// EnrichSession data to add email an groups
66func (p *CIDAASProvider) EnrichSession(ctx context.Context, s *sessions.SessionState) error {
67 if p.ProfileURL.String() == "" && s.Email == "" {
68 return errors.New("id_token did not contain an email and profileURL is not defined")
69 } else if p.ProfileURL.String() == "" {
73 // Try to get missing emails or groups from a profileURL
74 if err := p.enrichFromUserinfoEndpoint(ctx, s); err != nil {
75 logger.Errorf("Warning: Profile URL request failed: %s", err)
78 // If a mandatory email wasn't set, error at this point.
80 return errors.New("neither the id_token nor the profileURL set an email")
85// enrichFromUserinfoEndpoint enriches a session's Email & Groups via the JSON response of
87func (p *CIDAASProvider) enrichFromUserinfoEndpoint(ctx context.Context, s *sessions.SessionState) error {
88 // profile url is userinfo url in case of Cidaas
89 respJSON, err := requests.New(p.ProfileURL.String()).
91 WithHeaders(makeOIDCHeader(s.AccessToken)).
98 email, err := respJSON.Get(p.EmailClaim).String()
99 if err == nil && s.Email == "" {
103 groups, err := p.extractGroups(respJSON)
105 return fmt.Errorf("extracting groups failed: %w", err)
112func (p *CIDAASProvider) extractGroups(respJSON *simplejson.Json) ([]string, error) {
113 rawGroupsClaim, err := respJSON.Get(p.GroupsClaim).MarshalJSON()
118 var groupsClaimList GroupsClaimList
119 err = json.Unmarshal(rawGroupsClaim, &groupsClaimList)
125 for _, group := range groupsClaimList {
126 for _, role := range group.Roles {
127 groups = append(groups, fmt.Sprintf("%s:%s", group.GroupID, role))
131 // Cidaas specific roles
132 if rolesVal, rolesClaimExists := respJSON.CheckGet("roles"); rolesClaimExists {
133 cidaasRoles, err := rolesVal.StringArray()
135 return nil, fmt.Errorf("unmarshal roles failed: %w", err)
138 for _, role := range cidaasRoles {
139 groups = append(groups, fmt.Sprintf("%s:%s", CidaasGroupName, role))
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list