Commit 82b0b91
Changed files (3)
app
controllers
models
app/controllers/oauths_controller.rb
@@ -7,14 +7,14 @@ class OauthsController < ApplicationController
@client = Client.find_by!(uuid: params[:client_id])
if @client.redirect_uri != params[:redirect_uri]
- return redirect_to @client.redirect_uri_path(
+ return redirect_to @client.error_uri(
error: 'invalid_request',
state: params[:state]
)
end
unless VALID_RESPONSE_TYPES.include?(params[:response_type])
- return redirect_to @client.redirect_uri_path(
+ return redirect_to @client.error_uri(
error: 'unsupported_response_type',
state: params[:state]
)
@@ -32,24 +32,8 @@ class OauthsController < ApplicationController
client = Client.find_by!(uuid: session[:oauth][:client_id])
authorization = client.authorizations.create!(user: current_user)
-
- if session[:oauth][:response_type] == 'code'
- redirect_to client.redirect_uri_path(
- code: authorization.code,
- state: session[:oauth][:state]
- )
- elsif session[:oauth][:response_type] == 'token'
- @access_token, = authorization.issue_tokens_to(
- client, token_types: [:access]
- )
-
- redirect_to client.redirect_uri_path(
- access_token: @access_token.to_jwt,
- token_type: "Bearer",
- expires_in: 5.minutes,
- scope: "admin",
- state: session[:oauth][:state]
- )
- end
+ response_type = session[:oauth][:response_type]
+ state = session[:oauth][:state]
+ redirect_to client.redirect_uri_for(authorization, response_type, state)
end
end
app/models/client.rb
@@ -27,18 +27,34 @@ class Client < ApplicationRecord
uuid
end
- def redirect_uri_path(code: nil, access_token: nil, token_type: "Bearer", expires_in: nil, scope: "", state: nil, error: nil)
- result = redirect_uri
- if code
- result += '?code=' + code
- elsif access_token
- result += '#access_token=' + access_token
- result += "&token_type=#{token_type}"
- result += "&expires_in=#{expires_in.seconds.to_i}" if expires_in.present?
- result += "&scope=#{scope}" if scope.present?
- elsif error
- result += '#error=' + error
+ def redirect_uri_for(authorization, response_type, state)
+ if response_type == 'code'
+ redirect_uri_path(state: state) do |x|
+ "#{x}?code=#{authorization.code}"
+ end
+ elsif response_type == 'token'
+ access_token, = authorization.issue_tokens_to(
+ self, token_types: [:access]
+ )
+ redirect_uri_path(state: state) do |x|
+ x += '#access_token=' + access_token.to_jwt
+ x += "&token_type=Bearer"
+ x += "&expires_in=#{5.minutes.to_i}"
+ x + "&scope=admin"
+ end
+ end
+ end
+
+ def error_uri(state: nil, error: nil)
+ redirect_uri_path(state: state) do |x|
+ "#{x}#error=#{error}"
end
+ end
+
+ def redirect_uri_path(code: nil, state: nil)
+ result = redirect_uri
+ result = yield result if block_given?
+ result += '?code=' + code if code
result += "&state=#{state}" if state.present?
result
end
Gemfile.lock
@@ -177,7 +177,7 @@ GEM
multi_json (1.13.1)
net-hippie (0.1.9)
nio4r (2.3.1)
- nokogiri (1.8.4)
+ nokogiri (1.8.5)
mini_portile2 (~> 2.3.0)
parallel (1.12.1)
parser (2.5.1.2)