okta/FactorsClient.py (69 lines of code) (raw):
from okta.framework.ApiClient import ApiClient
from okta.framework.Utils import Utils
from okta.models.factor.FactorCatalogEntry import FactorCatalogEntry
from okta.models.factor.Factor import Factor
from okta.models.factor.Question import Question
from okta.models.factor.FactorVerificationResponse import FactorVerificationResponse
from okta.models.factor.FactorDevice import FactorDevice
class FactorsClient(ApiClient):
def __init__(self, *args, **kwargs):
kwargs['pathname'] = '/api/v1/users'
ApiClient.__init__(self, *args, **kwargs)
def get_factors_catalog(self, user_id):
"""Get available factors for a user
:param user_id: target user id
:type user_id: str
:rtype: list of FactorCatalogEntry
"""
response = ApiClient.get_path(self, '/{0}/factors/catalog'.format(user_id))
return Utils.deserialize(response.text, FactorCatalogEntry)
def get_lifecycle_factors(self, user_id):
"""Get enrolled factors for a user
:param user_id: target user id
:type user_id: str
:rtype: list of Factor
"""
response = ApiClient.get_path(self, '/{0}/factors'.format(user_id))
return Utils.deserialize(response.text, Factor)
# FACTOR CRUD
def get_available_questions(self, user_id):
"""Get available factor questions
:param user_id: target user id
:type user_id: str
:rtype: list of Question
"""
response = ApiClient.get_path(self, '/{0}/factors/questions'.format(user_id))
return Utils.deserialize(response.text, Question)
def enroll_factor(self, user_id, factor_enroll_request, update_phone=None):
"""Enroll a user into a factor
:param user_id: target user id
:type user_id: str
:param factor_enroll_request: the details to enroll the user
:type factor_enroll_request: FactorEnrollRequest
:param update_phone: whether to update the user's phone during enrollment
:type update_phone: bool
:rtype: Factor
"""
params = {
'updatePhone': update_phone
}
response = ApiClient.post_path(self, '/{0}/factors'.format(user_id), factor_enroll_request, params=params)
return Utils.deserialize(response.text, Factor)
def get_factor(self, user_id, user_factor_id):
"""Get information about an enrolled factor
:param user_id: target user id
:type user_id: str
:param user_factor_id: target factor id
:type user_factor_id: str
:rtype: Factor
"""
response = ApiClient.get_path(self, '/{0}/factors/{1}'.format(user_id, user_factor_id))
return Utils.deserialize(response.text, Factor)
def update_factor(self, user_id, user_factor_id, factor_enroll_request):
"""Update an enrolled factor
:param user_id: target user id
:type user_id: str
:param user_factor_id: target factor id
:type user_factor_id: str
:param factor_enroll_request: data to update the factor
:type factor_enroll_request: FactorEnrollRequest
:rtype: Factor
"""
response = ApiClient.put_path(self, '/{0}/factors/{1}'.format(user_id, user_factor_id), factor_enroll_request)
return Utils.deserialize(response.text, Factor)
def reset_factor(self, user_id, user_factor_id):
"""Reset an enrolled factor
:param user_id: target user id
:type user_id: str
:param user_factor_id: target factor id
:type user_factor_id: str
:rtype: None
"""
ApiClient.delete_path(self, '/{0}/factors/{1}'.format(user_id, user_factor_id))
# FACTOR LIFECYCLE
def activate_factor(self, user_id, user_factor_id, passcode, next_passcode=None):
"""Activate an enrolled factor
:param user_id: target user id
:type user_id: str
:param user_factor_id: target factor id
:type user_factor_id: str
:param passcode: code required for activation
:type passcode: str
:param next_passcode: code usually required for TOTP
:type next_passcode: str
:rtype: Factor
"""
request = {
'passCode': passcode,
'next_passcode': next_passcode
}
response = ApiClient.post_path(self, '/{0}/factors/{1}/lifecycle/activate'.format(user_id, user_factor_id), request)
return Utils.deserialize(response.text, Factor)
def resend_code(self, user_id, user_factor_id):
"""Resend code for a factor
:param user_id: target user id
:type user_id: str
:param user_factor_id: target factor id
:type user_factor_id: str
:return:
"""
response = ApiClient.post_path(self, '/{0}/factors/{1}/resend'.format(user_id, user_factor_id))
return Utils.deserialize(response.text, Factor)
def verify_factor(self, user_id, user_factor_id, activation_token=None, answer=None, passcode=None, next_passcode=None):
"""Verify an enrolled factor
:param user_id: target user id
:type user_id: str
:param user_factor_id: target factor id
:type user_factor_id: str
:param activation_token: token required for activation
:type activation_token: str
:param answer: answer usually required for a question factor
:type answer: str
:param passcode: code required for verification
:type passcode: str
:param next_passcode: code usually required for TOTP
:type next_passcode: str
:return:
"""
request = {
'activationToken': activation_token,
'answer': answer,
'passCode': passcode,
'nextPassCode': next_passcode
}
response = ApiClient.post_path(self, '/{0}/factors/{1}/verify'.format(user_id, user_factor_id), request)
return Utils.deserialize(response.text, FactorVerificationResponse)
# FACTOR DEVICE CRUD
def enroll_factor_device(self, user_id, factor_enroll_request):
"""Enroll a factor device for a user
:param user_id: target user id
:type user_id: str
:param factor_enroll_request: data to enroll the factor device
:type factor_enroll_request: FactorEnrollRequest
:rtype: FactorDevice
"""
response = ApiClient.post_path(self, '/{0}/devices'.format(user_id), factor_enroll_request)
return Utils.deserialize(response.text, FactorDevice)
def get_factor_device(self, user_id, user_factor_id, device_id):
"""Get a factor device for a user
:param user_id: target user id
:type user_id: str
:param user_factor_id: target factor id
:type user_factor_id: str
:param device_id: target factor device id
:type device_id: str
:rtype: FactorDevice
"""
response = ApiClient.get_path(self, '/{0}/factors/{1}/device/{2}'.format(user_id, user_factor_id, device_id))
return Utils.deserialize(response.text, FactorDevice)
def update_factor_device(self, user_id, factor_device_request):
"""Update a factor device for a user
:param user_id: target user id
:type user_id: str
:param factor_device_request: data to update the factor device
:type factor_device_request: FactorDeviceRequest
:rtype: FactorDevice
"""
response = ApiClient.post_path(self, '/{0}/factors/{1}'.format(user_id), factor_device_request)
return Utils.deserialize(response.text, FactorDevice)
# FACTOR DEVICE LIFECYCLE
def activate_factor_device(self, user_id, user_factor_id, device_id, passcode):
"""Activate a factor device for a user
:param user_id: target user id
:type user_id: str
:param user_factor_id: target factor id
:type user_factor_id: str
:param device_id: target factor device id
:type device_id: str
:param passcode: code required to activate the factor device
:type passcode: str
:rtype: FactorDevice
"""
request = {
'passCode': passcode
}
response = ApiClient.post_path(self, '/{0}/factors/{1}/devices/{2}/lifecycle/activate'.format(
user_id, user_factor_id, device_id), request)
return Utils.deserialize(response.text, Factor)