omniauth-ebay 0.0.2
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/.gitignore +5 -0
- data/Gemfile +3 -0
- data/README.md +53 -0
- data/Rakefile +1 -0
- data/lib/ebay_api.rb +72 -0
- data/lib/omniauth-ebay.rb +3 -0
- data/lib/omniauth-ebay/version.rb +5 -0
- data/lib/omniauth/strategies/ebay.rb +71 -0
- data/omniauth-ebay.gemspec +24 -0
- metadata +105 -0
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
OmniAuth eBay
|
2
|
+
====================================
|
3
|
+
|
4
|
+
In this gem you will find an OmniAuth eBay strategy that is compliant with the Open eBay Apps API.
|
5
|
+
You can read all about it here: [Open eBay Apps Developers Zone](http://developer.ebay.com/DevZone/open-ebay-apps/Concepts/OpeneBayUGDev.html)
|
6
|
+
|
7
|
+
Usage
|
8
|
+
------------------------------------------
|
9
|
+
|
10
|
+
Note: The examples are for a Rails app.
|
11
|
+
|
12
|
+
* Add our gem to your `Gemfile`
|
13
|
+
`gem 'omniauth-ebay'`
|
14
|
+
|
15
|
+
* Add to your omniauth initializer (`config/initializers/omniauth.rb`) the ebay strategy like so:
|
16
|
+
|
17
|
+
`Rails.application.config.middleware.use OmniAuth::Builder do
|
18
|
+
|
19
|
+
provider :ebay, "runame", "devid", "appid", "certid", "siteid", "apiurl"
|
20
|
+
|
21
|
+
end`
|
22
|
+
|
23
|
+
Insert your app credentials in the given order. You can find out these details by going into your developer's account at [eBay DevZone](https://developer.ebay.com/DevZone/account/)
|
24
|
+
|
25
|
+
* To use the strategy, you will need to access it's omniauth provider path: `/auth/ebay`. The callback phase path is the default one: `/auth/ebay/callback`.
|
26
|
+
You will need to define the callback path in your relevant app RUname, so don't forget to set the accept/reject paths in the devzone to the callback path.
|
27
|
+
|
28
|
+
* Set a route to the callback path of your sessions controller, and handle the session creation there. You will be able to access
|
29
|
+
the omniauth session data by accessing `request.env['omniauth.auth']`
|
30
|
+
|
31
|
+
How it Works
|
32
|
+
====================================
|
33
|
+
|
34
|
+
Request Phase
|
35
|
+
--------------------
|
36
|
+
|
37
|
+
* API call to eBay, requesting a session id.
|
38
|
+
* Redirecting to eBay login with the session id.
|
39
|
+
|
40
|
+
Callback Phase
|
41
|
+
-----------------------------------------
|
42
|
+
|
43
|
+
* API call to eBay, requesting an ebay auth token, with the secret id and username retrieved from the request.
|
44
|
+
* API call to eBay, requesting the user's info by using the ebay auth token from the last call.
|
45
|
+
* The strategy's UID is the eBay EIAS Token. Also these fields will also be exposed by accessing `request.env['omniauth.auth'].info`:
|
46
|
+
|
47
|
+
`ebay_id` - The user's eBay username.
|
48
|
+
|
49
|
+
`ebay_token` - The current session's auth token, to be used for API calls.
|
50
|
+
|
51
|
+
`email` - The user's email address.
|
52
|
+
* Extra data - We're also passing an optional parameter, `return_to`, which allows you to specify a URL you want the redirect the user to when the authentication process is completed.
|
53
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/lib/ebay_api.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
module EbayAPI
|
2
|
+
|
3
|
+
EBAY_LOGIN_URL = "https://signin.ebay.com/ws/eBayISAPI.dll"
|
4
|
+
X_EBAY_API_REQUEST_CONTENT_TYPE = 'text/xml'
|
5
|
+
X_EBAY_API_COMPATIBILITY_LEVEL = '675'
|
6
|
+
X_EBAY_API_GETSESSIONID_CALL_NAME = 'GetSessionID'
|
7
|
+
X_EBAY_API_FETCHAUTHTOKEN_CALL_NAME = 'FetchToken'
|
8
|
+
X_EBAY_API_GETUSER_CALL_NAME = 'GetUser'
|
9
|
+
|
10
|
+
def generate_session_id
|
11
|
+
request = <<-END
|
12
|
+
<?xml version="1.0" encoding="utf-8"?>
|
13
|
+
<GetSessionIDRequest xmlns="urn:ebay:apis:eBLBaseComponents">
|
14
|
+
<RuName>#{options.runame}</RuName>
|
15
|
+
</GetSessionIDRequest>
|
16
|
+
END
|
17
|
+
|
18
|
+
response = api(X_EBAY_API_GETSESSIONID_CALL_NAME, request)
|
19
|
+
MultiXml.parse(response.content)["GetSessionIDResponse"]["SessionID"]
|
20
|
+
end
|
21
|
+
|
22
|
+
def get_auth_token(username, secret_id)
|
23
|
+
request = <<-END
|
24
|
+
<?xml version="1.0" encoding="utf-8"?>
|
25
|
+
<FetchTokenRequest xmlns="urn:ebay:apis:eBLBaseComponents">
|
26
|
+
<RequesterCredentials>
|
27
|
+
<Username>#{username}</Username>
|
28
|
+
</RequesterCredentials>
|
29
|
+
<SecretID>#{secret_id.gsub(' ', '+')}</SecretID>
|
30
|
+
</FetchTokenRequest>
|
31
|
+
END
|
32
|
+
|
33
|
+
response = api(X_EBAY_API_FETCHAUTHTOKEN_CALL_NAME, request)
|
34
|
+
MultiXml.parse(response.content)["FetchTokenResponse"]["eBayAuthToken"]
|
35
|
+
end
|
36
|
+
|
37
|
+
def get_user_info(auth_token)
|
38
|
+
request = <<-END
|
39
|
+
<?xml version="1.0" encoding="utf-8"?>
|
40
|
+
<GetUserRequest xmlns="urn:ebay:apis:eBLBaseComponents">
|
41
|
+
<RequesterCredentials>
|
42
|
+
<eBayAuthToken>#{auth_token}</eBayAuthToken>
|
43
|
+
</RequesterCredentials>
|
44
|
+
</GetUserRequest>
|
45
|
+
END
|
46
|
+
|
47
|
+
response = api(X_EBAY_API_GETUSER_CALL_NAME, request)
|
48
|
+
MultiXml.parse(response.content)["GetUserResponse"]['User']
|
49
|
+
end
|
50
|
+
|
51
|
+
protected
|
52
|
+
|
53
|
+
def api(call_name, request)
|
54
|
+
headers = ebay_request_headers(call_name, request.length.to_s)
|
55
|
+
http = HTTPClient.new
|
56
|
+
http.post(options.apiurl, request, headers)
|
57
|
+
end
|
58
|
+
|
59
|
+
def ebay_request_headers(call_name, request_length)
|
60
|
+
{
|
61
|
+
'X-EBAY-API-CALL-NAME' => call_name,
|
62
|
+
'X-EBAY-API-COMPATIBILITY-LEVEL' => X_EBAY_API_COMPATIBILITY_LEVEL,
|
63
|
+
'X-EBAY-API-DEV-NAME' => options.devid,
|
64
|
+
'X-EBAY-API-APP-NAME' => options.appid,
|
65
|
+
'X-EBAY-API-CERT-NAME' => options.certid,
|
66
|
+
'X-EBAY-API-SITEID' => options.siteid,
|
67
|
+
'Content-Type' => X_EBAY_API_REQUEST_CONTENT_TYPE,
|
68
|
+
'Content-Length' => request_length
|
69
|
+
}
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'omniauth'
|
2
|
+
|
3
|
+
module OmniAuth
|
4
|
+
module Strategies
|
5
|
+
class Ebay
|
6
|
+
include OmniAuth::Strategy
|
7
|
+
include EbayAPI
|
8
|
+
|
9
|
+
args [:runame, :devid, :appid, :certid, :siteid, :apiurl]
|
10
|
+
option :name, "ebay"
|
11
|
+
option :runame, nil
|
12
|
+
option :devid, nil
|
13
|
+
option :appid, nil
|
14
|
+
option :certid, nil
|
15
|
+
option :siteid, nil
|
16
|
+
option :apiurl, nil
|
17
|
+
|
18
|
+
uid { raw_info['EIASToken'] }
|
19
|
+
info do
|
20
|
+
{
|
21
|
+
:ebay_id => raw_info['UserID'],
|
22
|
+
:ebay_token => @auth_token,
|
23
|
+
:email => raw_info['Email']
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
extra do
|
28
|
+
{
|
29
|
+
:return_to => request.params["return_to"]
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
#1: We'll get to the request_phase by accessing /auth/ebay
|
34
|
+
#2: Request from eBay a SessionID
|
35
|
+
#3: Redirect to eBay Login URL with the RUName and SessionID
|
36
|
+
def request_phase
|
37
|
+
session_id = generate_session_id
|
38
|
+
redirect ebay_login_url(session_id)
|
39
|
+
end
|
40
|
+
|
41
|
+
#4: We'll get to the callback phase by setting our accept/reject URL in the ebay application settings(/auth/ebay/callback)
|
42
|
+
#5: Request an eBay Auth Token with the returned username&secret_id parameters.
|
43
|
+
#6: Request the user info from eBay
|
44
|
+
def callback_phase
|
45
|
+
@auth_token = get_auth_token(request.params["username"], request.params["sid"])
|
46
|
+
@user_info = get_user_info(@auth_token)
|
47
|
+
super
|
48
|
+
rescue Exception => ex
|
49
|
+
fail!("Failed to retrieve user info from ebay", ex)
|
50
|
+
end
|
51
|
+
|
52
|
+
def raw_info
|
53
|
+
@user_info
|
54
|
+
end
|
55
|
+
|
56
|
+
protected
|
57
|
+
|
58
|
+
def ebay_login_url(session_id)
|
59
|
+
#TODO: Refactor ruparams to receive all of the request query string
|
60
|
+
url = "#{EBAY_LOGIN_URL}?SingleSignOn&runame=#{options.runame}&sid=#{URI.escape(session_id).gsub('+', '%2B')}"
|
61
|
+
if request.params[:return_to]
|
62
|
+
url << "&ruparams=#{CGI::escape('return_to=' + request.params['return_to'])}"
|
63
|
+
end
|
64
|
+
return url
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
OmniAuth.config.add_camelization 'ebay', 'Ebay'
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "omniauth-ebay/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "omniauth-ebay"
|
7
|
+
s.version = OmniAuth::Ebay::VERSION
|
8
|
+
s.authors = ["Itay Adler"]
|
9
|
+
s.email = ["itayadler@gmail.com"]
|
10
|
+
s.homepage = "https://github.com/TheGiftsProject/omniauth-ebay"
|
11
|
+
s.summary = %q{OmniAuth strategy for eBay}
|
12
|
+
s.description = %q{In this gem you will find an OmniAuth eBay strategy that is compliant with the Open eBay Apps API.
|
13
|
+
You can read all about it here: [Open eBay Apps Developers Zone](http://developer.ebay.com/DevZone/open-ebay-apps/Concepts/OpeneBayUGDev.html)}
|
14
|
+
|
15
|
+
s.rubyforge_project = "omniauth-ebay"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.add_runtime_dependency 'omniauth', '~> 1.0'
|
23
|
+
s.add_development_dependency 'rspec', '~> 2.7'
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: omniauth-ebay
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 2
|
10
|
+
version: 0.0.2
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Itay Adler
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2012-03-29 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: omniauth
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ~>
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 15
|
29
|
+
segments:
|
30
|
+
- 1
|
31
|
+
- 0
|
32
|
+
version: "1.0"
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: rspec
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 13
|
44
|
+
segments:
|
45
|
+
- 2
|
46
|
+
- 7
|
47
|
+
version: "2.7"
|
48
|
+
type: :development
|
49
|
+
version_requirements: *id002
|
50
|
+
description: |-
|
51
|
+
In this gem you will find an OmniAuth eBay strategy that is compliant with the Open eBay Apps API.
|
52
|
+
You can read all about it here: [Open eBay Apps Developers Zone](http://developer.ebay.com/DevZone/open-ebay-apps/Concepts/OpeneBayUGDev.html)
|
53
|
+
email:
|
54
|
+
- itayadler@gmail.com
|
55
|
+
executables: []
|
56
|
+
|
57
|
+
extensions: []
|
58
|
+
|
59
|
+
extra_rdoc_files: []
|
60
|
+
|
61
|
+
files:
|
62
|
+
- .gitignore
|
63
|
+
- Gemfile
|
64
|
+
- README.md
|
65
|
+
- Rakefile
|
66
|
+
- lib/ebay_api.rb
|
67
|
+
- lib/omniauth-ebay.rb
|
68
|
+
- lib/omniauth-ebay/version.rb
|
69
|
+
- lib/omniauth/strategies/ebay.rb
|
70
|
+
- omniauth-ebay.gemspec
|
71
|
+
homepage: https://github.com/TheGiftsProject/omniauth-ebay
|
72
|
+
licenses: []
|
73
|
+
|
74
|
+
post_install_message:
|
75
|
+
rdoc_options: []
|
76
|
+
|
77
|
+
require_paths:
|
78
|
+
- lib
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
none: false
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
hash: 3
|
85
|
+
segments:
|
86
|
+
- 0
|
87
|
+
version: "0"
|
88
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
hash: 3
|
94
|
+
segments:
|
95
|
+
- 0
|
96
|
+
version: "0"
|
97
|
+
requirements: []
|
98
|
+
|
99
|
+
rubyforge_project: omniauth-ebay
|
100
|
+
rubygems_version: 1.8.17
|
101
|
+
signing_key:
|
102
|
+
specification_version: 3
|
103
|
+
summary: OmniAuth strategy for eBay
|
104
|
+
test_files: []
|
105
|
+
|