git.iko.soy/typeable/oauth2-proxy
on v5.1.0 help sign in
86 lines 1.8 kB history raw
1package providers
3import (
4 "net/http"
5 "net/url"
7 "github.com/pusher/oauth2_proxy/pkg/apis/sessions"
8 "github.com/pusher/oauth2_proxy/pkg/logger"
9 "github.com/pusher/oauth2_proxy/pkg/requests"
12type KeycloakProvider struct {
13 *ProviderData
14 Group string
17func NewKeycloakProvider(p *ProviderData) *KeycloakProvider {
18 p.ProviderName = "Keycloak"
19 if p.LoginURL == nil || p.LoginURL.String() == "" {
20 p.LoginURL = &url.URL{
21 Scheme: "https",
22 Host: "keycloak.org",
23 Path: "/oauth/authorize",
24 }
25 }
26 if p.RedeemURL == nil || p.RedeemURL.String() == "" {
27 p.RedeemURL = &url.URL{
28 Scheme: "https",
29 Host: "keycloak.org",
30 Path: "/oauth/token",
31 }
32 }
33 if p.ValidateURL == nil || p.ValidateURL.String() == "" {
34 p.ValidateURL = &url.URL{
35 Scheme: "https",
36 Host: "keycloak.org",
37 Path: "/api/v3/user",
38 }
39 }
40 if p.Scope == "" {
41 p.Scope = "api"
42 }
43 return &KeycloakProvider{ProviderData: p}
46func (p *KeycloakProvider) SetGroup(group string) {
47 p.Group = group
50func (p *KeycloakProvider) GetEmailAddress(s *sessions.SessionState) (string, error) {
52 req, err := http.NewRequest("GET", p.ValidateURL.String(), nil)
53 req.Header.Set("Authorization", "Bearer "+s.AccessToken)
54 if err != nil {
55 logger.Printf("failed building request %s", err)
56 return "", err
57 }
58 json, err := requests.Request(req)
59 if err != nil {
60 logger.Printf("failed making request %s", err)
61 return "", err
62 }
64 if p.Group != "" {
65 var groups, err = json.Get("groups").Array()
66 if err != nil {
67 logger.Printf("groups not found %s", err)
68 return "", err
69 }
71 var found = false
72 for i := range groups {
73 if groups[i].(string) == p.Group {
74 found = true
75 break
76 }
77 }
79 if found != true {
80 logger.Printf("group not found, access denied")
81 return "", nil
82 }
83 }
85 return json.Get("email").String()