git.iko.soy/typeable/oauth2-proxy
on master help sign in
95 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// FacebookProvider represents an Facebook based Identity Provider
13type FacebookProvider struct {
14 *ProviderData
17var _ Provider = (*FacebookProvider)(nil)
19const (
20 facebookProviderName = "Facebook"
21 facebookDefaultScope = "public_profile email"
24var (
25 // Default Login URL for Facebook.
26 // Pre-parsed URL of https://www.facebook.com/v2.5/dialog/oauth.
27 facebookDefaultLoginURL = &url.URL{
28 Scheme: "https",
29 Host: "www.facebook.com",
30 Path: "/v2.5/dialog/oauth",
31 // ?granted_scopes=true
32 }
34 // Default Redeem URL for Facebook.
35 // Pre-parsed URL of https://graph.facebook.com/v2.5/oauth/access_token.
36 facebookDefaultRedeemURL = &url.URL{
37 Scheme: "https",
38 Host: "graph.facebook.com",
39 Path: "/v2.5/oauth/access_token",
40 }
42 // Default Profile URL for Facebook.
43 // Pre-parsed URL of https://graph.facebook.com/v2.5/me.
44 facebookDefaultProfileURL = &url.URL{
45 Scheme: "https",
46 Host: "graph.facebook.com",
47 Path: "/v2.5/me",
48 }
51// NewFacebookProvider initiates a new FacebookProvider
52func NewFacebookProvider(p *ProviderData) *FacebookProvider {
53 p.setProviderDefaults(providerDefaults{
54 name: facebookProviderName,
55 loginURL: facebookDefaultLoginURL,
56 redeemURL: facebookDefaultRedeemURL,
57 profileURL: facebookDefaultProfileURL,
58 validateURL: facebookDefaultProfileURL,
59 scope: facebookDefaultScope,
60 })
61 p.getAuthorizationHeaderFunc = makeOIDCHeader
62 return &FacebookProvider{ProviderData: p}
65// GetEmailAddress returns the Account email address
66func (p *FacebookProvider) GetEmailAddress(ctx context.Context, s *sessions.SessionState) (string, error) {
67 if s.AccessToken == "" {
68 return "", errors.New("missing access token")
69 }
71 type result struct {
72 Email string
73 }
74 var r result
76 requestURL := p.ProfileURL.String() + "?fields=name,email"
77 err := requests.New(requestURL).
78 WithContext(ctx).
79 WithHeaders(makeOIDCHeader(s.AccessToken)).
80 Do().
81 UnmarshalInto(&r)
82 if err != nil {
83 return "", err
84 }
86 if r.Email == "" {
87 return "", errors.New("no email")
88 }
89 return r.Email, nil
92// ValidateSession validates the AccessToken
93func (p *FacebookProvider) ValidateSession(ctx context.Context, s *sessions.SessionState) bool {
94 return validateToken(ctx, p, s.AccessToken, makeOIDCHeader(s.AccessToken))