Sha256: c97f3ee3f94f8f235ed4c16f7e7a750bb292ce1c755548c560eb4e5b5e651ab9

Contents?: true

Size: 1.87 KB

Versions: 11

Compression:

Stored size: 1.87 KB

Contents

# frozen_string_literal: true
# Copyright 2016 Liqwyd Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

require 'warden'
require 'jwt'

# Top level module for the core Cyclid code.
module Cyclid
  # Module for the Cyclid API
  module API
    # Warden Strategies
    module Strategies
      # API Token based strategy
      module APIToken
        # Authenticate via. an API token
        Warden::Strategies.add(:api_token) do
          def valid?
            request.env['HTTP_AUTHORIZATION'].is_a? String and \
              request.env['HTTP_AUTHORIZATION'] =~ /^Token .*$/
          end

          def authenticate!
            begin
              authorization = request.env['HTTP_AUTHORIZATION']
              username, token = authorization.match(/^Token (.*):(.*)$/).captures
            rescue
              fail! 'invalid API token'
            end

            user = User.find_by(username: username)
            fail! 'invalid user' if user.nil?

            begin
              # Decode the token
              token_data = JWT.decode token, user.secret, true, algorithm: 'HS256'
              claims = token_data.first
              if claims['sub'] == user.username
                success! user
              else
                fail! 'invalid user'
              end
            rescue
              fail! 'invalid API token'
            end
          end
        end
      end
    end
  end
end

Version data entries

11 entries across 11 versions & 1 rubygems

Version Path
cyclid-0.4.0 app/cyclid/sinatra/warden/strategies/api_token.rb
cyclid-0.3.3 app/cyclid/sinatra/warden/strategies/api_token.rb
cyclid-0.3.2 app/cyclid/sinatra/warden/strategies/api_token.rb
cyclid-0.3.1 app/cyclid/sinatra/warden/strategies/api_token.rb
cyclid-0.3.0 app/cyclid/sinatra/warden/strategies/api_token.rb
cyclid-0.2.5 app/cyclid/sinatra/warden/strategies/api_token.rb
cyclid-0.2.4 app/cyclid/sinatra/warden/strategies/api_token.rb
cyclid-0.2.3 app/cyclid/sinatra/warden/strategies/api_token.rb
cyclid-0.2.2 app/cyclid/sinatra/warden/strategies/api_token.rb
cyclid-0.2.1 app/cyclid/sinatra/warden/strategies/api_token.rb
cyclid-0.2.0 app/cyclid/sinatra/warden/strategies/api_token.rb