omniauth-twitchtv 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ *.swp
6
+ .DS_Store
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format=progress
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm --create 1.9.3@omniauth-twitchtv
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in omniauth-twitchtv.gemspec
4
+ gemspec
5
+
6
+ group :development, :test do
7
+ gem 'guard'
8
+ gem 'guard-rspec'
9
+ gem 'guard-bundler'
10
+ gem 'growl'
11
+ gem 'rb-fsevent'
12
+ gem 'multi_json'
13
+ end
data/Guardfile ADDED
@@ -0,0 +1,11 @@
1
+ guard 'rspec', :version => 2 do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ end
6
+
7
+
8
+ guard 'bundler' do
9
+ watch('Gemfile')
10
+ watch(/^.+\.gemspec/)
11
+ end
data/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # OmniAuth Twitchtv
2
+
3
+ This gem contains the Twitchtv strategy for OmniAuth 1.0.
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/example/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source :rubygems
2
+
3
+ gem 'sinatra'
4
+ gem 'multi_json'
5
+ gem 'omniauth-twitchtv', :path => '../'
data/example/config.ru ADDED
@@ -0,0 +1,30 @@
1
+ require 'bundler/setup'
2
+ require 'sinatra/base'
3
+ require 'omniauth-twitchtv'
4
+
5
+ class App < Sinatra::Base
6
+ get '/' do
7
+ redirect '/auth/twitchtv'
8
+ end
9
+
10
+ get '/auth/:provider/callback' do
11
+ content_type 'application/json'
12
+ MultiJson.encode(request.env)
13
+ end
14
+
15
+ get '/auth/failure' do
16
+ content_type 'application/json'
17
+ MultiJson.encode(request.env)
18
+ end
19
+ end
20
+
21
+ use Rack::Session::Cookie
22
+
23
+ use OmniAuth::Builder do
24
+ #note that the scope is different from the default
25
+ #we also have to repeat the default fields in order to get
26
+ #the extra 'connections' field in there
27
+ provider :twitchtv, ENV['TWITCHTV_CONSUMER_KEY'], :scope => 'channel_read'
28
+ end
29
+
30
+ run App.new
Binary file
@@ -0,0 +1,127 @@
1
+ require 'omniauth/strategies/oauth'
2
+
3
+ module OmniAuth
4
+ module Strategies
5
+ class Twitchtv
6
+ include OmniAuth::Strategy
7
+
8
+ option :name, "twitchtv"
9
+
10
+ args [:client_id]
11
+
12
+ option :client_id, nil
13
+ option :client_options, {
14
+ :site => 'https://api.twitch.tv',
15
+ :api_url => 'https://api.twitch.tv/kraken',
16
+ :authorize_url => '/kraken/oauth2/authorize',
17
+ :proxy => ENV['http_proxy'] ? URI(ENV['http_proxy']) : nil,
18
+ :callback => nil
19
+ }
20
+ option :authorize_params, {}
21
+ option :authorize_options, [:scope, :response_type]
22
+ option :response_type, 'token'
23
+
24
+ attr_accessor :json
25
+ attr_accessor :access_token
26
+
27
+ def client
28
+ ::OAuth2::Client.new(options.client_id, nil, deep_symbolize(options.client_options))
29
+ end
30
+
31
+ def callback_url
32
+ options.client_options.callback || full_host + script_name + callback_path
33
+ end
34
+
35
+ def request_phase
36
+ redirect client.auth_code.authorize_url({:redirect_uri => callback_url}.merge(authorize_params))
37
+ end
38
+
39
+ def authorize_params
40
+ options.authorize_params.merge(options.authorize_options.inject({}){|h,k| h[k.to_sym] = options[k] if options[k]; h})
41
+ end
42
+
43
+ def callback_phase
44
+ if request.params['error'] || request.params['error_reason']
45
+ raise CallbackError.new(request.params['error'], request.params['error_description'] || request.params['error_reason'], request.params['error_uri'])
46
+ end
47
+
48
+ @json = {}
49
+ self.access_token = request.params["access_token"]
50
+ begin
51
+ response = RestClient.get("#{options.client_options.api_url}/user", { 'Authorization' => "OAuth #{access_token}" })
52
+ user = MultiJson.decode(response.to_s)
53
+ # {
54
+ # "name" => "xxx",
55
+ # "created_at" => "2011-11-17T02:15:55Z",
56
+ # "updated_at" => "2012-09-12T08:40:39Z",
57
+ # "logo" => nil,
58
+ # "_links" => {
59
+ # "self" => "https://api.twitch.tv/kraken/users/xxx"
60
+ # },
61
+ # "staff" => false,
62
+ # "_id" => 23456789,
63
+ # "display_name" => "xxx",
64
+ # "email" => "xxx@gmail.com"
65
+ # }
66
+ @json.merge!(user)
67
+ super
68
+ rescue CallbackError, ::RestClient::Exception => e
69
+ fail!(:invalid_credentials, e)
70
+ rescue ::MultiJson::DecodeError => e
71
+ fail!(:invalid_response, e)
72
+ rescue ::Timeout::Error, ::Errno::ETIMEDOUT => e
73
+ fail!(:timeout, e)
74
+ rescue ::SocketError => e
75
+ fail!
76
+ end
77
+ end
78
+
79
+ credentials do
80
+ {'token' => access_token}
81
+ end
82
+
83
+ uid do
84
+ @json['_id']
85
+ end
86
+
87
+ info do
88
+ {
89
+ :email => @json['email'],
90
+ :nickname => @json['display_name']
91
+ }
92
+ end
93
+
94
+ extra do
95
+ { 'raw_info' => @json }
96
+ end
97
+
98
+ protected
99
+
100
+ def deep_symbolize(hash)
101
+ hash.inject({}) do |h, (k,v)|
102
+ h[k.to_sym] = v.is_a?(Hash) ? deep_symbolize(v) : v
103
+ h
104
+ end
105
+ end
106
+
107
+ def build_access_token
108
+ verifier = request.params['code']
109
+ client.auth_code.get_token(verifier, {:redirect_uri => callback_url}.merge(token_params.to_hash(:symbolize_keys => true)))
110
+ end
111
+
112
+ # An error that is indicated in the OAuth 2.0 callback.
113
+ # This could be a `redirect_uri_mismatch` or other
114
+ class CallbackError < StandardError
115
+ attr_accessor :error, :error_reason, :error_uri
116
+
117
+ def initialize(error, error_reason=nil, error_uri=nil)
118
+ self.error = error
119
+ self.error_reason = error_reason
120
+ self.error_uri = error_uri
121
+ end
122
+ end
123
+
124
+ end
125
+ end
126
+ end
127
+ OmniAuth.config.add_camelization 'twitchtv', 'Twitchtv'
@@ -0,0 +1,5 @@
1
+ module Omniauth
2
+ module Twitchtv
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,8 @@
1
+ require "omniauth-twitchtv/version"
2
+ require 'omniauth/strategies/twitchtv'
3
+
4
+ module Omniauth
5
+ module Twitchtv
6
+ # Your code goes here...
7
+ end
8
+ end
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "omniauth-twitchtv/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "omniauth-twitchtv"
7
+ s.version = Omniauth::Twitchtv::VERSION
8
+ s.authors = ["Claudio Poli"]
9
+ s.email = ["claudio@audiobox.fm"]
10
+ s.homepage = "https://github.com/masterkain/omniauth-twitchtv"
11
+ s.summary = %q{Twitch.TV strategy for OmniAuth.}
12
+ s.description = %q{Twitch.TV strategy for OmniAuth.}
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ s.require_paths = ["lib"]
18
+
19
+ s.add_runtime_dependency 'omniauth-oauth', '~> 1.0'
20
+
21
+ s.add_development_dependency 'rspec', '~> 2.7'
22
+ s.add_development_dependency 'rake'
23
+ s.add_development_dependency 'webmock'
24
+ s.add_development_dependency 'rack-test'
25
+ end
Binary file
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe "OmniAuth::Strategies::Twitchtv" do
4
+ subject do
5
+ OmniAuth::Strategies::Twitchtv.new(nil, @options || {})
6
+ end
7
+
8
+ it 'should add a camelization for itself' do
9
+ OmniAuth::Utils.camelize('twitchtv').should == 'Twitchtv'
10
+ end
11
+
12
+ context 'client options' do
13
+ it 'has correct Twitchtv site' do
14
+ subject.options.client_options.site.should eq('https://api.twitchtv.com')
15
+ end
16
+
17
+ it 'has correct authorize url' do
18
+ subject.options.client_options.authorize_url.should eq('https://api.twitchtv.com/kraken/oauth2/authorize')
19
+ end
20
+ end
21
+
22
+ context '#uid' do
23
+ before :each do
24
+ subject.stub(:raw_info) { { 'id' => '123' } }
25
+ end
26
+
27
+ it 'returns the id from raw_info' do
28
+ subject.uid.should eq('123')
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,14 @@
1
+ $:.unshift File.expand_path('..', __FILE__)
2
+ $:.unshift File.expand_path('../../lib', __FILE__)
3
+
4
+ require 'rspec'
5
+ require 'rack/test'
6
+ require 'webmock/rspec'
7
+ require 'omniauth'
8
+ require 'omniauth-twitchtv'
9
+
10
+ RSpec.configure do |config|
11
+ config.include WebMock::API
12
+ config.include Rack::Test::Methods
13
+ config.extend OmniAuth::Test::StrategyMacros, :type => :strategy
14
+ end
metadata ADDED
@@ -0,0 +1,142 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: omniauth-twitchtv
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Claudio Poli
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2013-01-17 00:00:00 -08:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: omniauth-oauth
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 1
29
+ - 0
30
+ version: "1.0"
31
+ type: :runtime
32
+ version_requirements: *id001
33
+ - !ruby/object:Gem::Dependency
34
+ name: rspec
35
+ prerelease: false
36
+ requirement: &id002 !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ segments:
41
+ - 2
42
+ - 7
43
+ version: "2.7"
44
+ type: :development
45
+ version_requirements: *id002
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ prerelease: false
49
+ requirement: &id003 !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ segments:
54
+ - 0
55
+ version: "0"
56
+ type: :development
57
+ version_requirements: *id003
58
+ - !ruby/object:Gem::Dependency
59
+ name: webmock
60
+ prerelease: false
61
+ requirement: &id004 !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ segments:
66
+ - 0
67
+ version: "0"
68
+ type: :development
69
+ version_requirements: *id004
70
+ - !ruby/object:Gem::Dependency
71
+ name: rack-test
72
+ prerelease: false
73
+ requirement: &id005 !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ segments:
78
+ - 0
79
+ version: "0"
80
+ type: :development
81
+ version_requirements: *id005
82
+ description: Twitch.TV strategy for OmniAuth.
83
+ email:
84
+ - claudio@audiobox.fm
85
+ executables: []
86
+
87
+ extensions: []
88
+
89
+ extra_rdoc_files: []
90
+
91
+ files:
92
+ - .gitignore
93
+ - .rspec
94
+ - .rvmrc
95
+ - Gemfile
96
+ - Guardfile
97
+ - README.md
98
+ - Rakefile
99
+ - example/Gemfile
100
+ - example/config.ru
101
+ - lib/omniauth-twitchtv.rb
102
+ - lib/omniauth-twitchtv/version.rb
103
+ - lib/omniauth/.DS_Store
104
+ - lib/omniauth/strategies/twitchtv.rb
105
+ - omniauth-twitchtv.gemspec
106
+ - spec/omniauth/.DS_Store
107
+ - spec/omniauth/strategies/twitchtv_spec.rb
108
+ - spec/spec_helper.rb
109
+ has_rdoc: true
110
+ homepage: https://github.com/masterkain/omniauth-twitchtv
111
+ licenses: []
112
+
113
+ post_install_message:
114
+ rdoc_options: []
115
+
116
+ require_paths:
117
+ - lib
118
+ required_ruby_version: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ segments:
123
+ - 0
124
+ version: "0"
125
+ required_rubygems_version: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ segments:
130
+ - 0
131
+ version: "0"
132
+ requirements: []
133
+
134
+ rubyforge_project:
135
+ rubygems_version: 1.3.6
136
+ signing_key:
137
+ specification_version: 3
138
+ summary: Twitch.TV strategy for OmniAuth.
139
+ test_files:
140
+ - spec/omniauth/.DS_Store
141
+ - spec/omniauth/strategies/twitchtv_spec.rb
142
+ - spec/spec_helper.rb