@@ -15,8 +15,8 @@ import (
18− "github.com/bitly/go-simplejson"
19 "github.com/bitly/google_auth_proxy/api"
18 "github.com/bitly/google_auth_proxy/api"
19+ "github.com/bitly/google_auth_proxy/providers"
22const pingPath = "/ping"
22const pingPath = "/ping"
@@ -34,6 +34,7 @@ type OauthProxy struct {
34 Validator func(string) bool
34 Validator func(string) bool
36 redirectUrl *url.URL // the url to receive requests at
36 redirectUrl *url.URL // the url to receive requests at
37+ provider providers.Provider
37 oauthRedemptionUrl *url.URL // endpoint to redeem the code
38 oauthRedemptionUrl *url.URL // endpoint to redeem the code
38 oauthLoginUrl *url.URL // to redirect the user to
39 oauthLoginUrl *url.URL // to redirect the user to
39 oauthScope string
40 oauthScope string
@@ -83,8 +84,6 @@ func setProxyDirector(proxy *httputil.ReverseProxy) {
85func NewOauthProxy(opts *Options, validator func(string) bool) *OauthProxy {
86func NewOauthProxy(opts *Options, validator func(string) bool) *OauthProxy {
86− login, _ := url.Parse("https://accounts.google.com/o/oauth2/auth")
87− redeem, _ := url.Parse("https://accounts.google.com/o/oauth2/token")
88 serveMux := http.NewServeMux()
87 serveMux := http.NewServeMux()
89 for _, u := range opts.proxyUrls {
88 for _, u := range opts.proxyUrls {
90 path := u.Path
89 path := u.Path
@@ -128,9 +127,10 @@ func NewOauthProxy(opts *Options, validator func(string) bool) *OauthProxy {
129 clientID: opts.ClientID,
128 clientID: opts.ClientID,
130 clientSecret: opts.ClientSecret,
129 clientSecret: opts.ClientSecret,
131− oauthScope: "profile email",
130+ oauthScope: opts.provider.Data().Scope,
131+ provider: opts.provider,
132− oauthRedemptionUrl: redeem,
132+ oauthRedemptionUrl: opts.provider.Data().RedeemUrl,
133− oauthLoginUrl: login,
133+ oauthLoginUrl: opts.provider.Data().LoginUrl,
134 serveMux: serveMux,
134 serveMux: serveMux,
135 redirectUrl: redirectUrl,
135 redirectUrl: redirectUrl,
136 skipAuthRegex: opts.SkipAuthRegex,
136 skipAuthRegex: opts.SkipAuthRegex,
@@ -201,23 +201,7 @@ func (p *OauthProxy) redeemCode(host, code string) (string, string, error) {
201 return "", "", err
201 return "", "", err
204− idToken, err := json.Get("id_token").String()
204+ email, err := p.provider.GetEmailAddress(json, access_token)
209− // id_token is a base64 encode ID token payload
210− // https://developers.google.com/accounts/docs/OAuth2Login#obtainuserinfo
211− jwt := strings.Split(idToken, ".")
212− b, err := jwtDecodeSegment(jwt[1])
216− data, err := simplejson.NewJson(b)
220− email, err := data.Get("email").String()
221 if err != nil {
205 if err != nil {
222 return "", "", err
206 return "", "", err
@@ -225,14 +209,6 @@ func (p *OauthProxy) redeemCode(host, code string) (string, string, error) {
225 return access_token, email, nil
209 return access_token, email, nil
228−func jwtDecodeSegment(seg string) ([]byte, error) {
229− if l := len(seg) % 4; l > 0 {
230− seg += strings.Repeat("=", 4-l)
233− return base64.URLEncoding.DecodeString(seg)
236func (p *OauthProxy) ClearCookie(rw http.ResponseWriter, req *http.Request) {
212func (p *OauthProxy) ClearCookie(rw http.ResponseWriter, req *http.Request) {
237 domain := req.Host
213 domain := req.Host
238 if h, _, err := net.SplitHostPort(domain); err == nil {
214 if h, _, err := net.SplitHostPort(domain); err == nil {