git.iko.soy/typeable/oauth2-proxy
on master help sign in
90 lines 2.5 kB history raw
1package providers
3import (
4 "context"
5 "errors"
6 "net/url"
8 "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/sessions"
9 "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/requests"
12// DigitalOceanProvider represents a DigitalOcean based Identity Provider
13type DigitalOceanProvider struct {
14 *ProviderData
17var _ Provider = (*DigitalOceanProvider)(nil)
19const (
20 digitalOceanProviderName = "DigitalOcean"
21 digitalOceanDefaultScope = "read"
24var (
25 // Default Login URL for DigitalOcean.
26 // Pre-parsed URL of https://cloud.digitalocean.com/v1/oauth/authorize.
27 digitalOceanDefaultLoginURL = &url.URL{
28 Scheme: "https",
29 Host: "cloud.digitalocean.com",
30 Path: "/v1/oauth/authorize",
31 }
33 // Default Redeem URL for DigitalOcean.
34 // Pre-parsed URL of https://cloud.digitalocean.com/v1/oauth/token.
35 digitalOceanDefaultRedeemURL = &url.URL{
36 Scheme: "https",
37 Host: "cloud.digitalocean.com",
38 Path: "/v1/oauth/token",
39 }
41 // Default Profile URL for DigitalOcean.
42 // Pre-parsed URL of https://cloud.digitalocean.com/v2/account.
43 digitalOceanDefaultProfileURL = &url.URL{
44 Scheme: "https",
45 Host: "api.digitalocean.com",
46 Path: "/v2/account",
47 }
50// NewDigitalOceanProvider initiates a new DigitalOceanProvider
51func NewDigitalOceanProvider(p *ProviderData) *DigitalOceanProvider {
52 p.setProviderDefaults(providerDefaults{
53 name: digitalOceanProviderName,
54 loginURL: digitalOceanDefaultLoginURL,
55 redeemURL: digitalOceanDefaultRedeemURL,
56 profileURL: digitalOceanDefaultProfileURL,
57 validateURL: digitalOceanDefaultProfileURL,
58 scope: digitalOceanDefaultScope,
59 })
60 p.getAuthorizationHeaderFunc = makeOIDCHeader
62 return &DigitalOceanProvider{ProviderData: p}
65// GetEmailAddress returns the Account email address
66func (p *DigitalOceanProvider) GetEmailAddress(ctx context.Context, s *sessions.SessionState) (string, error) {
67 if s.AccessToken == "" {
68 return "", errors.New("missing access token")
69 }
71 json, err := requests.New(p.ProfileURL.String()).
72 WithContext(ctx).
73 WithHeaders(makeOIDCHeader(s.AccessToken)).
74 Do().
75 UnmarshalSimpleJSON()
76 if err != nil {
77 return "", err
78 }
80 email, err := json.GetPath("account", "email").String()
81 if err != nil {
82 return "", err
83 }
84 return email, nil
87// ValidateSession validates the AccessToken
88func (p *DigitalOceanProvider) ValidateSession(ctx context.Context, s *sessions.SessionState) bool {
89 return validateToken(ctx, p, s.AccessToken, makeOIDCHeader(s.AccessToken))