git.iko.soy/typeable/oauth2-proxy
on master help sign in
Merge pull request #109 from jehiah/github_org_109

Github provider "Invalid Account"

commit13e82923f0757399ed8c8918b60179351eac3d0e authorJehiah Czebotar <jehiah@gmail.com> dateSat 6 Jun 2015, 14:54 (11 years ago) parentb313e99a6694ad
1 file changed+51−6
providers/github.go+51−6
providers/github.go+51−6
@@ -49,7 +49,45 @@ func (p *GitHubProvider) SetOrgTeam(org, team string) {
4949 }
5050}
5151
52+func (p *GitHubProvider) hasOrg(accessToken string) (bool, error) {
53+ // https://developer.github.com/v3/orgs/#list-your-organizations
54+
55+ var orgs []struct {
56+ Login string `json:"login"`
57+ }
58+
59+ params := url.Values{
60+ "access_token": {accessToken},
61+ "limit": {"100"},
62+ }
63+
64+ req, _ := http.NewRequest("GET", "https://api.github.com/user/orgs?"+params.Encode(), nil)
65+ req.Header.Set("Accept", "application/vnd.github.moondragon+json")
66+ resp, err := http.DefaultClient.Do(req)
67+ if err != nil {
68+ return false, err
69+ }
70+
71+ body, err := ioutil.ReadAll(resp.Body)
72+ resp.Body.Close()
73+ if err != nil {
74+ return false, err
75+ }
76+
77+ if err := json.Unmarshal(body, &orgs); err != nil {
78+ return false, err
79+ }
80+
81+ for _, org := range orgs {
82+ if p.Org == org.Login {
83+ return true, nil
84+ }
85+ }
86+ return false, nil
87+}
88+
5289func (p *GitHubProvider) hasOrgAndTeam(accessToken string) (bool, error) {
90+ // https://developer.github.com/v3/orgs/teams/#list-user-teams
5391
5492 var teams []struct {
5593 Name string `json:"name"`
@@ -61,6 +99,7 @@ func (p *GitHubProvider) hasOrgAndTeam(accessToken string) (bool, error) {
6199
62100 params := url.Values{
63101 "access_token": {accessToken},
102+ "limit": {"100"},
64103 }
65104
66105 req, _ := http.NewRequest("GET", "https://api.github.com/user/teams?"+params.Encode(), nil)
@@ -97,17 +136,23 @@ func (p *GitHubProvider) GetEmailAddress(body []byte, access_token string) (stri
97136 Primary bool `json:"primary"`
98137 }
99138
100− params := url.Values{
101− "access_token": {access_token},
102− }
103139
104140 // if we require an Org or Team, check that first
105− if p.Org != "" || p.Team != "" {
106− if ok, err := p.hasOrgAndTeam(access_token); err != nil || !ok {
107− return "", err
141+ if p.Org != "" {
142+ if p.Team != "" {
143+ if ok, err := p.hasOrgAndTeam(access_token); err != nil || !ok {
144+ return "", err
145+ }
146+ } else {
147+ if ok, err := p.hasOrg(access_token); err != nil || !ok {
148+ return "", err
149+ }
108150 }
109151 }
110152
153+ params := url.Values{
154+ "access_token": {access_token},
155+ }
111156 resp, err := http.DefaultClient.Get("https://api.github.com/user/emails?" + params.Encode())
112157 if err != nil {
113158 return "", err