11 "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/options"
12 "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/sessions"
13 . "github.com/onsi/ginkgo/v2"
14 . "github.com/onsi/gomega"
18 keycloakAccessToken = "eyJKeycloak.eyJAccess.Token"
19 keycloakUserinfoPath = "/api/v3/user"
22func testKeycloakProvider(backend *httptest.Server) (*KeycloakProvider, error) {
23 p := NewKeycloakProvider(
27 RedeemURL: &url.URL{},
28 ProfileURL: &url.URL{},
29 ValidateURL: &url.URL{},
31 options.KeycloakOptions{})
34 bURL, err := url.Parse(backend.URL)
40 updateURL(p.Data().LoginURL, hostname)
41 updateURL(p.Data().RedeemURL, hostname)
42 updateURL(p.Data().ProfileURL, hostname)
43 updateURL(p.Data().ValidateURL, hostname)
49var _ = Describe("Keycloak Provider Tests", func() {
50 Context("New Provider Init", func() {
51 It("uses defaults", func() {
52 providerData := NewKeycloakProvider(&ProviderData{}, options.KeycloakOptions{}).Data()
53 Expect(providerData.ProviderName).To(Equal("Keycloak"))
54 Expect(providerData.LoginURL.String()).To(Equal("https://keycloak.org/oauth/authorize"))
55 Expect(providerData.RedeemURL.String()).To(Equal("https://keycloak.org/oauth/token"))
56 Expect(providerData.ProfileURL.String()).To(Equal(""))
57 Expect(providerData.ValidateURL.String()).To(Equal("https://keycloak.org/api/v3/user"))
58 Expect(providerData.Scope).To(Equal("api"))
61 It("overrides defaults", func() {
62 p := NewKeycloakProvider(
71 Path: "/oauth/token"},
75 Path: "/api/v3/user"},
76 ValidateURL: &url.URL{
79 Path: "/api/v3/user"},
81 options.KeycloakOptions{})
82 providerData := p.Data()
84 Expect(providerData.ProviderName).To(Equal("Keycloak"))
85 Expect(providerData.LoginURL.String()).To(Equal("https://example.com/oauth/auth"))
86 Expect(providerData.RedeemURL.String()).To(Equal("https://example.com/oauth/token"))
87 Expect(providerData.ProfileURL.String()).To(Equal("https://example.com/api/v3/user"))
88 Expect(providerData.ValidateURL.String()).To(Equal("https://example.com/api/v3/user"))
89 Expect(providerData.Scope).To(Equal("profile"))
93 Context("EnrichSession", func() {
94 type enrichSessionTableInput struct {
95 backendHandler http.HandlerFunc
98 expectedGroups []string
101 DescribeTable("should return expected results",
102 func(in enrichSessionTableInput) {
103 backend := httptest.NewServer(in.backendHandler)
104 p, err := testKeycloakProvider(backend)
105 Expect(err).To(BeNil())
107 p.ProfileURL, err = url.Parse(
108 fmt.Sprintf("%s%s", backend.URL, keycloakUserinfoPath),
110 Expect(err).To(BeNil())
112 session := &sessions.SessionState{AccessToken: keycloakAccessToken}
113 err = p.EnrichSession(context.Background(), session)
115 if in.expectedError != nil {
116 Expect(err).To(Equal(in.expectedError))
118 Expect(err).To(BeNil())
121 Expect(session.Email).To(Equal(in.expectedEmail))
123 if in.expectedGroups != nil {
124 Expect(session.Groups).To(Equal(in.expectedGroups))
126 Expect(session.Groups).To(BeNil())
129 Entry("email and multiple groups", enrichSessionTableInput{
130 backendHandler: func(w http.ResponseWriter, _ *http.Request) {
132 _, err := w.Write([]byte(`
134 "email": "michael.bland@gsa.gov",
146 expectedEmail: "michael.bland@gsa.gov",
147 expectedGroups: []string{"test-grp1", "test-grp2"},
149 Entry("email and single group", enrichSessionTableInput{
150 backendHandler: func(w http.ResponseWriter, _ *http.Request) {
152 _, err := w.Write([]byte(`
154 "email": "michael.bland@gsa.gov",
155 "groups": ["test-grp1"]
163 expectedEmail: "michael.bland@gsa.gov",
164 expectedGroups: []string{"test-grp1"},
166 Entry("email and no groups", enrichSessionTableInput{
167 backendHandler: func(w http.ResponseWriter, _ *http.Request) {
169 _, err := w.Write([]byte(`
171 "email": "michael.bland@gsa.gov"
179 expectedEmail: "michael.bland@gsa.gov",
182 Entry("missing email", enrichSessionTableInput{
183 backendHandler: func(w http.ResponseWriter, _ *http.Request) {
185 _, err := w.Write([]byte(`
197 expectedError: errors.New(
198 "unable to extract email from userinfo endpoint: type assertion to string failed"),
200 expectedGroups: []string{"test-grp1", "test-grp2"},
202 Entry("request failure", enrichSessionTableInput{
203 backendHandler: func(w http.ResponseWriter, _ *http.Request) {
206 expectedError: errors.New(`unexpected status "500": `),
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