class OktaClient

Attributes

access_token[RW]
client_id[RW]
org_url[RW]
pagination[RW]
private_key[RW]
scopes[RW]
token[RW]

Public Class Methods

new(hash) click to toggle source
# File lib/oktennyx.rb, line 11
def initialize(hash)
        self.org_url = hash[:org_url]
        self.token = hash[:token]
        self.client_id = hash[:client_id]
        self.scopes = hash[:scopes]
        self.private_key = hash[:private_key]
        self.access_token = nil
        check_authz_type
end

Public Instance Methods

activate_factor(user_id, factor_id, activation_profile) click to toggle source
# File lib/oktennyx.rb, line 195
def activate_factor(user_id, factor_id, activation_profile)
        url = URI("#{self.org_url}/api/v1/users/#{user_id}/factors/#{factor_id}/lifecycle/activate")
        self.http_req(url, 'POST', activation_profile.to_json)
end
add_user_to_group(user_id, group_id) click to toggle source
# File lib/oktennyx.rb, line 224
def add_user_to_group(user_id, group_id)
        url = URI("#{self.org_url}/api/v1/groups/#{group_id}/users/#{user_id}")
        self.http_req(url, 'PUT', {})
end
assign_user_to_app(user_id, user_profile, app_id) click to toggle source
# File lib/oktennyx.rb, line 253
def assign_user_to_app(user_id, user_profile, app_id)
        url = URI("#{self.org_url}/api/v1/apps/#{app_id}/users")
        user = {
                id: user_id,
        }
        self.http_req(url, 'POST', user.to_json)
end
base64_to_long(data) click to toggle source
# File lib/oktennyx.rb, line 63
def base64_to_long(data)
        decoded_with_padding = Base64.urlsafe_decode64(data) + Base64.decode64('==')
        decoded_with_padding.to_s.unpack('C*').map do |byte|
                self.to_hex(byte)
        end.join.to_i(16)
end
check_authz_type() click to toggle source
# File lib/oktennyx.rb, line 126
def check_authz_type
        if self.private_key
                self.get_access_token(self.private_key, self.client_id, self.scopes)
        end
end
create_application(app_profile) click to toggle source
# File lib/oktennyx.rb, line 248
def create_application(app_profile)
        url = URI("#{self.org_url}/api/v1/apps")
        self.http_req(url, 'POST', app_profile.to_json)
end
create_group(profile) click to toggle source
# File lib/oktennyx.rb, line 219
def create_group(profile)
        url = URI("#{self.org_url}/api/v1/groups")
        self.http_req(url, 'POST', profile.to_json)
end
create_user(profile) click to toggle source
# File lib/oktennyx.rb, line 159
def create_user(profile)
        url = URI("#{self.org_url}/api/v1/users")
        self.http_req(url, 'POST', profile.to_json)
end
deactivate_user(user_id) click to toggle source
# File lib/oktennyx.rb, line 170
def deactivate_user(user_id)
        url = URI("#{self.org_url}/api/v1/users/#{user_id}/lifecycle/deactivate")
        self.http_req(url, 'POST', {})
end
delete_user(user_id) click to toggle source
# File lib/oktennyx.rb, line 175
def delete_user(user_id)
        url = URI("#{self.org_url}/api/v1/users/#{user_id}")
        self.http_req(url, 'DELETE', {})
end
enroll_factor(user_id, factor_profile) click to toggle source
# File lib/oktennyx.rb, line 190
def enroll_factor(user_id, factor_profile)
        url = URI("#{self.org_url}/api/v1/users/#{user_id}/factors")
        self.http_req(url, 'POST', factor_profile.to_json)
end
get_access_token(private_key, client_id, scopes) click to toggle source
# File lib/oktennyx.rb, line 70
def get_access_token(private_key, client_id, scopes)
        scopes_string = ''
        scopes.each {|scope| scopes_string += "#{scope} "}

        jwks = private_key

        jwtheader = {
                'alg': 'RS256'
        }

        jwtpayload = {
                aud: "#{self.org_url}/oauth2/v1/token",
                exp: (Time.now + 1*60*60).utc.strftime('%s'),
                iss: client_id,
                sub: client_id
        }

        jwtheaderJSON = jwtheader.to_json
        jwtheaderUTF = jwtheaderJSON.encode('UTF-8')
        tokenheader = Base64.urlsafe_encode64(jwtheaderUTF)


        jwtpayloadJSON = jwtpayload.to_json
        jwtpayloadUTF = jwtpayloadJSON.encode('UTF-8')
        tokenpayload = Base64.urlsafe_encode64(jwtpayloadUTF)


        signeddata = tokenheader + "." + tokenpayload
        
        signature = ''

        if private_key.class == Hash
                key = OpenSSL::PKey::RSA.new 2048
                exponent = private_key[:keys][0][:e]
                modulus = private_key[:keys][0][:n]
                key.set_key(self.base64_to_long(modulus), self.base64_to_long(exponent), self.base64_to_long(jwks[:keys][0][:d]))
                signature = Base64.urlsafe_encode64(key.sign(OpenSSL::Digest::SHA256.new, signeddata))
        elsif private_key.class == String
                priv = private_key
                key = OpenSSL::PKey::RSA.new(priv)
                signature = Base64.urlsafe_encode64(key.sign(OpenSSL::Digest::SHA256.new, signeddata))
        end
        
        client_secret_jwt = signeddata + '.' + signature

        url = URI("#{self.org_url}/oauth2/v1/token")
        https = Net::HTTP.new(url.host, url.port);
        https.use_ssl = true
        request = Net::HTTP::Post.new(url)
        request['Accept'] = 'application/json'
        request['Content-Type'] = 'application/x-www-form-urlencoded'
        request.body = "grant_type=client_credentials&scope=#{scopes_string}&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer&client_assertion=#{client_secret_jwt}"
        response = https.request(request)
        self.access_token = JSON.parse(response.read_body)['access_token']
