hatenaapiauth 0.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 +29 -0
- data/Rakefile +83 -0
- data/VERSION +1 -0
- data/examples/example.cgi +38 -0
- data/install.rb +12 -0
- data/lib/hatena/api/auth.rb +72 -0
- data/test/method_test.rb +18 -0
- metadata +66 -0
data/README
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
= Hatena::API::Auth -- Hatena Authentication API
|
2
|
+
|
3
|
+
== SYNOPSIS
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
require 'hatena/api/auth'
|
7
|
+
hatena_auth = Hatena::API::Auth.new(:api_key => YOUR_API_KEY, :secret => YOUR_SECRET_KEY)
|
8
|
+
|
9
|
+
# login_uri generate
|
10
|
+
hatena_auth.uri_to_login
|
11
|
+
#=> http://auth.hatena.ne.jp/auth?api_sig=09f68bcc0127f0eafebae1c6370c2bf0&api_key=d93fffa627f03c2c641353110e4d1316
|
12
|
+
|
13
|
+
# login check
|
14
|
+
hatena_auth.login(cert)
|
15
|
+
|
16
|
+
== NOTES
|
17
|
+
see examples/example.cgi.
|
18
|
+
|
19
|
+
== Installation
|
20
|
+
|
21
|
+
# gem install hatenaapiauth
|
22
|
+
|
23
|
+
== License
|
24
|
+
|
25
|
+
Hatena::API::Auth is released under the MIT license.
|
26
|
+
|
27
|
+
== Author
|
28
|
+
|
29
|
+
secondlife@no.spam@hatena.ne.jp
|
data/Rakefile
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'rake/gempackagetask'
|
2
|
+
|
3
|
+
require 'rbconfig'
|
4
|
+
include Config
|
5
|
+
|
6
|
+
PKG_NAME = 'hatenaapiauth'
|
7
|
+
PKG_VERSION = File.read('VERSION').chomp
|
8
|
+
PKG_FILES = FileList["**/*"].exclude(".svn").exclude("pkg")
|
9
|
+
|
10
|
+
desc "Installing library"
|
11
|
+
task :install do
|
12
|
+
ruby 'install.rb'
|
13
|
+
end
|
14
|
+
|
15
|
+
desc "Testing library"
|
16
|
+
task :test do
|
17
|
+
ruby 'test/method_test.rb'
|
18
|
+
end
|
19
|
+
|
20
|
+
desc "Removing generated files"
|
21
|
+
task :clean do
|
22
|
+
rm_rf 'doc'
|
23
|
+
end
|
24
|
+
|
25
|
+
# Create RDOC documentation.
|
26
|
+
task :doc do
|
27
|
+
sh 'rdoc -d -S -o doc README lib/hatena/api/auth.rb'
|
28
|
+
end
|
29
|
+
|
30
|
+
spec = Gem::Specification.new do |s|
|
31
|
+
#### Basic information.
|
32
|
+
|
33
|
+
s.name = 'hatenaapiauth'
|
34
|
+
s.version = PKG_VERSION
|
35
|
+
s.summary = "Hatena Authentication API."
|
36
|
+
s.description = ""
|
37
|
+
|
38
|
+
#### Dependencies and requirements.
|
39
|
+
|
40
|
+
s.add_dependency('json', '>= 0.4.1')
|
41
|
+
s.requirements << "json"
|
42
|
+
|
43
|
+
s.files = PKG_FILES
|
44
|
+
|
45
|
+
#### C code extensions.
|
46
|
+
|
47
|
+
#s.extensions << "ext/extconf.rb"
|
48
|
+
|
49
|
+
#### Load-time details: library and application (you will need one or both).
|
50
|
+
|
51
|
+
s.require_path = 'lib' # Use these for libraries.
|
52
|
+
s.autorequire = 'hatena/api/auth'
|
53
|
+
|
54
|
+
# s.bindir = "bin" # Use these for applications.
|
55
|
+
# s.executables = ["hatenaapiauth.rb"]
|
56
|
+
# s.default_executable = "hatenaapiauth.rb"
|
57
|
+
|
58
|
+
#### Documentation and testing.
|
59
|
+
|
60
|
+
s.has_rdoc = true
|
61
|
+
#s.extra_rdoc_files = rd.rdoc_files.reject { |fn| fn =~ /\.rb$/ }.to_a
|
62
|
+
s.extra_rdoc_files = 'README'
|
63
|
+
s.rdoc_options << '--line-numbers' << '--inline-source' << '-A cattr_accessor=object'
|
64
|
+
#s.rdoc_options <<
|
65
|
+
# '--title' << 'Rake -- Ruby Make' <<
|
66
|
+
# '--main' << 'README' <<
|
67
|
+
# '--line-numbers'
|
68
|
+
s.test_files << 'test/method_test.rb'
|
69
|
+
|
70
|
+
#### Author and project details.
|
71
|
+
|
72
|
+
s.author = "Yuichi Tateno"
|
73
|
+
s.email = "secondlife@no.spam@hatena.ne.jp"
|
74
|
+
s.homepage = "http://hatenaapiauth.rubyforge.net"
|
75
|
+
s.rubyforge_project = "hatenaapiauth"
|
76
|
+
end
|
77
|
+
|
78
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
79
|
+
pkg.need_tar = true
|
80
|
+
pkg.package_files += PKG_FILES
|
81
|
+
end
|
82
|
+
|
83
|
+
task :release => [ :clean, :package ]
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'hatena/api/auth'
|
5
|
+
require 'erb'
|
6
|
+
require 'cgi'
|
7
|
+
|
8
|
+
API_KEY = 'your api key'
|
9
|
+
SECRET = 'your secret key'
|
10
|
+
|
11
|
+
cgi = CGI.new
|
12
|
+
hatena_auth = Hatena::API::Auth.new(:api_key => API_KEY, :secret => SECRET)
|
13
|
+
|
14
|
+
if cgi.has_key?('cert')
|
15
|
+
begin
|
16
|
+
user = hatena_auth.login(cgi['cert'])
|
17
|
+
message = "Welcome #{ERB::Util.h user['name']}!"
|
18
|
+
rescue Hatena::API::AuthError => e
|
19
|
+
message = "Authorization Failed"
|
20
|
+
end
|
21
|
+
else
|
22
|
+
login_uri = hatena_auth.uri_to_login
|
23
|
+
end
|
24
|
+
print cgi.header, ERB.new(DATA.read).result
|
25
|
+
|
26
|
+
__END__
|
27
|
+
<html>
|
28
|
+
<body>
|
29
|
+
<h1>Hatena API Auth Sample</h1>
|
30
|
+
<p>
|
31
|
+
<% if message %>
|
32
|
+
<%= message %>
|
33
|
+
<% else %>
|
34
|
+
<a href="<%= ERB::Util.h login_uri %>">login</a>
|
35
|
+
<% end %>
|
36
|
+
</p>
|
37
|
+
</body>
|
38
|
+
</html>
|
data/install.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rbconfig'
|
4
|
+
include Config
|
5
|
+
require 'fileutils'
|
6
|
+
include FileUtils::Verbose
|
7
|
+
|
8
|
+
destdir = "#{ENV["DESTDIR"]}"
|
9
|
+
libdir = CONFIG["sitelibdir"]
|
10
|
+
dest = destdir + File.join(libdir, 'hatena/api')
|
11
|
+
mkdir_p dest
|
12
|
+
install('lib/hatena/api/auth.rb', dest)
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
require 'uri'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'md5'
|
6
|
+
rescue LoadError
|
7
|
+
end
|
8
|
+
|
9
|
+
begin
|
10
|
+
require 'json'
|
11
|
+
rescue LoadError
|
12
|
+
require 'rubygems'
|
13
|
+
require 'json'
|
14
|
+
end
|
15
|
+
|
16
|
+
module Hatena
|
17
|
+
module API
|
18
|
+
class AuthError < RuntimeError;end
|
19
|
+
class Auth
|
20
|
+
BASE_URI = 'http://auth.hatena.ne.jp/'
|
21
|
+
PATH = {
|
22
|
+
:auth => '/auth',
|
23
|
+
:json => '/api/auth.json'
|
24
|
+
}.freeze
|
25
|
+
VERSION = '0.1.0'
|
26
|
+
|
27
|
+
attr_accessor :api_key, :secret
|
28
|
+
def initialize(options = {})
|
29
|
+
@api_key = options[:api_key]
|
30
|
+
@secret = options[:secret]
|
31
|
+
end
|
32
|
+
|
33
|
+
def uri_to_login
|
34
|
+
uri = URI.parse BASE_URI
|
35
|
+
uri.path = PATH[:auth]
|
36
|
+
uri.query = query_with_api_sig
|
37
|
+
uri
|
38
|
+
end
|
39
|
+
|
40
|
+
def login(cert)
|
41
|
+
result = JSON.parse open(
|
42
|
+
uri_to_authcheck(cert),
|
43
|
+
'User-Agent' => "#{self.class}/#{VERSION} - Ruby"
|
44
|
+
).read
|
45
|
+
|
46
|
+
if result['has_error']
|
47
|
+
raise AuthError.new(result['error']['message'])
|
48
|
+
else
|
49
|
+
result['user']
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
def api_sig(hash)
|
55
|
+
Digest::MD5.hexdigest(@secret + hash.to_a.map.sort_by {|i| i.first.to_s}.join)
|
56
|
+
end
|
57
|
+
|
58
|
+
def uri_to_authcheck(cert)
|
59
|
+
uri = URI.parse BASE_URI
|
60
|
+
uri.path = PATH[:json]
|
61
|
+
uri.query = query_with_api_sig(:cert => cert)
|
62
|
+
uri
|
63
|
+
end
|
64
|
+
|
65
|
+
def query_with_api_sig(request = {})
|
66
|
+
query = request.update(:api_key => @api_key)
|
67
|
+
query[:api_sig] = api_sig(query)
|
68
|
+
query.map {|i| i.join '=' }.join('&')
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/test/method_test.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
$LOAD_PATH << File.dirname(__FILE__) + "/../lib"
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'hatena/api/auth'
|
5
|
+
|
6
|
+
class AuthTest < Test::Unit::TestCase
|
7
|
+
def setup
|
8
|
+
@auth = Hatena::API::Auth.new({
|
9
|
+
:api_key => 'test',
|
10
|
+
:secret => 'hoge',
|
11
|
+
})
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_uri_to_login
|
15
|
+
assert_equal 'http://auth.hatena.ne.jp/auth?api_sig=8d03c299aa049c9e47e4f99e03f2df53&api_key=test', @auth.uri_to_login.to_s
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.8.11
|
3
|
+
specification_version: 1
|
4
|
+
name: hatenaapiauth
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 0.1.0
|
7
|
+
date: 2006-04-25 00:00:00 +09:00
|
8
|
+
summary: Hatena Authentication API.
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: secondlife@no.spam@hatena.ne.jp
|
12
|
+
homepage: http://hatenaapiauth.rubyforge.net
|
13
|
+
rubyforge_project: hatenaapiauth
|
14
|
+
description: ""
|
15
|
+
autorequire: hatena/api/auth
|
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
|
+
authors:
|
29
|
+
- Yuichi Tateno
|
30
|
+
files:
|
31
|
+
- install.rb
|
32
|
+
- Rakefile
|
33
|
+
- test
|
34
|
+
- README
|
35
|
+
- examples
|
36
|
+
- lib
|
37
|
+
- VERSION
|
38
|
+
- test/method_test.rb
|
39
|
+
- examples/example.cgi
|
40
|
+
- lib/hatena
|
41
|
+
- lib/hatena/api
|
42
|
+
- lib/hatena/api/auth.rb
|
43
|
+
test_files:
|
44
|
+
- test/method_test.rb
|
45
|
+
rdoc_options:
|
46
|
+
- --line-numbers
|
47
|
+
- --inline-source
|
48
|
+
- -A cattr_accessor=object
|
49
|
+
extra_rdoc_files:
|
50
|
+
- README
|
51
|
+
executables: []
|
52
|
+
|
53
|
+
extensions: []
|
54
|
+
|
55
|
+
requirements:
|
56
|
+
- json
|
57
|
+
dependencies:
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: json
|
60
|
+
version_requirement:
|
61
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 0.4.1
|
66
|
+
version:
|