Commit 82b0b91

mo <mo@mokhan.ca>
2018-10-13 15:51:10
refactor how redirect uri is generated
1 parent c769cbb
Changed files (3)
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)