end
get_application(app_id) click to toggle source
# File lib/oktennyx.rb, line 243
def get_application(app_id)
        url = URI("#{self.org_url}/api/v1/apps/#{app_id}")
        self.http_req(url, 'GET', {})
end
get_applications(**params) click to toggle source
# File lib/oktennyx.rb, line 236
def get_applications(**params)
        query_params = self.handle_params(params)
        url = URI("#{self.org_url}/api/v1/apps/#{query_params}")
        apps_collection = Collection.new(self, self.http_req(url, 'GET', {}))
        return apps_collection                
end
get_group(group_id) click to toggle source
# File lib/oktennyx.rb, line 214
def get_group(group_id)
        url = URI("#{self.org_url}/api/v1/groups/#{group_id}")
        self.http_req(url, 'GET', {})
end
get_groups(**params) click to toggle source
# File lib/oktennyx.rb, line 207
def get_groups(**params)
        query_params = self.handle_params(params)
        url = URI("#{self.org_url}/api/v1/groups/#{query_params}")
        groups_collection = Collection.new(self, self.http_req(url, 'GET', {}))
        return groups_collection
end
get_logs(**params) click to toggle source
# File lib/oktennyx.rb, line 263
def get_logs(**params)
        query_params = self.handle_params(params)
        url = URI("#{self.org_url}/api/v1/logs/#{query_params}")
        logs_collection = Collection.new(self, self.http_req(url, 'GET', {}))
        return logs_collection        
end
get_user(user_id) click to toggle source
# File lib/oktennyx.rb, line 154
def get_user(user_id)
        url = URI("#{self.org_url}/api/v1/users/#{user_id}")
        self.http_req(url, 'GET', {})[0]
end
get_user_factors(user_id) click to toggle source
# File lib/oktennyx.rb, line 185
def get_user_factors(user_id)
        url = URI("#{self.org_url}/api/v1/users/#{user_id}/factors")
        self.http_req(url, 'GET', {})
end
get_user_groups(user_id) click to toggle source
# File lib/oktennyx.rb, line 180
def get_user_groups(user_id)
        url = URI("#{self.org_url}/api/v1/users/#{user_id}/groups")
        self.http_req(url, 'GET', {})
end
get_users(**params) click to toggle source
# File lib/oktennyx.rb, line 147
def get_users(**params)
        query_params = self.handle_params(params)
        url = URI("#{self.org_url}/api/v1/users/#{query_params}")
        users_collection = Collection.new(self, self.http_req(url, 'GET', {}))
        return users_collection
end
handle_params(params) click to toggle source
# File lib/oktennyx.rb, line 132
def handle_params(params)
        query_params = ''

        if not params.empty?
                query_params += '?'
                for param_key, param_value in params
                        query_params += "#{param_key}=#{param_value}&"
                end
        end

        return query_params
end
http_req(url, http_method, body) click to toggle source
# File lib/oktennyx.rb, line 21
def http_req(url, http_method, body)
        https = Net::HTTP.new(url.host, url.port);
        https.use_ssl = true

        if http_method == 'GET'
                request = Net::HTTP::Get.new(url)
        elsif http_method == 'PUT'
                request = Net::HTTP::Put.new(url)
        elsif http_method == 'POST'
                request = Net::HTTP::Post.new(url)
        elsif http_method == 'DELETE'
                request = Net::HTTP::Delete.new(url)
        else
                return 405
        end

        request['Accept'] = 'application/json'
        request['Content-Type'] = 'application/json'

        if self.access_token
                request['Authorization'] = "Bearer #{self.access_token}"
        else
                request['Authorization'] = "SSWS #{self.token}"
        end

        if not body.empty?
                request.body = body
        end   

        response = https.request(request)

        if response.code == '204'
                return response.code
        else
                return JSON.parse(response.read_body), response['Link']
        end
end
remove_user_from_group(user_id, group_id) click to toggle source
# File lib/oktennyx.rb, line 229
def remove_user_from_group(user_id, group_id)
        url = URI("#{self.org_url}/api/v1/groups/#{group_id}/users/#{user_id}")
        self.http_req(url, 'DELETE', {})
end
to_hex(int) click to toggle source
# File lib/oktennyx.rb, line 59
def to_hex(int)
        int < 16 ? '0' + int.to_s(16) : int.to_s(16)
end
update_user(user_id, profile) click to toggle source
# File lib/oktennyx.rb, line 164
def update_user(user_id, profile)
        url = URI("#{self.org_url}/api/v1/users/#{user_id}")
        new_profile = {profile: profile}
        self.http_req(url, 'PUT', new_profile.to_json)
end
verify_factor(user_id, factor_id, verify_profile) click to toggle source
# File lib/oktennyx.rb, line 200
def verify_factor(user_id, factor_id, verify_profile)
        url = URI("#{self.org_url}/api/v1/users/#{user_id}/factors/#{factor_id}/verify")
        self.http_req(url, 'POST', verify_profile.to_json)
end