livedoorauth 0.0.1
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/History.txt +4 -0
- data/Manifest.txt +9 -0
- data/README.txt +3 -0
- data/Rakefile +82 -0
- data/lib/livedoor/api/auth.rb +108 -0
- data/lib/livedoor/api/version.rb +13 -0
- data/lib/livedoorauth.rb +1 -0
- data/test/template.parameters.rb +7 -0
- data/test/test_auth.rb +41 -0
- metadata +54 -0
data/History.txt
ADDED
data/Manifest.txt
ADDED
data/README.txt
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'rake/clean'
|
4
|
+
require 'rake/testtask'
|
5
|
+
require 'rake/packagetask'
|
6
|
+
require 'rake/gempackagetask'
|
7
|
+
require 'rake/rdoctask'
|
8
|
+
require 'rake/contrib/rubyforgepublisher'
|
9
|
+
require 'fileutils'
|
10
|
+
require 'hoe'
|
11
|
+
include FileUtils
|
12
|
+
require File.join(File.dirname(__FILE__), 'lib', 'livedoor', 'api', 'version')
|
13
|
+
|
14
|
+
AUTHOR = 'zorio' # can also be an array of Authors
|
15
|
+
EMAIL = "zoriorz@gmail.com"
|
16
|
+
DESCRIPTION = "livedoor auth api"
|
17
|
+
GEM_NAME = 'livedoorauth' # what ppl will type to install your gem
|
18
|
+
RUBYFORGE_PROJECT = 'livedoorauth' # The unix name for your project
|
19
|
+
HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
|
20
|
+
DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
|
21
|
+
|
22
|
+
NAME = "livedoorauth"
|
23
|
+
REV = nil # UNCOMMENT IF REQUIRED: File.read(".svn/entries")[/committed-rev="(d+)"/, 1] rescue nil
|
24
|
+
VERS = Livedoor::API::Auth::VERSION::STRING + (REV ? ".#{REV}" : "")
|
25
|
+
CLEAN.include ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store']
|
26
|
+
RDOC_OPTS = ['--quiet', '--title', 'livedoorauth documentation',
|
27
|
+
"--opname", "index.html",
|
28
|
+
"--line-numbers",
|
29
|
+
"--main", "README",
|
30
|
+
"--inline-source"]
|
31
|
+
|
32
|
+
class Hoe
|
33
|
+
def extra_deps
|
34
|
+
@extra_deps.reject { |x| Array(x).first == 'hoe' }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Generate all the Rake tasks
|
39
|
+
# Run 'rake -T' to see list of generated tasks (from gem root directory)
|
40
|
+
hoe = Hoe.new(GEM_NAME, VERS) do |p|
|
41
|
+
p.author = AUTHOR
|
42
|
+
p.description = DESCRIPTION
|
43
|
+
p.email = EMAIL
|
44
|
+
p.summary = DESCRIPTION
|
45
|
+
p.url = HOMEPATH
|
46
|
+
p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
|
47
|
+
p.test_globs = ["test/**/test_*.rb"]
|
48
|
+
p.clean_globs = CLEAN #An array of file patterns to delete on clean.
|
49
|
+
|
50
|
+
# == Optional
|
51
|
+
p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
|
52
|
+
#p.extra_deps = [] # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
|
53
|
+
#p.spec_extras = {} # A hash of extra values to set in the gemspec.
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
desc 'Upload website files to rubyforge'
|
58
|
+
task :website_upload do
|
59
|
+
config = YAML.load(File.read(File.expand_path("~/.rubyforge/user-config.yml")))
|
60
|
+
host = "#{config["username"]}@rubyforge.org"
|
61
|
+
remote_dir = "/var/www/gforge-projects/#{RUBYFORGE_PROJECT}/"
|
62
|
+
# remote_dir = "/var/www/gforge-projects/#{RUBYFORGE_PROJECT}/#{GEM_NAME}"
|
63
|
+
local_dir = 'website'
|
64
|
+
sh %{rsync -av #{local_dir}/ #{host}:#{remote_dir}}
|
65
|
+
end
|
66
|
+
|
67
|
+
desc 'Generate and upload website files'
|
68
|
+
task :website => [:website_generate, :website_upload]
|
69
|
+
|
70
|
+
desc 'Release the website and new gem version'
|
71
|
+
task :deploy => [:check_version, :website, :release]
|
72
|
+
|
73
|
+
task :check_version do
|
74
|
+
unless ENV['VERSION']
|
75
|
+
puts 'Must pass a VERSION=x.y.z release version'
|
76
|
+
exit
|
77
|
+
end
|
78
|
+
unless ENV['VERSION'] == VERS
|
79
|
+
puts "Please update your version.rb to match the release version, currently #{VERS}"
|
80
|
+
exit
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'uri'
|
3
|
+
require 'cgi'
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'openssl'
|
7
|
+
rescue LoadError
|
8
|
+
end
|
9
|
+
|
10
|
+
begin
|
11
|
+
require 'json'
|
12
|
+
rescue LoadError
|
13
|
+
require 'rubygems'
|
14
|
+
require 'json'
|
15
|
+
end
|
16
|
+
|
17
|
+
module Livedoor
|
18
|
+
module API
|
19
|
+
class AuthError < RuntimeError;end
|
20
|
+
class Auth
|
21
|
+
BASE_URI = 'http://auth.livedoor.com/'
|
22
|
+
PATH = {
|
23
|
+
:auth => '/login/',
|
24
|
+
:rpc_auth => '/rpc/auth'
|
25
|
+
}.freeze
|
26
|
+
API_VERSION = '1.0'
|
27
|
+
TIMEOUT = 60 * 10
|
28
|
+
|
29
|
+
attr_accessor :app_key, :secret
|
30
|
+
|
31
|
+
def initialize(options = {})
|
32
|
+
@app_key = options[:app_key]
|
33
|
+
@secret = options[:secret]
|
34
|
+
end
|
35
|
+
|
36
|
+
def uri_to_login(request = {})
|
37
|
+
uri = URI.parse BASE_URI
|
38
|
+
uri.path = PATH[:auth]
|
39
|
+
request[:perms] = 'userhash' unless request.key?(:perms)
|
40
|
+
uri.query = query_with_api_sig(request)
|
41
|
+
uri
|
42
|
+
end
|
43
|
+
|
44
|
+
def validate_response(query)
|
45
|
+
param = {}
|
46
|
+
pr = CGI.parse(query)
|
47
|
+
pr.each do |k,v|
|
48
|
+
param[k.to_sym] = v.first
|
49
|
+
end
|
50
|
+
if param[:sig] == sig(param)
|
51
|
+
raise 'LOCAL TIMEOUT' if param[:t].to_i + TIMEOUT < Time.now.to_i
|
52
|
+
else
|
53
|
+
raise 'INVALID SIG'
|
54
|
+
end
|
55
|
+
{:userdata => param[:userdata], :userhash => param[:userhash], :token => param[:token]}
|
56
|
+
end
|
57
|
+
|
58
|
+
def get_livedoor_id(param)
|
59
|
+
uri = uri_to_auth_rpc(param)
|
60
|
+
result = nil
|
61
|
+
Net::HTTP.start(uri.host) do |http|
|
62
|
+
result = JSON.parse(
|
63
|
+
http.post(uri.path, uri.query,
|
64
|
+
{"Content-type" => "application/x-www-form-urlencoded"}).body)
|
65
|
+
end
|
66
|
+
if result['error'].to_i == 0
|
67
|
+
result['user']['livedoor_id']
|
68
|
+
else
|
69
|
+
raise AuthError.new(result['message'])
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
private
|
75
|
+
def sig(hash)
|
76
|
+
OpenSSL::HMAC::hexdigest(OpenSSL::Digest::SHA1.new, @secret,
|
77
|
+
hash.reject{|k,v| k == :sig}.to_a.sort_by {|i| i.first.to_s}.join)
|
78
|
+
end
|
79
|
+
|
80
|
+
def uri_to_authcheck(cert)
|
81
|
+
uri = URI.parse BASE_URI
|
82
|
+
uri.path = PATH[:json]
|
83
|
+
uri.query = query_with_api_sig(:cert => cert)
|
84
|
+
uri
|
85
|
+
end
|
86
|
+
|
87
|
+
def query_with_api_sig(request = {})
|
88
|
+
query = request.update(:app_key => @app_key)
|
89
|
+
query[:t] = Time.now.to_i
|
90
|
+
query[:v] = API_VERSION
|
91
|
+
query[:sig] = sig(query)
|
92
|
+
query.map {|i| i.join '=' }.join('&')
|
93
|
+
end
|
94
|
+
|
95
|
+
def uri_to_auth_rpc(param)
|
96
|
+
query = {
|
97
|
+
:format => 'json',
|
98
|
+
:token => param[:token]
|
99
|
+
}
|
100
|
+
uri = URI.parse BASE_URI
|
101
|
+
uri.path = PATH[:rpc_auth]
|
102
|
+
uri.query = query_with_api_sig(query)
|
103
|
+
uri
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
data/lib/livedoorauth.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Dir[File.join(File.dirname(__FILE__), 'livedoor/**/*.rb')].sort.each { |lib| require lib }
|
data/test/test_auth.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require File.dirname(__FILE__) + '/../lib/livedoorauth'
|
3
|
+
|
4
|
+
require "parameters"
|
5
|
+
require "rubygems"
|
6
|
+
require "mechanize"
|
7
|
+
require "logger"
|
8
|
+
|
9
|
+
class TestLivedoorAuth < Test::Unit::TestCase
|
10
|
+
|
11
|
+
def setup
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_truth
|
15
|
+
assert true
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_get_login
|
19
|
+
agent = WWW::Mechanize.new do |a| a.log = Logger.new("livedoor.log") end
|
20
|
+
|
21
|
+
#login to livedoor
|
22
|
+
page = agent.get("https://member.livedoor.com/login/")
|
23
|
+
form = page.forms[0]
|
24
|
+
form["livedoor_id"] = ACCOUNT
|
25
|
+
form["password"] = PASSWORD
|
26
|
+
page = agent.submit(form)
|
27
|
+
|
28
|
+
#get auth info
|
29
|
+
agent.redirect_ok = false
|
30
|
+
auth = Livedoor::API::Auth.new(:app_key => APPKEY, :secret => SECRET)
|
31
|
+
uri = auth.uri_to_login(:perms=>'id')
|
32
|
+
page = agent.get(uri.to_s)
|
33
|
+
uri = URI.parse(page.response['location'])
|
34
|
+
user = auth.validate_response(uri.query)
|
35
|
+
assert_not_nil(user[:userhash])
|
36
|
+
|
37
|
+
#get livedoor id
|
38
|
+
id = auth.get_livedoor_id(user)
|
39
|
+
assert_equal(ACCOUNT, id)
|
40
|
+
end
|
41
|
+
end
|
metadata
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.9.2
|
3
|
+
specification_version: 1
|
4
|
+
name: livedoorauth
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 0.0.1
|
7
|
+
date: 2007-04-21 00:00:00 +09:00
|
8
|
+
summary: livedoor auth api
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: zoriorz@gmail.com
|
12
|
+
homepage: http://livedoorauth.rubyforge.org
|
13
|
+
rubyforge_project: livedoorauth
|
14
|
+
description: livedoor auth api
|
15
|
+
autorequire:
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: true
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
24
|
+
version:
|
25
|
+
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
28
|
+
post_install_message:
|
29
|
+
authors:
|
30
|
+
- zorio
|
31
|
+
files:
|
32
|
+
- Manifest.txt
|
33
|
+
- README.txt
|
34
|
+
- History.txt
|
35
|
+
- Rakefile
|
36
|
+
- lib/livedoorauth.rb
|
37
|
+
- lib/livedoor/api/auth.rb
|
38
|
+
- lib/livedoor/api/version.rb
|
39
|
+
- test/test_auth.rb
|
40
|
+
- test/template.parameters.rb
|
41
|
+
test_files:
|
42
|
+
- test/test_auth.rb
|
43
|
+
rdoc_options: []
|
44
|
+
|
45
|
+
extra_rdoc_files: []
|
46
|
+
|
47
|
+
executables: []
|
48
|
+
|
49
|
+
extensions: []
|
50
|
+
|
51
|
+
requirements: []
|
52
|
+
|
53
|
+
dependencies: []
|
54
|
+
|