func (c *uaaOAuth2Connector) Identity(cli chttp.Client) (oidc.Identity, error) { uaaUserInfoURL := *c.uaaBaseURL uaaUserInfoURL.Path = path.Join(uaaUserInfoURL.Path, "/userinfo") req, err := http.NewRequest("GET", uaaUserInfoURL.String(), nil) if err != nil { return oidc.Identity{}, err } resp, err := cli.Do(req) if err != nil { return oidc.Identity{}, fmt.Errorf("get: %v", err) } defer resp.Body.Close() switch { case resp.StatusCode >= 400 && resp.StatusCode < 600: // attempt to decode error from UAA var authErr uaaError if err := json.NewDecoder(resp.Body).Decode(&authErr); err != nil { return oidc.Identity{}, oauth2.NewError(oauth2.ErrorAccessDenied) } return oidc.Identity{}, authErr case resp.StatusCode == http.StatusOK: default: return oidc.Identity{}, fmt.Errorf("unexpected status from providor %s", resp.Status) } var user struct { UserID string `json:"user_id"` Email string `json:"email"` Name string `json:"name"` UserName string `json:"user_name"` } if err := json.NewDecoder(resp.Body).Decode(&user); err != nil { return oidc.Identity{}, fmt.Errorf("getting user info: %v", err) } name := user.Name if name == "" { name = user.UserName } return oidc.Identity{ ID: user.UserID, Name: name, Email: user.Email, }, nil }
func (c *githubOAuth2Connector) Identity(cli chttp.Client) (oidc.Identity, error) { req, err := http.NewRequest("GET", githubAPIUserURL, nil) if err != nil { return oidc.Identity{}, err } resp, err := cli.Do(req) if err != nil { return oidc.Identity{}, fmt.Errorf("get: %v", err) } defer resp.Body.Close() switch { case resp.StatusCode >= 400 && resp.StatusCode < 600: // attempt to decode error from github var authErr githubError if err := json.NewDecoder(resp.Body).Decode(&authErr); err != nil { return oidc.Identity{}, oauth2.NewError(oauth2.ErrorAccessDenied) } return oidc.Identity{}, authErr case resp.StatusCode == http.StatusOK: default: return oidc.Identity{}, fmt.Errorf("unexpected status from providor %s", resp.Status) } var user struct { Login string `json:"login"` ID int64 `json:"id"` Email string `json:"email"` Name string `json:"name"` } if err := json.NewDecoder(resp.Body).Decode(&user); err != nil { return oidc.Identity{}, fmt.Errorf("getting user info: %v", err) } name := user.Name if name == "" { name = user.Login } return oidc.Identity{ ID: strconv.FormatInt(user.ID, 10), Name: name, Email: user.Email, }, nil }
func getAndDecode(cli chttp.Client, url string, v interface{}) error { req, err := http.NewRequest("GET", url, nil) if err != nil { return err } resp, err := cli.Do(req) if err != nil { return fmt.Errorf("get: %v", err) } defer resp.Body.Close() switch { case resp.StatusCode >= 400 && resp.StatusCode < 500: return oauth2.NewError(oauth2.ErrorAccessDenied) case resp.StatusCode == http.StatusOK: default: return fmt.Errorf("unexpected status from providor %s", resp.Status) } if err := json.NewDecoder(resp.Body).Decode(v); err != nil { return fmt.Errorf("decode body: %v", err) } return nil }
func (c *facebookOAuth2Connector) Identity(cli chttp.Client) (oidc.Identity, error) { var user struct { ID string `json:"id"` Email string `json:"email"` Name string `json:"name"` } req, err := http.NewRequest("GET", facebookGraphAPIURL, nil) if err != nil { return oidc.Identity{}, err } resp, err := cli.Do(req) if err != nil { return oidc.Identity{}, fmt.Errorf("get: %v", err) } defer resp.Body.Close() switch { case resp.StatusCode >= 400 && resp.StatusCode < 600: var authErr facebookErr if err := json.NewDecoder(resp.Body).Decode(&authErr); err != nil { return oidc.Identity{}, oauth2.NewError(oauth2.ErrorAccessDenied) } return oidc.Identity{}, authErr case resp.StatusCode == http.StatusOK: default: return oidc.Identity{}, fmt.Errorf("unexpected status from providor %s", resp.Status) } if err := json.NewDecoder(resp.Body).Decode(&user); err != nil { return oidc.Identity{}, fmt.Errorf("decode body: %v", err) } return oidc.Identity{ ID: user.ID, Name: user.Name, Email: user.Email, }, nil }