omniauth-github 1.0.3 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +12 -1
- data/lib/omniauth-github/version.rb +1 -1
- data/lib/omniauth/strategies/github.rb +21 -4
- data/spec/omniauth/strategies/github_spec.rb +78 -11
- metadata +3 -3
data/README.md
CHANGED
@@ -10,7 +10,18 @@ on the [GitHub Applications Page](https://github.com/settings/applications).
|
|
10
10
|
provider :github, ENV['GITHUB_KEY'], ENV['GITHUB_SECRET']
|
11
11
|
end
|
12
12
|
|
13
|
-
|
13
|
+
## Github Enterprise Usage
|
14
|
+
|
15
|
+
provider :github, ENV['GITHUB_KEY'], ENV['GITHUB_SECRET'],
|
16
|
+
{
|
17
|
+
:client_options => {
|
18
|
+
:site => 'https://github.YOURDOMAIN.com/api/v3',
|
19
|
+
:authorize_url => 'https://github.YOURDOMAIN.com/login/oauth/authorize',
|
20
|
+
:token_url => 'https://github.YOURDOMAIN.com/login/oauth/access_token',
|
21
|
+
}
|
22
|
+
}
|
23
|
+
|
24
|
+
## Scopes
|
14
25
|
|
15
26
|
GitHub API v3 lets you set scopes to provide granular access to different types of data:
|
16
27
|
|
@@ -12,6 +12,16 @@ module OmniAuth
|
|
12
12
|
def request_phase
|
13
13
|
super
|
14
14
|
end
|
15
|
+
|
16
|
+
def authorize_params
|
17
|
+
super.tap do |params|
|
18
|
+
%w[scope client_options].each do |v|
|
19
|
+
if request.params[v]
|
20
|
+
params[v.to_sym] = request.params[v]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
15
25
|
|
16
26
|
uid { raw_info['id'].to_s }
|
17
27
|
|
@@ -34,20 +44,27 @@ module OmniAuth
|
|
34
44
|
|
35
45
|
def raw_info
|
36
46
|
access_token.options[:mode] = :query
|
37
|
-
@raw_info ||= access_token.get('
|
47
|
+
@raw_info ||= access_token.get('user').parsed
|
38
48
|
end
|
39
49
|
|
40
50
|
def email
|
41
|
-
raw_info['email'] ||
|
51
|
+
raw_info['email'] || primary_email
|
52
|
+
end
|
53
|
+
|
54
|
+
def primary_email
|
55
|
+
primary = emails.find{|i| i['primary'] }
|
56
|
+
primary && primary['email'] || emails.first && emails.first['email']
|
42
57
|
end
|
43
58
|
|
59
|
+
# The new /user/emails API - http://developer.github.com/v3/users/emails/#future-response
|
44
60
|
def emails
|
61
|
+
return [] unless email_access_allowed?
|
45
62
|
access_token.options[:mode] = :query
|
46
|
-
@emails ||= access_token.get('
|
63
|
+
@emails ||= access_token.get('user/emails', :headers => { 'Accept' => 'application/vnd.github.v3' }).parsed
|
47
64
|
end
|
48
65
|
|
49
66
|
def email_access_allowed?
|
50
|
-
options['scope']
|
67
|
+
options['scope'] =~ /user/
|
51
68
|
end
|
52
69
|
|
53
70
|
end
|
@@ -1,10 +1,33 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe OmniAuth::Strategies::GitHub do
|
4
|
+
let(:access_token) { stub('AccessToken', :options => {}) }
|
5
|
+
let(:parsed_response) { stub('ParsedResponse') }
|
6
|
+
let(:response) { stub('Response', :parsed => parsed_response) }
|
7
|
+
|
8
|
+
let(:enterprise_site) { 'https://some.other.site.com/api/v3' }
|
9
|
+
let(:enterprise_authorize_url) { 'https://some.other.site.com/login/oauth/authorize' }
|
10
|
+
let(:enterprise_token_url) { 'https://some.other.site.com/login/oauth/access_token' }
|
11
|
+
let(:enterprise) do
|
12
|
+
OmniAuth::Strategies::GitHub.new('GITHUB_KEY', 'GITHUB_SECRET',
|
13
|
+
{
|
14
|
+
:client_options => {
|
15
|
+
:site => enterprise_site,
|
16
|
+
:authorize_url => enterprise_authorize_url,
|
17
|
+
:token_url => enterprise_token_url
|
18
|
+
}
|
19
|
+
}
|
20
|
+
)
|
21
|
+
end
|
22
|
+
|
4
23
|
subject do
|
5
24
|
OmniAuth::Strategies::GitHub.new({})
|
6
25
|
end
|
7
26
|
|
27
|
+
before(:each) do
|
28
|
+
subject.stub!(:access_token).and_return(access_token)
|
29
|
+
end
|
30
|
+
|
8
31
|
context "client options" do
|
9
32
|
it 'should have correct site' do
|
10
33
|
subject.options.client_options.site.should eq("https://api.github.com")
|
@@ -17,6 +40,20 @@ describe OmniAuth::Strategies::GitHub do
|
|
17
40
|
it 'should have correct token url' do
|
18
41
|
subject.options.client_options.token_url.should eq('https://github.com/login/oauth/access_token')
|
19
42
|
end
|
43
|
+
|
44
|
+
describe "should be overrideable" do
|
45
|
+
it "for site" do
|
46
|
+
enterprise.options.client_options.site.should eq(enterprise_site)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "for authorize url" do
|
50
|
+
enterprise.options.client_options.authorize_url.should eq(enterprise_authorize_url)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "for token url" do
|
54
|
+
enterprise.options.client_options.token_url.should eq(enterprise_token_url)
|
55
|
+
end
|
56
|
+
end
|
20
57
|
end
|
21
58
|
|
22
59
|
context "#email_access_allowed?" do
|
@@ -25,24 +62,24 @@ describe OmniAuth::Strategies::GitHub do
|
|
25
62
|
subject.should_not be_email_access_allowed
|
26
63
|
end
|
27
64
|
|
28
|
-
it "should not allow email if scope is 'public'" do
|
29
|
-
subject.options['scope'] = 'public'
|
30
|
-
subject.should_not be_email_access_allowed
|
31
|
-
end
|
32
|
-
|
33
65
|
it "should allow email if scope is user" do
|
34
66
|
subject.options['scope'] = 'user'
|
35
67
|
subject.should be_email_access_allowed
|
36
68
|
end
|
37
69
|
|
38
|
-
it "should allow email if scope is
|
39
|
-
subject.options['scope'] = 'user,
|
70
|
+
it "should allow email if scope is a bunch of stuff including user" do
|
71
|
+
subject.options['scope'] = 'public_repo,user,repo,delete_repo,gist'
|
40
72
|
subject.should be_email_access_allowed
|
41
73
|
end
|
42
74
|
|
43
|
-
it "should
|
75
|
+
it "should not allow email if scope is other than user" do
|
76
|
+
subject.options['scope'] = 'repo'
|
77
|
+
subject.should_not be_email_access_allowed
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should assume email access not allowed if scope is something currently not documented " do
|
44
81
|
subject.options['scope'] = 'currently_not_documented'
|
45
|
-
subject.
|
82
|
+
subject.should_not be_email_access_allowed
|
46
83
|
end
|
47
84
|
end
|
48
85
|
|
@@ -57,11 +94,41 @@ describe OmniAuth::Strategies::GitHub do
|
|
57
94
|
subject.email.should be_nil
|
58
95
|
end
|
59
96
|
|
97
|
+
it "should return the primary email if there is no raw_info and email access is allowed" do
|
98
|
+
emails = [
|
99
|
+
{ 'email' => 'secondary@example.com', 'primary' => false },
|
100
|
+
{ 'email' => 'primary@example.com', 'primary' => true }
|
101
|
+
]
|
102
|
+
subject.stub!(:raw_info).and_return({})
|
103
|
+
subject.options['scope'] = 'user'
|
104
|
+
subject.stub!(:emails).and_return(emails)
|
105
|
+
subject.email.should eq('primary@example.com')
|
106
|
+
end
|
107
|
+
|
60
108
|
it "should return the first email if there is no raw_info and email access is allowed" do
|
109
|
+
emails = [
|
110
|
+
{ 'email' => 'first@example.com', 'primary' => false },
|
111
|
+
{ 'email' => 'second@example.com', 'primary' => false }
|
112
|
+
]
|
61
113
|
subject.stub!(:raw_info).and_return({})
|
62
114
|
subject.options['scope'] = 'user'
|
63
|
-
subject.stub!(:emails).and_return(
|
64
|
-
subject.email.should eq('
|
115
|
+
subject.stub!(:emails).and_return(emails)
|
116
|
+
subject.email.should eq('first@example.com')
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
context "#raw_info" do
|
121
|
+
it "should use relative paths" do
|
122
|
+
access_token.should_receive(:get).with('user').and_return(response)
|
123
|
+
subject.raw_info.should eq(parsed_response)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
context "#emails" do
|
128
|
+
it "should use relative paths" do
|
129
|
+
access_token.should_receive(:get).with('user/emails', :headers=>{"Accept"=>"application/vnd.github.v3"}).and_return(response)
|
130
|
+
subject.options['scope'] = 'user'
|
131
|
+
subject.emails.should eq(parsed_response)
|
65
132
|
end
|
66
133
|
end
|
67
134
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: omniauth-github
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-02-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: omniauth
|
@@ -146,7 +146,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
146
146
|
version: '0'
|
147
147
|
requirements: []
|
148
148
|
rubyforge_project:
|
149
|
-
rubygems_version: 1.8.
|
149
|
+
rubygems_version: 1.8.23
|
150
150
|
signing_key:
|
151
151
|
specification_version: 3
|
152
152
|
summary: Official OmniAuth strategy for GitHub.
|