oauth2-server 0.1.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/LICENSE +0 -0
- data/README.md +0 -0
- data/lib/oauth2/server.rb +11 -0
- data/lib/oauth2/server/flows.rb +13 -0
- data/lib/oauth2/server/flows/web_server.rb +57 -0
- data/lib/oauth2/server/request.rb +142 -0
- metadata +95 -0
data/LICENSE
ADDED
File without changes
|
data/README.md
ADDED
File without changes
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'oauth2/attributes'
|
2
|
+
|
3
|
+
module OAuth2
|
4
|
+
|
5
|
+
module Server
|
6
|
+
|
7
|
+
module Flows
|
8
|
+
|
9
|
+
class WebServer
|
10
|
+
|
11
|
+
include OAuth2::Attributes
|
12
|
+
|
13
|
+
def create_ticket(&block)
|
14
|
+
if block_given?
|
15
|
+
callbacks[:create_ticket] = block
|
16
|
+
else
|
17
|
+
block.call
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
attributes :create_ticket,
|
22
|
+
:verify_resource_owner,
|
23
|
+
:render_authorize_form
|
24
|
+
|
25
|
+
# This method will create a ticket for the client and try to identify
|
26
|
+
# and verify the resource owner.
|
27
|
+
# If those two steps succeed, it displays the authorization form.
|
28
|
+
def request_authorization
|
29
|
+
create_ticket
|
30
|
+
verify_resource_owner or return
|
31
|
+
render_authorize_form
|
32
|
+
end
|
33
|
+
|
34
|
+
attributes :create_verification_code,
|
35
|
+
:authorized?
|
36
|
+
:redirect_back
|
37
|
+
|
38
|
+
# If the user authorized the client, we create a verification code.
|
39
|
+
# Then we redirect back with the verification code or an error message.
|
40
|
+
def grant_authorization
|
41
|
+
create_verification_code if authorized?
|
42
|
+
redirect_back
|
43
|
+
end
|
44
|
+
|
45
|
+
# TODO
|
46
|
+
def access_token
|
47
|
+
# TODO: verify that type == "web_sever"
|
48
|
+
# TODO: verify that redirect_uri == ticket.redirect_uri
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
require 'oauth2/attributes'
|
2
|
+
require 'hmac-sha2'
|
3
|
+
require 'active_support/base64'
|
4
|
+
|
5
|
+
module OAuth2
|
6
|
+
|
7
|
+
module Server
|
8
|
+
|
9
|
+
class Request
|
10
|
+
|
11
|
+
include OAuth2::Attributes
|
12
|
+
|
13
|
+
attributes :host, :realm, :algorithms, :method,
|
14
|
+
:request_header, :request_uri,
|
15
|
+
:host_with_port, :secret, :access_token,
|
16
|
+
:access_token_expired?
|
17
|
+
|
18
|
+
class << self
|
19
|
+
|
20
|
+
def validate(*args)
|
21
|
+
request = new(*args)
|
22
|
+
request.validate
|
23
|
+
request
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
def initialize(attributes = {}, &block)
|
29
|
+
self.attributes.merge!(attributes)
|
30
|
+
end
|
31
|
+
|
32
|
+
def errors
|
33
|
+
@errors ||= []
|
34
|
+
end
|
35
|
+
|
36
|
+
alias_method :original_request_header, :request_header
|
37
|
+
|
38
|
+
# Overwrite attribute reader #request_header
|
39
|
+
# See OAuth2::Server::Attributes
|
40
|
+
def request_header
|
41
|
+
value = original_request_header
|
42
|
+
|
43
|
+
if value.is_a?(String)
|
44
|
+
value = Headers::Authorization.parse(value)
|
45
|
+
end
|
46
|
+
|
47
|
+
value
|
48
|
+
end
|
49
|
+
|
50
|
+
def type
|
51
|
+
return :bearer if bearer?
|
52
|
+
return :cryptographic if cryptographic?
|
53
|
+
|
54
|
+
:unknown
|
55
|
+
end
|
56
|
+
|
57
|
+
def bearer?
|
58
|
+
if request_header.attributes.values.compact.size != 1
|
59
|
+
return false
|
60
|
+
end
|
61
|
+
|
62
|
+
not request_header.token.nil?
|
63
|
+
end
|
64
|
+
|
65
|
+
def cryptographic?
|
66
|
+
required_attributes = %w{token nonce timestamp algorithm signature}
|
67
|
+
required_attributes.map! do |attribute|
|
68
|
+
request_header.send(attribute.to_sym).nil?
|
69
|
+
end
|
70
|
+
|
71
|
+
required_attributes.uniq == [false]
|
72
|
+
end
|
73
|
+
|
74
|
+
# Calculates the header signature as described on:
|
75
|
+
# http://tools.ietf.org/html/draft-hammer-oauth2-00#section-5.3.1
|
76
|
+
def calculate_signature
|
77
|
+
normalized_string = [
|
78
|
+
request_header.timestamp,
|
79
|
+
request_header.nonce,
|
80
|
+
request_header.algorithm,
|
81
|
+
method.upcase,
|
82
|
+
host_with_port,
|
83
|
+
request_uri
|
84
|
+
].join(',')
|
85
|
+
|
86
|
+
digest = HMAC::SHA256.digest(secret, normalized_string)
|
87
|
+
|
88
|
+
ActiveSupport::Base64.encode64s(digest)
|
89
|
+
end
|
90
|
+
|
91
|
+
def validate_signature
|
92
|
+
if calculate_signature != request_header.signature
|
93
|
+
errors << :signature_invalid
|
94
|
+
return false
|
95
|
+
end
|
96
|
+
|
97
|
+
true
|
98
|
+
end
|
99
|
+
|
100
|
+
def validate_access_token
|
101
|
+
unless access_token
|
102
|
+
errors << :access_token_invalid
|
103
|
+
return false
|
104
|
+
end
|
105
|
+
|
106
|
+
if access_token_expired?
|
107
|
+
errors << :access_token_expired
|
108
|
+
return false
|
109
|
+
end
|
110
|
+
|
111
|
+
true
|
112
|
+
end
|
113
|
+
|
114
|
+
def validate_request_header
|
115
|
+
unless request_header
|
116
|
+
errors << :missing_authorization_header
|
117
|
+
return false
|
118
|
+
end
|
119
|
+
|
120
|
+
true
|
121
|
+
end
|
122
|
+
|
123
|
+
def validate
|
124
|
+
errors.clear
|
125
|
+
|
126
|
+
if validate_request_header
|
127
|
+
validate_access_token
|
128
|
+
validate_signature if type == :cryptographic
|
129
|
+
end
|
130
|
+
|
131
|
+
@valid = errors.empty?
|
132
|
+
end
|
133
|
+
|
134
|
+
def valid?
|
135
|
+
@valid
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
139
|
+
|
140
|
+
end
|
141
|
+
|
142
|
+
end
|
metadata
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: oauth2-server
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 1
|
9
|
+
version: 0.1.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Alexander Flatter
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-05-07 00:00:00 +02:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: ruby-hmac
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
- 0
|
30
|
+
- 0
|
31
|
+
version: 0.0.0
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: rspec
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
version: "0"
|
44
|
+
type: :development
|
45
|
+
version_requirements: *id002
|
46
|
+
description: ""
|
47
|
+
email:
|
48
|
+
- aflatter@farbenmeer.net
|
49
|
+
executables: []
|
50
|
+
|
51
|
+
extensions: []
|
52
|
+
|
53
|
+
extra_rdoc_files: []
|
54
|
+
|
55
|
+
files:
|
56
|
+
- lib/oauth2/server/flows/web_server.rb
|
57
|
+
- lib/oauth2/server/flows.rb
|
58
|
+
- lib/oauth2/server/request.rb
|
59
|
+
- lib/oauth2/server.rb
|
60
|
+
- LICENSE
|
61
|
+
- README.md
|
62
|
+
has_rdoc: true
|
63
|
+
homepage: http://github.com/aflatter/oauth2
|
64
|
+
licenses: []
|
65
|
+
|
66
|
+
post_install_message:
|
67
|
+
rdoc_options: []
|
68
|
+
|
69
|
+
require_paths:
|
70
|
+
- lib
|
71
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
segments:
|
76
|
+
- 0
|
77
|
+
version: "0"
|
78
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
segments:
|
83
|
+
- 1
|
84
|
+
- 3
|
85
|
+
- 6
|
86
|
+
version: 1.3.6
|
87
|
+
requirements: []
|
88
|
+
|
89
|
+
rubyforge_project:
|
90
|
+
rubygems_version: 1.3.6
|
91
|
+
signing_key:
|
92
|
+
specification_version: 3
|
93
|
+
summary: ""
|
94
|
+
test_files: []
|
95
|
+
|