Create base controller class

This commit is contained in:
Maciej Szlosarczyk 2018-07-23 16:23:56 +03:00
parent 65676ae637
commit 8f234a5852
No known key found for this signature in database
GPG key ID: 41D62D42D3B0D765
5 changed files with 67 additions and 23 deletions

View file

@ -0,0 +1,31 @@
require 'rails5_api_controller_backport'
require 'auth_token/auth_token_decryptor'
module Api
module V1
module Registrant
class BaseController < ActionController::API
before_action :authenticate
private
def bearer_token
pattern = /^Bearer /
header = request.headers['Authorization']
header.gsub(pattern, '') if header && header.match(pattern)
end
def authenticate
decryptor = AuthTokenDecryptor.create_with_defaults(bearer_token)
decryptor.decrypt_token
if decryptor.valid?
sign_in decryptor.user
else
render json: { error: 'Not authorized' }, status: 403
end
end
end
end
end
end

View file

@ -4,9 +4,7 @@ require 'auth_token/auth_token_decryptor'
module Api
module V1
module Registrant
class DomainsController < ActionController::API
before_filter :authenticate
class DomainsController < BaseController
def index
registrant = ::Registrant.find_by(ident: current_user.registrant_ident)
unless registrant
@ -16,25 +14,6 @@ module Api
render json: domains
end
end
private
def bearer_token
pattern = /^Bearer /
header = request.headers['Authorization']
header.gsub(pattern, '') if header && header.match(pattern)
end
def authenticate
decryptor = AuthTokenDecryptor.create_with_defaults(bearer_token)
decryptor.decrypt_token
if decryptor.valid?
sign_in decryptor.user
else
render json: { error: "Not authorized" }, status: 403
end
end
end
end
end

View file

@ -18,7 +18,7 @@ class AuthTokenDecryptor
decipher.decrypt
decipher.key = key
base64_decoded = Base64.urlsafe_decode64(token)
base64_decoded = Base64.urlsafe_decode64(token.to_s)
plain = decipher.update(base64_decoded) + decipher.final
@decrypted_data = JSON.parse(plain, symbolize_names: true)

View file

@ -35,6 +35,11 @@ class AuthTokenDecryptorTest < ActiveSupport::TestCase
refute(faulty_decryptor.decrypt_token)
end
def test_decrypt_token_return_false_when_token_is_nil
faulty_decryptor = AuthTokenDecryptor.new(nil, @key)
refute(faulty_decryptor.decrypt_token)
end
def test_valid_returns_true_for_valid_token
decryptor = AuthTokenDecryptor.new(@access_token, @key)
decryptor.decrypt_token

View file

@ -0,0 +1,29 @@
require 'test_helper'
require 'auth_token/auth_token_creator'
class RegistrantApiDomainsTest < ApplicationSystemTestCase
def setup
super
@user = users(:registrant)
@auth_headers = { 'HTTP_AUTHORIZATION' => auth_token }
end
def test_root_returns_domain_list
get '/api/v1/registrant/domains', {}, @auth_headers
assert_equal(200, response.status)
end
def test_root_returns_403_without_authorization
get '/api/v1/registrant/domains', {}, {}
assert_equal(403, response.status)
end
private
def auth_token
token_creator = AuthTokenCreator.create_with_defaults(@user)
hash = token_creator.token_in_hash
"Bearer #{hash[:access_token]}"
end
end