git.iko.soy/typeable/oauth2-proxy
on master help sign in
initial version of atlassian-cloud provider
commite4c0388f0d872054061c5adfc7fd2c699388e431 authorAleksei Sizov <a.sizov@typeable.io> dateFri 19 Nov 2021, 16:45 (5 years ago) parentc5a98c6
2 files changed+96
providers/atlassian-cloud.go+94 providers/providers.go+2
providers/atlassian-cloud.gonew file+94
@@ -0,0 +1,94 @@
1+package providers
2+
3+import (
4+ "context"
5+ "net/url"
6+ "errors"
7+
8+ "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/sessions"
9+ "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/requests"
10+)
11+
12+// AtlassianProvider represents an Atlassian based Identity Provider
13+type AtlassianProvider struct {
14+ *ProviderData
15+}
16+
17+var _ Provider = (*AtlassianProvider)(nil)
18+
19+const (
20+ atlassianProviderName = "Atlassian"
21+ atlassianDefaultScope = "read:me"
22+ atlassianPrompt = "consent"
23+ atlassianAudience = "api.atlassian.com"
24+)
25+
26+var (
27+ // Default Login URL for Atlassian.
28+ // Pre-parsed URL of https://atlassian.org/site/oauth2/authorize.
29+ atlassianDefaultLoginURL = &url.URL{
30+ Scheme: "https",
31+ Host: "auth.atlassian.com",
32+ Path: "/authorize",
33+ }
34+
35+ // Default Redeem URL for Atlassian.
36+ // Pre-parsed URL of https://atlassian.org/site/oauth2/access_token.
37+ atlassianDefaultRedeemURL = &url.URL{
38+ Scheme: "https",
39+ Host: "auth.atlassian.com",
40+ Path: "/oauth/token",
41+ }
42+
43+ // Default Validation URL for Atlassian.
44+ // This simply returns the email of the authenticated user.
45+ // Atlassian does not have a Profile URL to use.
46+ // Pre-parsed URL of https://api.atlassian.org/2.0/user/emails.
47+ atlassianDefaultValidateURL = &url.URL{
48+ Scheme: "https",
49+ Host: "api.atlassian.com",
50+ Path: "/me",
51+ }
52+)
53+
54+// NewAtlassianProvider initiates a new AtlassianProvider
55+func NewAtlassianProvider(p *ProviderData) *AtlassianProvider {
56+ p.setProviderDefaults(providerDefaults{
57+ name: atlassianProviderName,
58+ loginURL: atlassianDefaultLoginURL,
59+ redeemURL: atlassianDefaultRedeemURL,
60+ profileURL: nil,
61+ validateURL: atlassianDefaultValidateURL,
62+ scope: atlassianDefaultScope,
63+ })
64+ p.Prompt = atlassianPrompt
65+ return &AtlassianProvider{ProviderData: p}
66+}
67+func (p *AtlassianProvider) GetLoginURL(redirectURI, state, _ string) string {
68+ extraParams := url.Values{}
69+ extraParams.Add("audience", atlassianAudience)
70+ loginURL := makeLoginURL(p.ProviderData, redirectURI, state, extraParams)
71+ return loginURL.String()
72+}
73+func (p *AtlassianProvider) ValidateSession(ctx context.Context, s *sessions.SessionState) bool {
74+ return validateToken(ctx, p, s.AccessToken, makeOIDCHeader(s.AccessToken))
75+}
76+func (p *AtlassianProvider) GetEmailAddress(ctx context.Context, s *sessions.SessionState) (string, error) {
77+ type me_email struct {
78+ Email string `json:"email"`
79+ }
80+ var email me_email
81+ err := requests.New(atlassianDefaultValidateURL.String()).
82+ WithContext(ctx).
83+ WithHeaders(makeOIDCHeader(s.AccessToken)).
84+ Do().
85+ UnmarshalInto(&email)
86+
87+ if err != nil {
88+ return "", err
89+ }
90+ if email.Email == "" {
91+ return "", errors.New("No email in respose")
92+ }
93+ return email.Email, nil
94+}
providers/providers.go+2
@@ -51,6 +51,8 @@ func New(provider string, p *ProviderData) Provider {
5151 return NewDigitalOceanProvider(p)
5252 case "google":
5353 return NewGoogleProvider(p)
54+ case "atlassian":
55+ return NewAtlassianProvider(p)
5456 default:
5557 return nil
5658 }