Merge pull request #1591 from dexidp/google-group-whitelist
connector/google: support group whitelisting
This commit is contained in:
		| @@ -29,6 +29,13 @@ connectors: | |||||||
|     # hostedDomains: |     # hostedDomains: | ||||||
|     #  - example.com |     #  - example.com | ||||||
|  |  | ||||||
|  |     # The Google connector supports whitelisting allowed groups when using G Suite | ||||||
|  |     # (Google Apps). The following field can be set to a list of groups | ||||||
|  |     # that can log in: | ||||||
|  |     # | ||||||
|  |     # groups: | ||||||
|  |     #  - admins@example.com | ||||||
|  |  | ||||||
|     # Google does not support the OpenID Connect groups claim and only supports |     # Google does not support the OpenID Connect groups claim and only supports | ||||||
|     # fetching a user's group membership with a service account. |     # fetching a user's group membership with a service account. | ||||||
|     # This service account requires an authentication JSON file and the email |     # This service account requires an authentication JSON file and the email | ||||||
|   | |||||||
| @@ -13,9 +13,10 @@ import ( | |||||||
| 	"golang.org/x/oauth2" | 	"golang.org/x/oauth2" | ||||||
|  |  | ||||||
| 	"github.com/dexidp/dex/connector" | 	"github.com/dexidp/dex/connector" | ||||||
|  | 	pkg_groups "github.com/dexidp/dex/pkg/groups" | ||||||
| 	"github.com/dexidp/dex/pkg/log" | 	"github.com/dexidp/dex/pkg/log" | ||||||
| 	"golang.org/x/oauth2/google" | 	"golang.org/x/oauth2/google" | ||||||
| 	"google.golang.org/api/admin/directory/v1" | 	admin "google.golang.org/api/admin/directory/v1" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| const ( | const ( | ||||||
| @@ -34,6 +35,10 @@ type Config struct { | |||||||
| 	// If this field is nonempty, only users from a listed domain will be allowed to log in | 	// If this field is nonempty, only users from a listed domain will be allowed to log in | ||||||
| 	HostedDomains []string `json:"hostedDomains"` | 	HostedDomains []string `json:"hostedDomains"` | ||||||
|  |  | ||||||
|  | 	// Optional list of whitelisted groups | ||||||
|  | 	// If this field is nonempty, only users from a listed group will be allowed to log in | ||||||
|  | 	Groups []string `json:"groups"` | ||||||
|  |  | ||||||
| 	// Optional path to service account json | 	// Optional path to service account json | ||||||
| 	// If nonempty, and groups claim is made, will use authentication from file to | 	// If nonempty, and groups claim is made, will use authentication from file to | ||||||
| 	// check groups with the admin directory api | 	// check groups with the admin directory api | ||||||
| @@ -84,6 +89,7 @@ func (c *Config) Open(id string, logger log.Logger) (conn connector.Connector, e | |||||||
| 		logger:                 logger, | 		logger:                 logger, | ||||||
| 		cancel:                 cancel, | 		cancel:                 cancel, | ||||||
| 		hostedDomains:          c.HostedDomains, | 		hostedDomains:          c.HostedDomains, | ||||||
|  | 		groups:                 c.Groups, | ||||||
| 		serviceAccountFilePath: c.ServiceAccountFilePath, | 		serviceAccountFilePath: c.ServiceAccountFilePath, | ||||||
| 		adminEmail:             c.AdminEmail, | 		adminEmail:             c.AdminEmail, | ||||||
| 		adminSrv:               srv, | 		adminSrv:               srv, | ||||||
| @@ -103,6 +109,7 @@ type googleConnector struct { | |||||||
| 	cancel                 context.CancelFunc | 	cancel                 context.CancelFunc | ||||||
| 	logger                 log.Logger | 	logger                 log.Logger | ||||||
| 	hostedDomains          []string | 	hostedDomains          []string | ||||||
|  | 	groups                 []string | ||||||
| 	serviceAccountFilePath string | 	serviceAccountFilePath string | ||||||
| 	adminEmail             string | 	adminEmail             string | ||||||
| 	adminSrv               *admin.Service | 	adminSrv               *admin.Service | ||||||
| @@ -211,6 +218,13 @@ func (c *googleConnector) createIdentity(ctx context.Context, identity connector | |||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return identity, fmt.Errorf("google: could not retrieve groups: %v", err) | 			return identity, fmt.Errorf("google: could not retrieve groups: %v", err) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | 		if len(c.groups) > 0 { | ||||||
|  | 			groups = pkg_groups.Filter(groups, c.groups) | ||||||
|  | 			if len(groups) == 0 { | ||||||
|  | 				return identity, fmt.Errorf("google: user %q is not in any of the required groups", claims.Username) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	identity = connector.Identity{ | 	identity = connector.Identity{ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user