Okta v2

Integration with Okta's cloud-based identity management service.

Authentication & Identity Management · Okta

Details

IDOkta v2
ProviderOkta
CategoryAuthentication & Identity Management
From Version5.0.0
Docker Imagedemisto/crypto:1.0.0.5490413
Supported ModulesAgentix Cloud Runtime Security Cloud Posture Security XSIAM EDR Cortex Cloud

README

Integration with Okta’s cloud-based identity management service.

Configure Okta v2 in Cortex

API Token Authentication Prerequisites

  1. Sign in to your Okta organization as a user with administrator privileges.
  2. On the Admin Console, select Security > API from the menu, and then select the Tokens tab.
  3. Click Create Token.
  4. Name your token and click Create Token.

Notes

  • API tokens have the same permissions as the user who creates them, and if the permissions of a user change, so do the permissions of the API token.
  • If more than one certificate is assigned to the application, the Key ID parameter is required to specify which
    certificate to use for signing the JWT token.

For more information, see the ‘Create an API token’ official documentation article.

OAuth 2.0 Authentication Prerequisites

Required Scopes

The following scopes are required for the Okta v2 integration to work properly:

  • okta.apps.manage
  • okta.apps.read
  • okta.groups.manage
  • okta.groups.read
  • okta.logs.read
  • okta.networkZones.manage
  • okta.networkZones.read
  • okta.sessions.manage
  • okta.sessions.read
  • okta.users.manage
  • okta.users.read
  1. Sign in to Okta Admin Console.
  2. In the Admin Console, go to Applications > Applications.
  3. Click Create App Integration.
  4. Select API Services as the sign-in method, and click Next.
  5. Enter the desired name for the created app (e.g., “Cortex XSOAR”), and click Save.
  6. In the app configuration page, under the General tab and the Client Credentials section, select Public key / Private key for the Client authentication option.
  7. Under the newly added PUBLIC KEYS section, click Add Key.
  8. In the Add Public Key dialog box, click Generate new key. Make sure to copy the generated private key (in PEM format) to somewhere safe, and click Save.
  9. Under the General Settings section:
    1. Next to the Proof of possession label, uncheck the Require Demonstrating Proof of Possession (DPoP) header in token requests option if it’s selected.
    2. Next to the Grant type label, make sure the Client Credentials option is selected, and that the Token Exchange option is not selected.
    3. Click Save.
  10. Under the Okta API Scopes tab, grant the required scopes mentioned above for the app.
  11. Under the Admin roles tab:
    1. Click Edit assignments.
    2. In the dropdown list under “Role”, select Super Administrator.
    3. Click Save changes at the top.

For more information, see the ‘Implement OAuth for Okta’ official documentation article.

Note: OAuth 2.0 authentication is confirmed to support the ‘Revoke all user sessions’ functionality. When using the okta-clear-user-sessions command with revoke_oauth_tokens=true, it revokes OpenID Connect and OAuth refresh and access tokens issued to the user.

Instance Configuration

Parameter Description Required
Okta URL (https://<domain>.okta.com)   True
API Token   False
Use OAuth 2.0 Authentication See detailed instructions on the ‘Help’ tab. False
Client ID Required and used if OAuth 2.0 is used for authentication. See detailed instructions on the ‘Help’ tab. False
Private Key In PEM format. Required and used if OAuth 2.0 is used for authentication. See detailed instructions on the ‘Help’ tab. False
JWT Signing Algorithm Algorithm to sign generated JWT tokens with. Doesn’t affect integration’s functionality. Required and used if OAuth 2.0 is used for authentication. See detailed instructions on the ‘Help’ tab. False
Key ID Required and used if more than one key is used for signing JWT tokens. False
Trust any certificate (not secure)   False
Use system proxy settings   False

Commands

You can execute these commands from the CLI, as part of an automation, or in a playbook.
After you successfully execute a command, a DBot message appears in the War Room with the command details.

okta-unlock-user


Unlocks a single user.

Base Command

okta-unlock-user

Input

Argument Name Description Required
username Username to unlock. Required

Context Output

Path Type Description
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).
Command Example

!okta-unlock-user username=testForDocs@test.com

Human Readable Output

User testForDocs@test.com unlocked

okta-deactivate-user


Deactivates a single user.

Base Command

okta-deactivate-user

Input

Argument Name Description Required
username Username to deactivate. Required

Context Output

Path Type Description
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).
Command Example

!okta-deactivate-user username=testForDocs@test.com

Human Readable Output

User testForDocs@test.com deactivated

okta-activate-user


Activates a single user.

Base Command

okta-activate-user

Input

Argument Name Description Required
username Username to activate. Required

Context Output

Path Type Description
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).
Command Example

!okta-activate-user username=testForDocs@test.com

Human Readable Output

testForDocs@test.com is active now

okta-suspend-user


Suspends a single user. This operation can only be performed on users with an ACTIVE status. After the porcess is completed, the user’s status is SUSPENDED.

Base Command

okta-suspend-user

Input

Argument Name Description Required
username Username to suspend. Required

Context Output

Path Type Description
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).
Command Example

!okta-suspend-user username=testForDocs@test.com

Human Readable Output

testForDocs@test.com status is Suspended

okta-unsuspend-user


Returns a single user to ACTIVE status. This operation can only be performed on users that have a SUSPENDED status.

Base Command

okta-unsuspend-user

Input

Argument Name Description Required
username Username to change the status to ACTIVE. Required

Context Output

Path Type Description
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).
Command Example

!okta-unsuspend-user username=testForDocs@test.com

Human Readable Output

testForDocs@test.com is no longer SUSPENDED

okta-get-user-factors


Returns all the enrolled factors for the specified user.

Base Command

okta-get-user-factors

Input

Argument Name Description Required
username Username for which to return all enrolled factors. Optional
userId User ID of the user for which to get all enrolled factors. Optional

Context Output

Path Type Description
Account.ID String Okta account ID.
Account.Factor.ID String Okta account factor ID.
Account.Factor.Provider String Okta account factor provider.
Account.Factor.Profile String Okta account factor profile.
Account.Factor.FactorType String Okta account factor type.
Account.Factor.Status Unknown Okta account factor status.
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).
Command Example

!okta-get-user-factors username=factor@test.com

Context Example
{
    "Account": {
        "Factor": [
            {
                "FactorType": "sms",
                "ID": "mblpt21nffaaN5F060h7",
                "Profile": {
                    "phoneNumber": "+12025550191"
                },
                "Provider": "OKTA",
                "Status": "PENDING_ACTIVATION"
            },
            {
                "FactorType": "token:software:totp",
                "ID": "uftpt24kdrDJ7fDOq0h7",
                "Profile": {
                    "credentialId": "factor@test.com"
                },
                "Provider": "GOOGLE",
                "Status": "PENDING_ACTIVATION"
            },
            {
                "FactorType": "push",
                "ID": "opfpt1joeaArlg27g0h7",
                "Provider": "OKTA",
                "Status": "PENDING_ACTIVATION"
            }
        ],
        "ID": "00upt1w8tgFQM2v6t4"
    }
}
Human Readable Output

Factors for user: 00upt1w8tgFQM2v0h7

Factors

FactorType ID Profile Provider Status
sms mbgt21nffaaN5F060h7 phoneNumber: +12025550191 OKTA PENDING_ACTIVATION
token:software:totp uftptgdrDJ7fDOq0h7 credentialId: factor@test.com GOOGLE PENDING_ACTIVATION
push opfg1joeaArlg27g0h7   OKTA PENDING_ACTIVATION

okta-reset-factor


Un-enrolls an existing factor for the specified user. This enables the user to enroll a new factor.

Base Command

okta-reset-factor

Input

Argument Name Description Required
userId The user ID. Optional
username Username for which to un-enroll an existing factor. Optional
factorId The ID of the factor to reset. Required

Context Output

Path Type Description
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).
Command Example

!okta-reset-factor factorId=ufsq7cvptfbjQa72c0h7 userId=00upt1w8t40wFQM2v6t4

Human Readable Output

Factor: ufsq7cvptfbjQa72c0h7 deleted

okta-set-password


Sets passwords without validating existing user credentials.

Base Command

okta-set-password

Input

Argument Name Description Required
username Okta username for which to set the password. Required
password The new password to set for the user. Required
temporary_password When true, you’ll need to change the password in the next login. Possible values are: true, false. Default is false. Optional

Context Output

Path Type Description
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).
Command Example

!okta-set-password username=testForDocs@test.com password=N3wPa55word!

Human Readable Output

testForDocs@test.com password was last changed on 2020-03-26T13:57:13.000Z

okta-add-to-group


Adds a user to a group with OKTA_GROUP type.

Base Command

okta-add-to-group

Input

Argument Name Description Required
userId ID of the user to add to the group. Optional
username Name of the user to add to the group. Optional
groupId ID of the group to add the user to. Optional
groupName Name of the group to add the user to. Optional

Context Output

Path Type Description
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).
Command Example

!okta-add-to-group groupName=Demisto username=testForDocs@test.com

Human Readable Output

User: 00uqk1qesl3k0SRbH0h7 added to group: Demisto successfully

okta-remove-from-group


Removes a user from a group with OKTA_GROUP type.

Base Command

okta-remove-from-group

Input

Argument Name Description Required
userId ID of the user to remove from the group. Optional
username Name of the user to remove from the group. Optional
groupId ID of the group to remove the user from. Optional
groupName Name of the group to remove the user from. Optional

Context Output

There is no context output for this command.

Command Example

!okta-remove-from-group groupName=demisto username=testForDocs@test.com

Human Readable Output

User: 00uqk1qesl3k0SRbH0h7 was removed from group: demisto successfully

okta-get-groups


Returns all user groups associated with a specified user.

Base Command

okta-get-groups

Input

Argument Name Description Required
username Username in Okta for which to get the associated groups. Required

Context Output

Path Type Description
Account.Group Unknown Okta groups with which the account is associated.
Account.ID String Okta account ID.
Account.Type String Okta account type.
Account.Group.ID String Unique key for the group.
Account.Group.Created Date Timestamp when the group was created.
Account.Group.ObjectClass String The object class, which determines the group’s profile.
Account.Group.LastUpdated Date Timestamp when the group’s profile was last updated.
Account.Group.LastMembershipUpdated Date Timestamp when the group’s memberships were last updated.
Account.Group.Type String Group type, which determines how a group’s profile and memberships are managed.
Account.Group.Description String Description of the group.
Account.Group.Name String Name of the group.
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).
Command Example

!okta-get-groups username=testForDocs@test.com

Context Example
{
    "Account": {
        "Group": [
            {
                "Created": "2016-04-12T15:01:50.000Z",
                "Description": "All users in your organization",
                "ID": "00g66lckcsAJpLcNc0h7",
                "LastMembershipUpdated": "2020-03-26T13:56:49.000Z",
                "LastUpdated": "2016-04-12T15:01:50.000Z",
                "Name": "Everyone",
                "ObjectClass": [
                    "okta:user_group"
                ],
                "Type": "BUILT_IN"
            },
            {
                "Created": "2018-01-19T02:02:06.000Z",
                "ID": "00gdougcq3zEaf7c50h7",
                "LastMembershipUpdated": "2020-03-26T13:49:47.000Z",
                "LastUpdated": "2018-01-19T02:02:06.000Z",
                "Name": "Demisto",
                "ObjectClass": [
                    "okta:user_group"
                ],
                "Type": "OKTA_GROUP"
            }
        ],
        "ID": "00uqk1qesl3k0SRbH0h7",
        "Type": "Okta"
    }
}
Human Readable Output

Okta groups for user: testForDocs@test.com

Groups

Created Description ID LastMembershipUpdated LastUpdated Name ObjectClass Type
2016-04-12T15:01:50.000Z All users in your organization 00g66lckgAJpLcNc0h7 2020-03-26T13:56:49.000Z 2016-04-12T15:01:50.000Z Everyone okta:user_group BUILT_IN
2018-01-19T02:02:06.000Z   00gdougcgzEaf7c50h7 2020-03-26T13:49:47.000Z 2018-01-19T02:02:06.000Z Demisto okta:user_group OKTA_GROUP

okta-verify-push-factor


Enrolls and verifies a push factor for the specified user.

Base Command

okta-verify-push-factor

Input

Argument Name Description Required
userId The ID of the user to enroll and verify. Required
factorId The push factor ID. Required
polling_time Time to wait between subsequent polling calls. Value is in seconds. Default time is 5 seconds. Optional
max_polling_calls Maximum number of polling calls. Default value is 10. Optional
polling Whether to poll for the push factor challenge result. Possible values are: true, false. Default is true. Optional

Context Output

Path Type Description
Account.ID String Okta user ID.
Account.VerifyPushResult String Okta user push factor result.
Okta.PollingStatusURL String The polling URL for the push factor challenge.
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).
Command Example

!okta-verify-push-factor factorId=opfpt1joeaArlg27g0h7 userId=00upt1w8t40wFQM2v0h7

Human Readable Output

Verify push factor result for user 00upt1w8t40wgQM2v0h7: WAITING

Context Example
{
    "factorResult": "WAITING",
    "profile": {
        "credentialId": "test@this.com",
        "deviceType": "SmartPhone_IPhone",
        "keys": [
            {
                "kty": "EC",
                "use": "sig",
                "kid": "default",
                "x": "3Y53lDoQYwzzVbjsbsPnqOnVaotIrVByQh5Sa-RwOHQ",
                "y": "0zHY_y9rVh-bq_-lR-MrmzNtUZrrIMbTrsjtxUyUT2Q",
                "crv": "P-256"
            }
        ],
        "name": "iPhone (5)",
        "platform": "IOS",
        "version": "13.1.3"
    },
    "expiresAt": "2020-02-24T11:37:08.000Z",
    "_links": {
        "cancel": {
            "href": "https://test.com/api/v1/users/00upt1w8t40wgQM2v0h7/factors/FactorID/transactions/TransactionID",
            "hints": {
                "allow": [
                    "DELETE"
                ]
            }
        },
        "poll": {
            "href": "https://test.com/api/v1/users/00upt1w8t40wgQM2v0h7/factors/FactorID/transactions/TransactionID",
            "hints": {
                "allow": [
                    "GET"
                ]
            }
        }
    }
}

okta-verify-mfa-status


Verifies the status of a push factor challenge.

Base Command

okta-verify-mfa-status

Input

Argument Name Description Required
polling_url The polling URL for the push factor challenge. Required

Context Output

Path Type Description
Okta.FactorResult.ID String The push factor challenge ID.
Okta.FactorResult.factorResult String The result of the factor challenge.
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).
Command Example

!okta-verify-mfa-status polling_url="https://test.com/api/v1/users/TestID/factors/FactorID/transactions/TransactionID"

Human Readable Output

The status of the push factor is SUCCESS

okta-search


Searches for Okta users.

Base Command

okta-search

Input

Argument Name Description Required
term Term by which to search. Can be a first name, last name, or email address. The argument term or advanced_search is required. Optional
advanced_search Searches for users with a supported filtering expression for most properties, including custom-defined properties. The argument term or advanced_search is required. Optional
limit The maximum number of results to return. The default and maximum is 200. Optional
verbose Whether to return details of users that match the found term. Can be “true” or “false”. The default is “false”. Possible values are: true, false. Default is false. Optional

Context Output

Path Type Description
Account.ID String Okta account IDs returned by the search.
Account.Username String Okta account usernames returned by the search.
Account.Email String Okta account emails returned by the search.
Account.DisplayName String Okta account display names returned by the search.
Account.Type String Okta account type returned by the search.
Account.Status String Okta account current status.
Account.Created Date Timestamp for when the user was created.
Account.Activated Date Timestamp for when the user was activated.
Account.StatusChanged Date Timestamp for when the user’s status was last changed.
Account.PasswordChanged Date Timestamp for when the user’s password was last changed.
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).
Command Example

!okta-search term=test verbose=true

Context Example
{
    "Account": [
               {
            "Activated": "2020-02-12T14:03:51.000Z",
            "Created": "2020-02-12T14:03:50.000Z",
            "DisplayName": "bar test",
            "Email": "bartest@test.com",
            "ID": "00uppjeleqJQ2kkN80h7",
            "Status": "PROVISIONED",
            "StatusChanged": "2020-02-12T14:03:51.000Z",
            "Type": "Okta",
            "Username": "bartest@test.com"
        },
        {
            "Activated": "2020-02-19T12:33:20.000Z",
            "Created": "2018-07-31T12:48:33.000Z",
            "DisplayName": "test that",
            "Email": "test@that.com",
            "ID": "00ufufhqits3y78Ju0h7",
            "PasswordChanged": "2020-02-06T13:32:56.000Z",
            "Status": "PROVISIONED",
            "StatusChanged": "2020-02-19T12:33:20.000Z",
            "Type": "Okta",
            "Username": "test@that.com"
        },
        {
            "Activated": "2020-03-26T13:56:52.000Z",
            "Created": "2020-03-26T13:56:49.000Z",
            "DisplayName": "test that",
            "Email": "testForDocs@test.com",
            "ID": "00uqk1qesl3k0SRbH0h7",
            "PasswordChanged": "2020-03-26T13:56:50.000Z",
            "Status": "ACTIVE",
            "StatusChanged": "2020-03-26T13:56:52.000Z",
            "Type": "Okta",
            "Username": "testForDocs@test.com"
        }
    ]
}
Human Readable Output

Okta users found:
User:bartest@test.com

Profile

Email First Name Last Name Login Mobile Phone Second Email
bartest@test.com bar test bartest@test.com    
Additional Data
Activated Created Credentials ID Last Login Last Updated Password Changed Status Status Changed Type _links
2020-02-12T14:03:51.000Z 2020-02-12T14:03:50.000Z provider: {“type”: “OKTA”, “name”: “OKTA”} 00uppjeleqJQ2kkN80h7   2020-02-12T14:03:51.000Z   PROVISIONED   id: oty66lckcvDyVcGzS0h7 self: {“href”: “https://yourdomain.okta.com/api/v1/users/00uppjeleqJQ2kkN80h7”}
User:test@that.com
Profile
Email First Name Last Name Login Mobile Phone Second Email
test@that.com test that test@that.com   test@that.com
Additional Data
Activated Created Credentials ID Last Login Last Updated Password Changed Status Status Changed Type _links
2020-02-19T12:33:20.000Z 2018-07-31T12:48:33.000Z provider: {“type”: “OKTA”, “name”: “OKTA”} 00ufufhqits3y78Ju0h7   2020-02-19T12:33:20.000Z 2020-02-06T13:32:56.000Z PROVISIONED   id: oty66lckcvDyVcGzS0h7 self: {“href”: “https://yourdomain.okta.com/api/v1/users/00ufufhqits3y78Ju0h7”}
User:testForDocs@test.com
Profile
Email First Name Last Name Login Mobile Phone Second Email
testForDocs@test.com test that testForDocs@test.com    
Additional Data
Activated Created Credentials ID Last Login Last Updated Password Changed Status Status Changed Type _links
2020-03-26T13:56:52.000Z 2020-03-26T13:56:49.000Z password: {}recovery_question: {“question”: “whats is your favourite integration”}provider: {“type”: “OKTA”, “name”: “OKTA”} 00uqk1qesl3k0SRbH0h7   2020-03-26T13:56:52.000Z 2020-03-26T13:56:50.000Z ACTIVE   id: oty66lckcvDyVcGzS0h7 self: {“href”: “https://yourdomain.okta.com/api/v1/users/00uqk1qesl3k0SRbH0h7”}

okta-get-user


Fetches information for a single user. You must enter one or more parameters for the command to run.

Base Command

okta-get-user

Input

Argument Name Description Required
username Okta username for which to get information. Optional
userId User ID of the user for which to get information. Optional
userEmail Email of the user for which to get information. Optional
verbose Whether to return extended user information. Can be “true” or “false”. The default is “false”. Possible values are: true, false. Default is false. Optional

Context Output

Path Type Description
Account.ID String Okta account ID.
Account.Email String Okta account email.
Account.Username String Okta account username.
Account.DisplayName String Okta account display name.
Account.Status String Okta account status.
Account.Created Date Timestamp for when the user was created.
Account.Activated Date Timestamp for when the user was activated.
Account.StatusChanged Date Timestamp for when the user’s status was last changed.
Account.PasswordChanged Date Timestamp for when the user’s password was last changed.
Account.Manager String The manager.
Account.ManagerEmail String The manager email.
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).
Command Example

!okta-get-user username=testForDocs@test.com verbose=true

Context Example
{
    "Account": {
        "Activated": "2020-03-26T13:56:52.000Z",
        "Created": "2020-03-26T13:56:49.000Z",
        "DisplayName": "test that",
        "Email": "testForDocs@test.com",
        "ID": "00uqk1qesl3k0SRbH0h7",
        "Manager": "manager@test.com",
        "ManagerEmail": null,
        "PasswordChanged": "2020-03-26T13:56:50.000Z",
        "Status": "ACTIVE",
        "StatusChanged": "2020-03-26T13:56:52.000Z",
        "Type": "Okta",
        "Username": "testForDocs@test.com"
    }
}
Human Readable Output

User:testForDocs@test.com

Profile

Email First Name Last Name Login Manager Manager Email Mobile Phone Second Email
testForDocs@test.com test that testForDocs@test.com manager@test.com      
Additional Data
Activated Created Credentials ID Last Login Last Updated Password Changed Status Status Changed Type _links
2020-03-26T13:56:52.000Z 2020-03-26T13:56:49.000Z password: {}recovery_question: {“question”: “whats is your favourite integration”} provider: {“type”: “OKTA”, “name”: “OKTA”} 00uqk1qesl3k0SRbH0h7   2020-03-26T13:56:52.000Z 2020-03-26T13:56:50.000Z ACTIVE   id: oty66lckcvDyVcGzS0h7 links

okta-list-users


Lists users in your organization.

Base Command

okta-list-users

Input

Argument Name Description Required
after The cursor in which to retrive the results from and on. if the query didn’t reach the end of results, the tag can be obtained from the bottom of the grid in the readable output, or in the context path Okta.User.tag. Optional
limit The maximum number of results to return. Default is 200. Optional
verbose Whether to return extended user information. Possible values are: true, false. Default is false. Optional
query Searches the name property of groups for matching values. Optional
filter Useful for performing structured queries where constraints on group attribute values can be explicitly targeted.
The following expressions are supported(among others) for groups with the filter query parameter:
type eq “OKTA_GROUP” - Groups that have a type of OKTA_GROUP; lastUpdated lt “yyyy-MM-dd’‘T’‘HH:mm:ss.SSSZ” - Groups with profile last updated before a specific timestamp; lastMembershipUpdated eq “yyyy-MM-dd’‘T’‘HH:mm:ss.SSSZ” - Groups with memberships last updated at a specific timestamp; id eq “00g1emaKYZTWRYYRRTSK” - Group with a specified ID. For more information about filtering, visit https://developer.okta.com/docs/api/getting_started/design_principles#filtering.
Optional

Context Output

Path Type Description
Account.ID String Okta account ID.
Account.Email String Okta account email.
Account.Username String Okta account username.
Account.DisplayName String Okta account display name.
Account.Status String Okta account status.
Account.Created Date Timestamp for when the user was created.
Account.Activated Date Timestamp for when the user was activated.
Account.StatusChanged Date Timestamp for when the user’s status was last changed.
Account.PasswordChanged Date Timestamp for when the user’s password was last changed.
Okta.User.tag String The location of the next item, used with after param.
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).

okta-create-user


Creates a new user with an option of setting a password, recovery question, and answer. The new user will immediately be able to log in after activation with the assigned password. This flow is common when developing a custom user registration experience.

Base Command

okta-create-user

Input

Argument Name Description Required
firstName First name of the user (givenName). Required
lastName Family name of the user (familyName). Required
email Primary email address of the user. Required
login Unique identifier for the user (username). Required
secondEmail Secondary email address of user. Usually used for account recovery. Optional
middleName Middle name(s) of the user. Optional
honorificPrefix A comma-separated list of honorific prefix(es) of the user, or title in most Western languages. Optional
honorificSuffix A comma-separated list of honorific suffix(es) of the user. Optional
title User’s title. for example, Vice President. Optional
displayName Display name of the user. Optional
nickName Casual way to address the user (nick name). Optional
profileUrl URL of the user online profile. For example, a web page. Optional
primaryPhone Primary phone number of the user. Optional
mobilePhone Mobile phone number of the user. Optional
streetAddress Full street address component of the user’s address. Optional
city City or locality component of the user’s address (locality). Optional
state State or region component of the user’s address (region). Optional
zipCode Zip code or postal code component of the user’s address (postalCode). Optional
countryCode Country name component of the user’s address (country). Optional
postalAddress Mailing address component of the user’s address. Optional
preferredLanguage User’s preferred written or spoken languages. Optional
locale User’s default location, for purposes of localizing items such as currency, date-time format, numerical representations, etc. Optional
timezone User’s time zone. Optional
userType The user type, which is used to identify the organization-to-user relationship such as “Employee” or “Contractor”. Optional
employeeNumber Organization or company assigned unique identifier for the user. Optional
costCenter Name of a cost center the user is assigned to. Optional
organization Name of the user’s organization. Optional
division Name of the user’s division. Optional
department Name of the user’s department. Optional
managerId ID of the user’s manager. Optional
manager Display name of the user’s manager. Optional
password Password for the new user. Optional
passwordQuestion Password question for the new user. Optional
passwordAnswer Password answer for question. Optional
providerType The provider type. Can be “OKTA”, “ACTIVE_DIRECTORY”, “LDAP”, “FEDERATION”, or “SOCIAL”. Possible values are: OKTA, ACTIVE_DIRECTORY, LDAP, FEDERATION, SOCIAL. Optional
providerName Name of the provider. Optional
groupIds IDs of groups that the user will be immediately added to at time of creation (does Not include default group). Optional
activate Whether to activate the lifecycle operation when creating the user. Can be “true” or “false”. Possible values are: true, false. Optional

Context Output

Path Type Description
Account.ID String Created Okta account ID.
Account.Email String Created Okta account email address.
Account.Username String Created okta account username.
Account.DisplayName String Created Okta account display name.
Account.Type String Type of created account - Okta.
Account.Status String Okta account current status.
Account.Created Date Timestamp for when the user was created.
Account.Activated Date Timestamp for when the user was activated.
Account.StatusChanged Date Timestamp for when the user’s status was last changed.
Account.PasswordChanged Date Timestamp for when the user’s password was last changed.
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).
Command Example

!okta-create-user email=testForDocs@test.com firstName=test lastName=that login=testForDocs@test.com password=Pa55word! passwordQuestion="whats is your favourite integration" passwordAnswer="Okta of course"

Context Example
{
    "Account": {
        "Activated": null,
        "Created": "2020-03-26T13:56:49.000Z",
        "DisplayName": "test that",
        "Email": "testForDocs@test.com",
        "ID": "00uqk1qesl3k0SRbH0h7",
        "PasswordChanged": "2020-03-26T13:56:50.000Z",
        "Status": "STAGED",
        "StatusChanged": null,
        "Type": "Okta",
        "Username": "testForDocs@test.com"
    }
}
Human Readable Output

Okta User Created: testForDocs@test.com

First Name ID Last Login Last Name Login Mobile Phone Status
test 00uqk1qesl3k0SRbH0h7   that testForDocs@test.com   STAGED

okta-update-user


Updates a user with a given login. All fields are optional. Fields which are not set, will not be overwritten.

Base Command

okta-update-user

Input

Argument Name Description Required
firstName First name of the user (given name). Optional
lastName Family name of the user. Optional
email Primary email address of the user. Optional
username Unique identifier for the user (login). Required
secondEmail Secondary email address of the user (typically used for account recovery. Optional
middleName Middle name(s) of the user. Optional
honorificPrefix Honorific prefix(es) of the user, or title in most Western languages. Optional
honorificSuffix Honorific suffix(es) of the user. Optional
title User’s title. For example, Vice President. Optional
displayName Display name of the user. Optional
nickName Casual way to address the user in real life (nick name). Optional
profileUrl URL of the user’s online profile. For example, a web page. Optional
primaryPhone Primary phone number of the user. Optional
mobilePhone Mobile phone number of the user. Optional
streetAddress Full street address component of the user’s address. Optional
city City or locality component of the user’s address (locality). Optional
state State or region component of the user’s address (region). Optional
zipCode Zip code or postal code component of the user’s address (postalCode). Optional
countryCode Country name component of the user’s address (country). Optional
postalAddress Mailing address component of the user’s address. Optional
preferredLanguage User’s preferred written or spoken languages. Optional
locale User’s default location for purposes of localizing items such as currency, date-time format, numerical representations, etc. Optional
timezone User time zone. Optional
userType The user type, which is used to identify the organization-to-user relationship such as “Employee” or “Contractor”. Optional
employeeNumber Organization or company assigned unique identifier for the user. Optional
costCenter Name of a cost center the user is assigned to. Optional
organization Name of the user’s organization. Optional
division Name of the user’s division. Optional
department Name of the user’s department. Optional
managerId ID of the user’s manager. Optional
manager Display name of the user’s manager. Optional
password New password for the specified user. Optional
passwordQuestion Password question for the specified user. Optional
passwordAnswer Password answer for the question. Optional
providerType The provider type. Can be “OKTA”, “ACTIVE_DIRECTORY”, “LDAP”, “FEDERATION”, or “SOCIAL”. Possible values are: OKTA, ACTIVE_DIRECTORY, FEDERATION, SOCIAL. Optional
providerName Name of the provider. Optional

Context Output

Path Type Description
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).
Command Example

!okta-update-user username=testForDocs@test.com firstName="First Name Updated"

Human Readable Output

Okta user: testForDocs@test.com Updated

email firstName lastName login mobilePhone secondEmail
testForDocs@test.com First Name Updated that testForDocs@test.com    

okta-get-group-members


Enumerates all users that are members of a group.

Base Command

okta-get-group-members

Input

Argument Name Description Required
groupId ID of the group. Optional
limit The maximum number of results to return. Optional
verbose Whether to print extended user details. Can be “true” or “false”. The default is “false”. Possible values are: true, false. Default is false. Optional
groupName Name of the group. Optional

Context Output

Path Type Description
Account.ID String Okta account ID.
Account.Email String Okta account email address.
Account.Username String Okta account username.
Account.DisplayName String Okta account display name.
Account.Type String Account type - Okta.
Account.Status String Okta account current status.
Account.Created Date Timestamp for when the user was created.
Account.Activated Date Timestamp for when the user was activated.
Account.StatusChanged Date Timestamp for when the user’s status was last changed.
Account.PasswordChanged Date Timestamp for when the user’s password was last changed.
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).
Command Example

!okta-get-group-members groupName=Demisto limit=1 verbose=true

Context Example
{
    "Account": {
        "Created": "2016-04-12T15:01:52.000Z",
        "DisplayName": "Test Demisto",
        "Email": "XSOAR@demisto.com",
        "ID": "00u66ljhpjidYi0h7",
        "PasswordChanged": "2020-02-24T11:40:08.000Z",
        "Status": "ACTIVE",
        "StatusChanged": "2016-04-12T15:05:06.000Z",
        "Type": "Okta",
        "Username": "XSOAR@demisto.com"
    }
}
Human Readable Output

Users for group: Demisto

User:Test@demisto.com

Profile

Email First Name Last Name Login Mobile Phone Second Email
XSOAR@demisto.com Test Demisto XSOAR@demisto.com    
Additional Data
Activated Created Credentials ID Last Login Last Updated Password Changed Status Status Changed Type _links
  2016-04-12T15:01:52.000Z password: {} recovery_question: {“question”: “born city”} provider: {“type”: “OKTA”, “name”: “OKTA”} 00u66lckd7lpjidYi0h7 2020-03-12T09:54:36.000Z 2020-02-24T11:42:22.000Z 2020-02-24T11:40:08.000Z ACTIVE   id: oty66lckcyVcGzS0h7 self: {“href”: “https://yourdomain.okta.com/api/v1/users/00uclpjidYi0h7”}

okta-list-groups


Lists groups in your organization. A subset of groups can be returned that match a supported filter expression or query.

Base Command

okta-list-groups

Input

Argument Name Description Required
query Searches the name property of groups for matching values. Optional
filter Useful for performing structured queries where constraints on group attribute values can be explicitly targeted.
The following expressions are supported(among others) for groups with the filter query parameter:
type eq “OKTA_GROUP” - Groups that have a type of OKTA_GROUP; lastUpdated lt “yyyy-MM-dd’‘T’‘HH:mm:ss.SSSZ” - Groups with profile last updated before a specific timestamp; lastMembershipUpdated eq “yyyy-MM-dd’‘T’‘HH:mm:ss.SSSZ” - Groups with memberships last updated at a specific timestamp; id eq “00g1emaKYZTWRYYRRTSK” - Group with a specified ID. For more information about filtering, visit https://developer.okta.com/docs/api/getting_started/design_principles#filtering.
Optional
limit The maximum number of results to return. The default is 200. Default is 200. Optional

Context Output

Path Type Description
Okta.Group.ID String Unique key for the group.
Okta.Group.Created Date Timestamp for when the group was created.
Okta.Group.ObjectClass Unknown The group’s profile.
Okta.Group.LastUpdated Date Timestamp for when the group’s profile was last updated.
Okta.Group.LastMembershipUpdated Date Timestamp for when the group’s membership was last updated.
Okta.Group.Type String The group type, which determines how a group’s profile and membership are managed. Can be “OKTA_GROUP”, “APP_GROUP”, or “BUILT_IN”.
Okta.Group.Name String Name of the group.
Okta.Group.Description String Description of the group.
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).
Command Example

!okta-list-groups filter=`type eq "OKTA_GROUP" and lastUpdated lt "2019-04-30T00:00:00.000Z" and lastMembershipUpdated gt "2019-04-30T00:00:00.000Z"` query=demisto

Context Example
{
    "Okta": {
        "Group": {
            "Created": "2018-01-19T02:02:06.000Z",
            "ID": "00gdout3zEaf7c50h7",
            "LastMembershipUpdated": "2020-03-26T13:56:56.000Z",
            "LastUpdated": "2018-01-19T02:02:06.000Z",
            "Name": "Demisto",
            "ObjectClass": [
                "okta:user_group"
            ],
            "Type": "OKTA_GROUP"
        }
    }
}
Human Readable Output

Groups

Created Description ID LastMembershipUpdated LastUpdated Name ObjectClass Type
2018-01-19T02:02:06.000Z   00gdougctEaf7c50h7 2020-03-26T13:56:56.000Z 2018-01-19T02:02:06.000Z Demisto okta:user_group OKTA_GROUP

okta-get-failed-logins


Returns failed login events.

Base Command

okta-get-failed-logins

Input

Argument Name Description Required
since Filters the lower time bound of the log events in the Internet Date/Time Format profile of ISO 8601. An example: 2017-05-03T16:22:18Z. Optional
until Filters the upper time bound of the log events in the Internet Date/Time Format profile of ISO 8601. An example: 2017-05-03T16:22:18Z. Optional
sortOrder The order of the returned events. Can be “ASCENDING” or “DESCENDING”. The default is “ASCENDING”. Possible values are: ASCENDING, DESCENDING. Default is ASCENDING. Optional
limit The maximum number of results to return. The default is 100. Optional

Context Output

Path Type Description
Okta.Logs.Events.actor.alternateId String Alternative ID of the actor.
Okta.Logs.Events.actor.displayName String Display name of the actor.
Okta.Logs.Events.actor.id String ID of the actor.
Okta.Logs.Events.client.userAgent.rawUserAgent String A raw string representation of the user agent, formatted according to section 5.5.3 of HTTP/1.1 Semantics and Content. Both the browser and the OS fields can be derived from this field.
Okta.Logs.Events.client.userAgent.os String The operating system on which the client runs. For example, Microsoft Windows 10.
Okta.Logs.Events.client.userAgent.browser String Identifies the browser type, if relevant. For example, Chrome.
Okta.Logs.Events.client.device String Type of device that client operated from. For example, Computer.
Okta.Logs.Events.client.id String For OAuth requests, the ID of the OAuth client making the request. For SSWS token requests, the ID of the agent making the request.
Okta.Logs.Events.client.ipAddress String IP address from which the client made its request.
Okta.Logs.Events.client.geographicalContext.city String The city encompassing the area containing the geo-location coordinates, if available. For example, Seattle, San Francisco.
Okta.Logs.Events.client.geographicalContext.state String Full name of the state or province encompassing the area containing the geo-location coordinates. For example Montana, Incheon.
Okta.Logs.Events.client.geographicalContext.country String Full name of the country encompassing the area containing the geo-location coordinates. For example, France, Uganda.
Okta.Logs.Events.displayMessage String The display message for an event.
Okta.Logs.Events.eventType String Type of event that was published.
Okta.Logs.Events.outcome.result String Result of the action. Can be “SUCCESS”, “FAILURE”, “SKIPPED”, “UNKNOWN”.
Okta.Logs.Events.outcome.reason String Reason for the result. For example, INVALID_CREDENTIALS.
Okta.Logs.Events.published String Timestamp when the event was published.
Okta.Logs.Events.severity String The event severity. Can be “DEBUG”, “INFO”, “WARN”, or “ERROR”.
Okta.Logs.Events.securityContext.asNumber Number Autonomous system number associated with the autonomous system that the event request was sourced to.
Okta.Logs.Events.securityContext.asOrg String Organization associated with the autonomous system that the event request was sourced to.
Okta.Logs.Events.securityContext.isp String Internet service provider used to send the event’s request.
Okta.Logs.Events.securityContext.domain String The domain name associated with the IP address of the inbound event request.
Okta.Logs.Events.securityContext.isProxy String Specifies whether an event’s request is from a known proxy.
Okta.Logs.Events.request.ipChain.IP String IP address.
Okta.Logs.Events.request.ipChain.geographicalContext.city String The city encompassing the area containing the geo-location coordinates, if available. For example, Seattle, San Francisco.
Okta.Logs.Events.request.ipChain.geographicalContext.state String Full name of the state or province encompassing the area containing the geo-location coordinates. For example, Montana, Incheon.
Okta.Logs.Events.request.ipChain.geographicalContext.country String Full name of the country encompassing the area containing the geo-location coordinates. For example, France, Uganda.
Okta.Logs.Events.request.ipChain.source String Details regarding the source.
Okta.Logs.Events.target.id String ID of a target.
Okta.Logs.Events.target.type String Type of a target.
Okta.Logs.Events.target.alternateId String Alternative ID of a target.
Okta.Logs.Events.target.displayName String Display name of a target.
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).
Command Example

!okta-get-failed-logins since="2019-04-30T00:00:00.000Z" limit=1

Context Example
{
    "Okta": {
        "Logs": {
            "Events": {
                "actor": {
                    "alternateId": "goo@test.com",
                    "detailEntry": null,
                    "displayName": "unknown",
                    "id": "unknown",
                    "type": "User"
                },
                "authenticationContext": {
                    "authenticationProvider": null,
                    "authenticationStep": 0,
                    "credentialProvider": null,
                    "credentialType": null,
                    "externalSessionId": "unknown",
                    "interface": null,
                    "issuer": null
                },
                "client": {
                    "device": "Computer",
                    "geographicalContext": {
                        "city": "Tel Aviv",
                        "country": "Israel",
                        "geolocation": {
                            "lat": 32.0678,
                            "lon": 34.7647
                        },
                        "postalCode": null,
                        "state": "Tel Aviv"
                    },
                    "id": null,
                    "ipAddress": "127.0.0.1",
                    "userAgent": {
                        "browser": "CHROME",
                        "os": "Windows 10",
                        "rawUserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"
                    },
                    "zone": "null"
                },
                "debugContext": {
                    "debugData": {
                        "loginResult": "VERIFICATION_ERROR",
                        "requestId": "XYM92q-0Fs0ewvRQZVAlzwAABL8",
                        "requestUri": "/api/v1/authn",
                        "url": "/api/v1/authn?"
                    }
                },
                "displayMessage": "User login to Okta",
                "eventType": "user.session.start",
                "legacyEventType": "core.user_auth.login_failed",
                "outcome": {
                    "reason": "VERIFICATION_ERROR",
                    "result": "FAILURE"
                },
                "published": "2019-09-19T08:35:38.353Z",
                "request": {
                    "ipChain": [
                        {
                            "geographicalContext": {
                                "city": "Tel Aviv",
                                "country": "Israel",
                                "geolocation": {
                                    "lat": 32.0678,
                                    "lon": 34.7647
                                },
                                "postalCode": null,
                                "state": "Tel Aviv"
                            },
                            "ip": "127.0.0.1",
                            "source": null,
                            "version": "V4"
                        }
                    ]
                },
                "securityContext": {
                    "asNumber": null,
                    "asOrg": null,
                    "domain": null,
                    "isProxy": null,
                    "isp": null
                },
                "severity": "INFO",
                "target": null,
                "transaction": {
                    "detail": {},
                    "id": "XYM92q-0Fs0ewvRQZVAlzwAABL8",
                    "type": "WEB"
                },
                "uuid": "7503c6b4-dab8-11e9-b336-d163e95fbe00",
                "version": "0"
            }
        }
    }
}
Human Readable Output

Failed Login Events

Actor ActorAlternaneId ChainIP Client EventInfo EventOutcome EventSeverity RequestIP Targets Time
unknown (User) admin 127.0.0.1 CHROME on Windows 10 Computer User login to Okta FAILURE: VERIFICATION_ERROR INFO 127.0.0.1 - 09/30/2019, 18:42:38

okta-get-logs


Gets logs by providing optional filters.

Base Command

okta-get-logs

Input

Argument Name Description Required
filter Useful for performing structured queries where constraints on LogEvent attribute values can be explicitly targeted.
The following expressions are supported for events with the filter query parameter: eventType eq “ :eventType”
-Events that have a specific action; eventType target.id eq “:id”
- Events published with a specific target id; actor.id eq “:id”
- Events published with a specific actor ID. For more information about filtering, visit https://developer.okta.com/docs/api/getting_started/design_principles#filtering.
Optional
query The query parameter can be used to perform keyword matching against a LogEvents object’s attribute values. To satisfy the constraint, all supplied keywords must be matched exactly. Note that matching is case-insensitive. The following are some examples of common keyword filtering:
Events that mention a specific city: query=San Francisco;
Events that mention a specific url: query=interestingURI.com;
Events that mention a specific person: query=firstName lastName.
Optional
since Filters the lower time bound of the log events in the Internet Date/Time Format profile of ISO 8601. For example: 2017-05-03T16:22:18Z. Optional
until Filters the upper time bound of the log events in the Internet Date/Time Format profile of ISO 8601. For example: 2017-05-03T16:22:18Z. Optional
sortOrder The order of the returned events. Can be “ASCENDING” or “DESCENDING”. The default is “ASCENDING”. Possible values are: ASCENDING, DESCENDING. Default is ASCENDING. Optional
limit The maximum number of results to return. The default is 100. Default is 100. Optional

Context Output

Path Type Description
Okta.Logs.Events.actor.alternateId String Alternative ID of the actor.
Okta.Logs.Events.actor.displayName String Display name of the actor.
Okta.Logs.Events.actor.id String ID of the actor.
Okta.Logs.Events.client.userAgent.rawUserAgent String A raw string representation of user agent, formatted according to section 5.5.3 of HTTP/1.1 Semantics and Content. Both the browser and the OS fields can be derived from this field.
Okta.Logs.Events.client.userAgent.os String The operating system on which the client runs. For example, Microsoft Windows 10.
Okta.Logs.Events.client.userAgent.browser String Identifies the type of web browser, if relevant. For example, Chrome.
Okta.Logs.Events.client.device String Type of device from which the client operated. For example, Computer.
Okta.Logs.Events.client.id String For OAuth requests, the ID of the OAuth client making the request. For SSWS token requests, the ID of the agent making the request.
Okta.Logs.Events.client.ipAddress String IP address from which the client made its request.
Okta.Logs.Events.client.geographicalContext.city String The city encompassing the area containing the geo-location coordinates, if available. For example, Seattle, San Francisco.
Okta.Logs.Events.client.geographicalContext.state String Full name of the state or province encompassing the area containing the geo-location coordinates. For example, Montana, Incheon.
Okta.Logs.Events.client.geographicalContext.country String Full name of the country encompassing the area containing the geo-location coordinates. For example, France, Uganda.
Okta.Logs.Events.displayMessage String The display message for an event.
Okta.Logs.Events.eventType String Type of event that was published.
Okta.Logs.Events.outcome.result String Result of the action. Can be “SUCCESS”, “FAILURE”, “SKIPPED”, or “UNKNOWN”.
Okta.Logs.Events.outcome.reason String Reason for the result. For example, INVALID_CREDENTIALS.
Okta.Logs.Events.published String Timestamp when the event was published.
Okta.Logs.Events.severity String The event severity. Can be “DEBUG”, “INFO”, “WARN”, or “ERROR”.
Okta.Logs.Events.securityContext.asNumber Number Autonomous system number associated with the autonomous system that the event request was sourced to.
Okta.Logs.Events.securityContext.asOrg String Organization associated with the autonomous system that the event request was sourced to.
Okta.Logs.Events.securityContext.isp String Internet service provider used to send the event’s request.
Okta.Logs.Events.securityContext.domain String The domain name associated with the IP address of the inbound event request.
Okta.Logs.Events.securityContext.isProxy String Specifies whether an event’s request is from a known proxy.
Okta.Logs.Events.request.ipChain.IP String IP address.
Okta.Logs.Events.request.ipChain.geographicalContext.city String The city encompassing the area containing the geo-location coordinates, if available. For example, Seattle, San Francisco.
Okta.Logs.Events.request.ipChain.geographicalContext.state String Full name of the state or province encompassing the area containing the geo-location coordinates. For example, Montana, Incheon.
Okta.Logs.Events.request.ipChain.geographicalContext.country String Full name of the country encompassing the area containing the geo-location coordinates. For example, France, Uganda.
Okta.Logs.Events.request.ipChain.source String Details regarding the source.
Okta.Logs.Events.target.id String ID of a target.
Okta.Logs.Events.target.type String Type of a target.
Okta.Logs.Events.target.alternateId String Alternative ID of a target.
Okta.Logs.Events.target.displayName String Display name of a target.
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).
Command Example

!okta-get-logs filter=`actor.id eq "00u66lckvpjidYi0h7"` query=Boardman since="2020-03-03T20:23:17.573Z" limit=1

Context Example
{
    "Okta": {
        "Logs": {
            "Events": {
                "actor": {
                    "alternateId": "Test@demisto.com",
                    "detailEntry": null,
                    "displayName": "Test Demisto",
                    "id": "00u66lvd7lpjidYi0h7",
                    "type": "User"
                },
                "authenticationContext": {
                    "authenticationProvider": null,
                    "authenticationStep": 0,
                    "credentialProvider": null,
                    "credentialType": null,
                    "externalSessionId": "trs3hs_F_UQT9K5FOPG7m4i1g",
                    "interface": null,
                    "issuer": null
                },
                "client": {
                    "device": "Unknown",
                    "geographicalContext": {
                        "city": "Boardman",
                        "country": "United States",
                        "geolocation": {
                            "lat": 45.8491,
                            "lon": -119.7143
                        },
                        "postalCode": "97818",
                        "state": "Oregon"
                    },
                    "id": null,
                    "ipAddress": "127.0.0.1",
                    "userAgent": {
                        "browser": "UNKNOWN",
                        "os": "Unknown",
                        "rawUserAgent": "Demisto/1.0"
                    },
                    "zone": "null"
                },
                "debugContext": {
                    "debugData": {
                        "requestId": "Xl68tch@7iZvNo0k8vPc5gAAAmE",
                        "requestUri": "/api/v1/groups/00g8mo0l5wuTxmoIC0h7/users/00uptu0jj9V91p5QM0h7",
                        "threatSuspected": "false",
                        "url": "/api/v1/groups/00g8mo0l5wuTxmoIC0h7/users/00uptu0jj9V91p5QM0h7?"
                    }
                },
                "displayMessage": "Remove user from group membership",
                "eventType": "group.user_membership.remove",
                "legacyEventType": "core.user_group_member.user_remove",
                "outcome": {
                    "reason": null,
                    "result": "SUCCESS"
                },
                "published": "2020-03-03T20:23:17.573Z",
                "request": {
                    "ipChain": [
                        {
                            "geographicalContext": {
                                "city": "Boardman",
                                "country": "United States",
                                "geolocation": {
                                    "lat": 45.8491,
                                    "lon": -119.7143
                                },
                                "postalCode": "97818",
                                "state": "Oregon"
                            },
                            "ip": "127.0.0.1",
                            "source": null,
                            "version": "V4"
                        }
                    ]
                },
                "securityContext": {
                    "asNumber": null,
                    "asOrg": null,
                    "domain": null,
                    "isProxy": null,
                    "isp": null
                },
                "severity": "INFO",
                "target": [
                    {
                        "alternateId": "test@this.com",
                        "detailEntry": null,
                        "displayName": "test this",
                        "id": "00uptu0jj9V91p5QM0h7",
                        "type": "User"
                    },
                    {
                        "alternateId": "unknown",
                        "detailEntry": null,
                        "displayName": "test1",
                        "id": "00g8mo0l5wuTxmoIC0h7",
                        "type": "UserGroup"
                    }
                ],
                "transaction": {
                    "detail": {},
                    "id": "Xl68tch@7iZvNo0k8vPc5gAAAmE",
                    "type": "WEB"
                },
                "uuid": "d14117f9-5d8c-11ea-a9cb-1f2fbd3b03f7",
                "version": "0"
            }
        }
    }
}
Human Readable Output

Okta Events

Actor ActorAlternaneId ChainIP Client EventInfo EventOutcome EventSeverity RequestIP Targets Time
Test Demisto (User) Test@demisto.com 127.0.0.1 Unknown browser on Unknown OS Unknown device Remove user from group membership SUCCESS INFO 127.0.0.1 test this (User) test1 (UserGroup) 03/03/2020, 20:23:17

okta-get-group-assignments


Gets events for when a user was added to a group.

Base Command

okta-get-group-assignments

Input

Argument Name Description Required
since Filters the lower time bound of the log event in the Internet Date\Time format profile of ISO 8601. For example, 2020-02-14T16:00:18Z. Optional
until Filters the upper time bound of the log event in the Internet Date\Time format profile of ISO 8601. For example, 2020-02-14T16:00:18Z. Optional
sortOrder The order of the returned events. Can be “ASCENDING” or “DESCENDING”. The default is “ASCENDING”. Possible values are: ASCENDING, DESCENDING. Default is ASCENDING. Optional
limit The maximum number of results to return. The default is 100. Default is 100. Optional

Context Output

Path Type Description
Okta.Logs.Events.actor.alternateId String Alternative ID of the actor.
Okta.Logs.Events.actor.displayName String Display name of the actor.
Okta.Logs.Event.actor.id String ID of the actor.
Okta.Logs.Events.client.userAgent.rawUserAgent String A raw string representation of user agent, formatted according to section 5.5.3 of HTTP/1.1 Semantics and Content. Both the browser and the OS fields can be derived from this field.
Okta.Logs.Events.client.userAgent.os String The operating system on which the client runs. For example, Microsoft Windows 10.
Okta.Logs.Events.client.userAgent.browser String Identifies the type of web browser, if relevant. For example, Chrome.
Okta.Logs.Events.client.device String Type of device from which the client operated. For example, Computer.
Okta.Logs.Events.client.id String For OAuth requests, the ID of the OAuth client making the request. For SSWS token requests, the ID of the agent making the request.
Okta.Logs.Events.client.ipAddress String IP address from which the client made its request.
Okta.Logs.Events.client.geographicalContext.city String The city encompassing the area containing the geo-location coordinates, if available. For example, Seattle, San Francisco.
Okta.Logs.Events.client.geographicalContext.state String Full name of the state or province encompassing in the area containing the geo-location coordinates. For example, Montana, Incheon.
Okta.Logs.Events.client.geographicalContext.country String Full name of the country encompassing the area containing the geo-location coordinates. For example, France, Uganda.
Okta.Logs.Events.displayMessage String The display message for an event.
Okta.Logs.Events.eventType String Type of event that was published.
Okta.Logs.Events.outcome.result String Result of the action. Can be “SUCCESS”, “FAILURE”, “SKIPPED”, or “UNKNOWN”.
Okta.Logs.Events.outcome.reason Unknown Reason for the result. For example INVALID_CREDENTIALS.
Okta.Logs.Events.published String Timestamp when the event was published.
Okta.Logs.Events.severity String The event severity. Can be “DEBUG”, “INFO”, “WARN”, or “ERROR”.
Okta.Logs.Events.securityContext.asNumber Number Autonomous system number associated with the autonomous system that the event request was sourced to.
Okta.Logs.Events.securityContext.asOrg String Organization associated with the autonomous system that the event request was sourced to.
Okta.Logs.Events.securityContext.isp String Internet service provider used to send the event’s request.
Okta.Logs.Events.securityContext.domain String The domain name associated with the IP address of the inbound event request.
Okta.Logs.Events.securityContext.isProxy String Specifies whether an event’s request is from a known proxy.
Okta.Logs.Events.request.ipChain.IP String IP address.
Okta.Logs.Events.request.ipChain.geographicalContext.city String The city encompassing the area containing the geo-location coordinates, if available. For example, Seattle, San Francisco.
Okta.Logs.Events.request.ipChain.geographicalContext.state String Full name of the state or province encompassing the area containing the geo-location coordinates. For example, Montana, Incheon.
Okta.Logs.Events.request.ipChain.geographicalContext.country String Full name of the country encompassing the area containing the geo-location coordinates. For example, France, Uganda.
Okta.Logs.Events.request.ipChain.source String Details regarding the source.
Okta.Logs.Events.target.id String ID of a target.
Okta.Logs.Events.target.type String Target type.
Okta.Logs.Events.target.alternateId String Alternative ID of a target.
Okta.Logs.Events.target.displayName String Display name of a target.
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).
Command Example

!okta-get-group-assignments since="2019-04-30T00:00:00.000Z" limit=1

Context Example
{
    "Okta": {
        "Logs": {
            "Events": {
                "actor": {
                    "alternateId": "Test@demisto.com",
                    "detailEntry": null,
                    "displayName": "Test Demisto",
                    "id": "00u66lckd7lpjidYi0h7",
                    "type": "User"
                },
                "authenticationContext": {
                    "authenticationProvider": null,
                    "authenticationStep": 0,
                    "credentialProvider": null,
                    "credentialType": null,
                    "externalSessionId": "trs4IvlVrvVR9G8RPsPtFjwBA",
                    "interface": null,
                    "issuer": null
                },
                "client": {
                    "device": "Unknown",
                    "geographicalContext": {
                        "city": "Boardman",
                        "country": "United States",
                        "geolocation": {
                            "lat": 45.8491,
                            "lon": -119.7143
                        },
                        "postalCode": "97818",
                        "state": "Oregon"
                    },
                    "id": null,
                    "ipAddress": "127.0.0.1",
                    "userAgent": {
                        "browser": "UNKNOWN",
                        "os": "Unknown",
                        "rawUserAgent": "Demisto/1.0"
                    },
                    "zone": "null"
                },
                "debugContext": {
                    "debugData": {
                        "requestId": "XXxTqUauHPkBXo4-TEcw9QAAAq0",
                        "requestUri": "/api/v1/groups/00g8mo0l5wuTxmoIC0h7/users/00ued6gq9jItNhAsN0h7",
                        "url": "/api/v1/groups/00g8mo0l5wuTxmoIC0h7/users/00ued6gq9jItNhAsN0h7?"
                    }
                },
                "displayMessage": "Add user to group membership",
                "eventType": "group.user_membership.add",
                "legacyEventType": "core.user_group_member.user_add",
                "outcome": {
                    "reason": null,
                    "result": "SUCCESS"
                },
                "published": "2019-09-14T02:42:49.379Z",
                "request": {
                    "ipChain": [
                        {
                            "geographicalContext": {
                                "city": "Boardman",
                                "country": "United States",
                                "geolocation": {
                                    "lat": 45.8491,
                                    "lon": -119.7143
                                },
                                "postalCode": "97818",
                                "state": "Oregon"
                            },
                            "ip": "127.0.0.1",
                            "source": null,
                            "version": "V4"
                        }
                    ]
                },
                "securityContext": {
                    "asNumber": null,
                    "asOrg": null,
                    "domain": null,
                    "isProxy": null,
                    "isp": null
                },
                "severity": "INFO",
                "target": [
                    {
                        "alternateId": "test@this.com",
                        "detailEntry": null,
                        "displayName": "test this",
                        "id": "00ued6gq9jItNhAsN0h7",
                        "type": "User"
                    },
                    {
                        "alternateId": "unknown",
                        "detailEntry": null,
                        "displayName": "test1",
                        "id": "00g8mo0l5wuTxmoIC0h7",
                        "type": "UserGroup"
                    }
                ],
                "transaction": {
                    "detail": {},
                    "id": "XXxTqUauHPkBXo4-TEcw9QAAAq0",
                    "type": "WEB"
                },
                "uuid": "5741ef53-d699-11e9-a08c-d549acc8afb2",
                "version": "0"
            }
        }
    }
}
Human Readable Output

Group Assignment Events

Actor ActorAlternaneId ChainIP Client EventInfo EventOutcome EventSeverity RequestIP Targets Time
Test Demisto (User) Test@demisto.com 127.0.0.1 Unknown browser on Unknown OS Unknown device Add user to group membership SUCCESS INFO 127.0.0.1 test this (User) test1 (UserGroup) 09/29/2019, 03:47:46

okta-get-application-assignments


Returns events for when a user was assigned to an application.

Base Command

okta-get-application-assignments

Input

Argument Name Description Required
since Filters the lower time bound of the log event in the Internet Date\Time format profile of ISO 8601. For example, 2020-02-14T16:00:18Z. Optional
until Filters the upper time bound of the log event in the Internet Date\Time format profile of ISO 8601. For example, 2020-02-14T16:00:18Z. Optional
sortOrder The order of the returned events. Can be “ASCENDING” or “DESCENDING”. The default is “ASCENDING”. Possible values are: ASCENDING, DESCENDING. Default is ASCENDING. Optional
limit The maximum number of results to return. The default is 100. Default is 100. Optional

Context Output

Path Type Description
Okta.Logs.Events.actor.alternateId String Alternative ID of the actor.
Okta.Logs.Events.actor.displayName String Display name of the actor.
Okta.Logs.Event.actor.id String ID of the actor.
Okta.Logs.Events.client.userAgent.rawUserAgent String A raw string representation of the user agent, formatted according to section 5.5.3 of HTTP/1.1 Semantics and Content. Both the browser and the OS fields can be derived from this field.
Okta.Logs.Events.client.userAgent.os String The OS on which the client runs. For example, Microsoft Windows 10.
Okta.Logs.Events.client.userAgent.browser String Identifies the type of web browser, if relevant. For example, Chrome.
Okta.Logs.Events.client.device String Type of device from which the client operated. For example, Computer.
Okta.Logs.Events.client.id String For OAuth requests, the ID of the OAuth client making the request. For SSWS token requests, the ID of the agent making the request.
Okta.Logs.Events.client.ipAddress String IP address from which the client made its request.
Okta.Logs.Events.client.geographicalContext.city String The city encompassing the area containing the geo-location coordinates, if available. For example, Seattle, San Francisco.
Okta.Logs.Events.client.geographicalContext.state String Full name of the state or province encompassing the area containing the geo-location coordinates. For example, Montana, Incheon.
Okta.Logs.Events.client.geographicalContext.country String Full name of the country encompassing the area containing the geo-location coordinates. For example, France, Uganda.
Okta.Logs.Events.displayMessage String The display message for an event.
Okta.Logs.Events.eventType String Type of event that was published.
Okta.Logs.Events.outcome.result String Result of the action. For example, “SUCCESS”, “FAILURE”, “SKIPPED”, or “UNKNOWN”.
Okta.Logs.Events.outcome.reason String Reason for the result. For example INVALID_CREDENTIALS.
Okta.Logs.Events.published String Timestamp when the event was published.
Okta.Logs.Events.severity String The event severity. Can be “DEBUG”, “INFO”, “WARN”, or “ERROR”.
Okta.Logs.Events.securityContext.asNumber Number Autonomous system number associated with the autonomous system that the event request was sourced to.
Okta.Logs.Events.securityContext.asOrg String Organization associated with the autonomous system that the event request was sourced to.
Okta.Logs.Events.securityContext.isp String Internet service provider used to send the event’s request.
Okta.Logs.Events.securityContext.domain String The domain name associated with the IP address of the inbound event request.
Okta.Logs.Events.securityContext.isProxy String Specifies whether an event’s request is from a known proxy.
Okta.Logs.Events.request.ipChain.IP String IP address.
Okta.Logs.Events.request.ipChain.geographicalContext.city String The city encompassing the area containing the geo-location coordinates, if available. For example, Seattle, San Francisco.
Okta.Logs.Events.request.ipChain.geographicalContext.state String Full name of the state or province encompassing the area containing the geo-location coordinates. For example, Montana, Incheon.
Okta.Logs.Events.request.ipChain.geographicalContext.country String Full name of the country encompassing the area containing the geo-location coordinates. For example, France, Uganda.
Okta.Logs.Events.request.ipChain.source String Details regarding the source.
Okta.Logs.Events.target.id String ID of a target.
Okta.Logs.Events.target.type String Type of a target.
Okta.Logs.Events.target.alternateId String Alternative ID of a target.
Okta.Logs.Events.target.displayName String Display name of a target.
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).
Command Example

!okta-get-application-assignments since="2019-04-30T00:00:00.000Z" until="2020-02-30T00:00:00.000Z" sortOrder=DESCENDING limit=1

Context Example
{
    "Okta": {
        "Logs": {
            "Events": {
                "actor": {
                    "alternateId": "Test@demisto.com",
                    "detailEntry": null,
                    "displayName": "Test Demisto",
                    "id": "00u66lckd7lpjidYi0h7",
                    "type": "User"
                },
                "authenticationContext": {
                    "authenticationProvider": null,
                    "authenticationStep": 0,
                    "credentialProvider": null,
                    "credentialType": null,
                    "externalSessionId": "trsFSV6XXY4TMCSB_xzJrZ85A",
                    "interface": null,
                    "issuer": null
                },
                "client": {
                    "device": "Unknown",
                    "geographicalContext": {
                        "city": "Boardman",
                        "country": "United States",
                        "geolocation": {
                            "lat": 45.8491,
                            "lon": -119.7143
                        },
                        "postalCode": "97818",
                        "state": "Oregon"
                    },
                    "id": null,
                    "ipAddress": "127.0.0.1",
                    "userAgent": {
                        "browser": "UNKNOWN",
                        "os": "Unknown",
                        "rawUserAgent": "python-requests/2.22.0"
                    },
                    "zone": "null"
                },
                "debugContext": {
                    "debugData": {
                        "requestId": "XlgCgAEBMJsNo5Yh9rHtZAAACPw",
                        "requestUri": "/api/v1/users/00upywm7l0rL1V0zt0h7/lifecycle/activate",
                        "threatSuspected": "false",
                        "url": "/api/v1/users/00upywm7l0rL1V0zt0h7/lifecycle/activate?"
                    }
                },
                "displayMessage": "Add user to application membership",
                "eventType": "application.user_membership.add",
                "legacyEventType": "app.generic.provision.assign_user_to_app",
                "outcome": {
                    "reason": null,
                    "result": "SUCCESS"
                },
                "published": "2020-02-27T17:55:12.949Z",
                "request": {
                    "ipChain": [
                        {
                            "geographicalContext": {
                                "city": "Boardman",
                                "country": "United States",
                                "geolocation": {
                                    "lat": 45.8491,
                                    "lon": -119.7143
                                },
                                "postalCode": "97818",
                                "state": "Oregon"
                            },
                            "ip": "127.0.0.1",
                            "source": null,
                            "version": "V4"
                        }
                    ]
                },
                "securityContext": {
                    "asNumber": null,
                    "asOrg": null,
                    "domain": null,
                    "isProxy": null,
                    "isp": null
                },
                "severity": "INFO",
                "target": [
                    {
                        "alternateId": "Test1@test.com",
                        "detailEntry": null,
                        "displayName": "Test 1 that",
                        "id": "0uapywj3yxcjhpjSQ0h7",
                        "type": "AppUser"
                    },
                    {
                        "alternateId": "ShrikSAML",
                        "detailEntry": null,
                        "displayName": "ShrikSAML",
                        "id": "0oabe0e2jruaQccDf0h7",
                        "type": "AppInstance"
                    },
                    {
                        "alternateId": "Test1@test.com",
                        "detailEntry": null,
                        "displayName": "Test 1 that",
                        "id": "00upywm7l0rL1V0zt0h7",
                        "type": "User"
                    }
                ],
                "transaction": {
                    "detail": {},
                    "id": "XlgCgAEBMJsNo5Yh9rHtZAAACPw",
                    "type": "WEB"
                },
                "uuid": "4d8a4e9a-598a-11ea-a594-b9fb637659a5",
                "version": "0"
            }
        }
    }
}
Human Readable Output

Application Assignment Events

Actor ActorAlternaneId ChainIP Client EventInfo EventOutcome EventSeverity RequestIP Targets Time
Test Demisto (User) Test@demisto.com 127.0.0.1 Unknown browser on Unknown OS Unknown device Add user to application membership SUCCESS INFO 127.0.0.1 Test 1 that (AppUser) ShrikSAML (AppInstance) Test 1 that (User) 02/27/2020, 17:55:12

okta-get-application-authentication


Returns logs using specified filters.

Base Command

okta-get-application-authentication

Input

Argument Name Description Required
since Filters the lower time bound of the log event in the Internet Date\Time format profile of ISO 8601. For example, 2020-02-14T16:00:18Z. Optional
until Filters the upper time bound of the log event in the Internet Date\Time format profile of ISO 8601. For example, 2020-02-14T16:00:18Z. Optional
sortOrder The order of the returned events. Can be “ASCENDING” or “DESCENDING”. The default is “ASCENDING”. Possible values are: ASCENDING, DESCENDING. Default is ASCENDING. Optional
limit The maximum number of results to return. The default is 100. Default is 100. Optional

Context Output

Path Type Description
Okta.Logs.Events.actor.alternateId String Alternative ID of the actor.
Okta.Logs.Events.actor.displayName String Display name of the actor.
Okta.Logs.Events.actor.id String ID of the actor.
Okta.Logs.Events.client.userAgent.rawUserAgent String A raw string representation of user agent, formatted according to section 5.5.3 of HTTP/1.1 Semantics and Content. Both the browser and the OS fields can be derived from this field.
Okta.Logs.Events.client.userAgent.os String The operating system on which the client runs. For example, Microsoft Windows 10.
Okta.Logs.Events.client.userAgent.browser String Identifies the type of web browser, if relevant. For example, Chrome.
Okta.Logs.Events.client.device String Type of device from which the client operated. For example, Computer.
Okta.Logs.Events.client.id String For OAuth requests, the ID of the OAuth client making the request. For SSWS token requests, the ID of the agent making the request.
Okta.Logs.Events.client.ipAddress String IP address from which the client made its request.
Okta.Logs.Events.client.geographicalContext.city String The city encompassing the area containing the geo-location coordinates, if available. For example, Seattle, San Francisco.
Okta.Logs.Events.client.geographicalContext.state String Full name of the state or province encompassing the area containing the geo-location coordinates. For example, Montana, Incheon.
Okta.Logs.Events.client.geographicalContext.country String Full name of the country encompassing the area containing the geo-location coordinates. For example, France, Uganda.
Okta.Logs.Events.displayMessage String The display message for an event.
Okta.Logs.Events.eventType String Type of event that was published.
Okta.Logs.Events.outcome.result String Result of the action. Can be “SUCCESS”, “FAILURE”, “SKIPPED”, or “UNKNOWN”.
Okta.Logs.Events.outcome.reason String Reason for the result. For example INVALID_CREDENTIALS.
Okta.Logs.Events.published String Timestamp when the event was published.
Okta.Logs.Events.severity String The event severity. Can be “DEBUG”, “INFO”, “WARN”, or “ERROR”.
Okta.Logs.Events.securityContext.asNumber Number Autonomous system number associated with the autonomous system that the event request was sourced to.
Okta.Logs.Events.securityContext.asOrg String Organization associated with the autonomous system that the event request was sourced to.
Okta.Logs.Events.securityContext.isp String Internet service provider used to send the event’s request.
Okta.Logs.Events.securityContext.domain String The domain name associated with the IP address of the inbound event request.
Okta.Logs.Events.securityContext.isProxy String Specifies whether an event’s request is from a known proxy.
Okta.Logs.Events.request.ipChain.IP String IP address.
Okta.Logs.Events.request.ipChain.geographicalContext.city String The city encompassing the area containing the geo-location coordinates, if available. For example, Seattle, San Francisco.
Okta.Logs.Events.request.ipChain.geographicalContext.state String Full name of the state or province encompassing the area containing the geo-location coordinates. For example, Montana, Incheon.
Okta.Logs.Events.request.ipChain.geographicalContext.country String Full name of the country encompassing the area containing the geo-location coordinates. For example, France, Uganda.
Okta.Logs.Events.request.ipChain.source String Details regarding the source.
Okta.Logs.Events.target.id String ID of a target.
Okta.Logs.Events.target.type String Type of a target.
Okta.Logs.Events.target.alternateId String Alternative ID of a target.
Okta.Logs.Events.target.displayName String Display name of a target.
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).
Command Example

!okta-get-application-authentication since="2019-04-30T00:00:00.000Z" until="2020-02-30T00:00:00.000Z" limit=1

Context Example
{
    "Okta": {
        "Logs": {
            "Events": {
                "actor": {
                    "alternateId": "Test@demisto.com",
                    "detailEntry": null,
                    "displayName": "Test Demisto",
                    "id": "00u66lckd7lpjidYi0h7",
                    "type": "User"
                },
                "authenticationContext": {
                    "authenticationProvider": null,
                    "authenticationStep": 0,
                    "credentialProvider": null,
                    "credentialType": null,
                    "externalSessionId": "102ejbJMP0RSE2zwIOhr_PpHA",
                    "interface": null,
                    "issuer": null
                },
                "client": {
                    "device": "Computer",
                    "geographicalContext": {
                        "city": "Tel Aviv",
                        "country": "Israel",
                        "geolocation": {
                            "lat": 32.0678,
                            "lon": 34.7647
                        },
                        "postalCode": null,
                        "state": "Tel Aviv"
                    },
                    "id": null,
                    "ipAddress": "127.0.0.1",
                    "userAgent": {
                        "browser": "CHROME",
                        "os": "Mac OS X",
                        "rawUserAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"
                    },
                    "zone": "null"
                },
                "debugContext": {
                    "debugData": {
                        "authnRequestId": "XYI-PiWDTYEsVNLm7sc0vwAACi0",
                        "initiationType": "SP_INITIATED",
                        "requestId": "XYI-PzNoI1UMTtFvio-9LAAACAc",
                        "requestUri": "/app/demistodev725178_benzi_1/exkm30ffmuhcL0rFv0h7/sso/saml",
                        "signOnMode": "SAML 2.0",
                        "url": "/app/demistodev725178_benzi_1/exkm30ffmuhcL0rFv0h7/sso/saml?RelayState=&SAMLRequest=PHNhbWxwOkF1dGhuUmVxdWVzdCB4bWxuczpzYW1scD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sIiB4bWxuczpzYW1sPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIiBJRD0iXzRiODZjMGUzLWI0NzktNGU2NS00ZjIwLWJiNTE0YTc3NTUyMiIgVmVyc2lvbj0iMi4wIiBQcm90b2NvbEJpbmRpbmc9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpiaW5kaW5nczpIVFRQLVBPU1QiIEFzc2VydGlvbkNvbnN1bWVyU2VydmljZVVSTD0iaHR0cHM6Ly9lYzItNTItNDgtMTItMTIzLmV1LXdlc3QtMS5jb21wdXRlLmFtYXpvbmF3cy5jb20vc2FtbCIgSXNzdWVJbnN0YW50PSIyMDE5LTA5LTE4VDE0OjIyOjM3WiI%2BPHNhbWw6SXNzdWVyPmh0dHBzOi8vZGV2LTcyNTE3OC5va3RhcHJldmlldy5jb20vYXBwL2V4a20zMGZmbXVoY0wwckZ2MGg3L3Nzby9zYW1sL21ldGFkYXRhPC9zYW1sOklzc3Vlcj48c2FtbHA6TmFtZUlEUG9saWN5IEFsbG93Q3JlYXRlPSJ0cnVlIiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OnBlcnNpc3RlbnQiPjwvc2FtbHA6TmFtZUlEUG9saWN5Pjwvc2FtbHA6QXV0aG5SZXF1ZXN0Pg%3D%3D&fromLoginToken=OODncZp5PTgZ-8QwGMHgbJ6psmQES6dUWiMohfLGGm7GWKko8LFXHz3faG7ZkoocPX2ixv-dyUSOF7qJ9DZDVoVkeETM7n6MskWQ01woQFqUcUVdM1xDBmplZlK1DMhX6ozpZQV2XNK073FfDt4bASBEFFgGkFi5ygH-LmBFSfcoiLWHM5MGJ-JEUB97peJxOL41inNX2r333FMJoDzem0dLAOf4cfApoVz7VDdY06r8i6Lt0vuxmxKyZRWJkCHroKyc3ysag9gbUMR5tSoe3hRPJvCBozjYtzkpVlLBP_6V01eGL2YVP8JR2rkpI8MvBYNDLIoJry1e_eBOF3kzJA"
                    }
                },
                "displayMessage": "User single sign on to app",
                "eventType": "user.authentication.sso",
                "legacyEventType": "app.auth.sso",
                "outcome": {
                    "reason": null,
                    "result": "SUCCESS"
                },
                "published": "2019-09-18T14:29:19.329Z",
                "request": {
                    "ipChain": [
                        {
                            "geographicalContext": {
                                "city": "Tel Aviv",
                                "country": "Israel",
                                "geolocation": {
                                    "lat": 32.0678,
                                    "lon": 34.7647
                                },
                                "postalCode": null,
                                "state": "Tel Aviv"
                            },
                            "ip": "127.0.0.1",
                            "source": null,
                            "version": "V4"
                        }
                    ]
                },
                "securityContext": {
                    "asNumber": null,
                    "asOrg": null,
                    "domain": null,
                    "isProxy": null,
                    "isp": null
                },
                "severity": "INFO",
                "target": [
                    {
                        "alternateId": "benzi_master",
                        "detailEntry": {
                            "signOnModeType": "SAML_2_0"
                        },
                        "displayName": "benzi_master",
                        "id": "0oam30ffmvM5cLzxo0h7",
                        "type": "AppInstance"
                    },
                    {
                        "alternateId": "Test@demisto.com",
                        "detailEntry": null,
                        "displayName": "Test Demisto",
                        "id": "0uam30nfffJqV3I4M0h7",
                        "type": "AppUser"
                    }
                ],
                "transaction": {
                    "detail": {},
                    "id": "XYI-PzNoI1UMTtFvio-9LAAACAc",
                    "type": "WEB"
                },
                "uuid": "b349fd35-da20-11e9-81c0-95908eb13131",
                "version": "0"
            }
        }
    }
}
Human Readable Output

Application Authentication Events

Actor ActorAlternaneId ChainIP Client EventInfo EventOutcome EventSeverity RequestIP Targets Time
Test Demisto (User) Test@demisto.com 127.0.0.1 CHROME on Mac OS X Computer User single sign on to app SUCCESS INFO 127.0.0.1 BenziPermanent (AppInstance) Test Demisto (AppUser) 10/14/2019, 12:16:53

okta-delete-user


Deletes the specified user.

Base Command

okta-delete-user

Input

Argument Name Description Required
userId Okta User ID. Optional
username Username of the user. Optional

Context Output

Path Type Description
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).
Command Example

!okta-delete-user username=testForDocs@test.com

Human Readable Output

User: testForDocs@test.com was Deleted successfully

okta-clear-user-sessions


Removes all active identity provider sessions. This forces the user to authenticate upon the next operation. By default, OpenID Connect and OAuth refresh and access tokens issued to the user are revoked. Token revocation can be disabled if needed.
For more information and examples:
https://developer.okta.com/docs/reference/api/users/#user-sessions

Base Command

okta-clear-user-sessions

Input

Argument Name Description Required
userId Okta User ID. Required
revokeOauthTokens When true, revokes OpenID Connect and OAuth refresh and access tokens issued to the user. Possible values are: true, false. Default is true. Optional

Context Output

Path Type Description
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).
Command Example

!okta-clear-user-sessions userId=00ui5brmwtJpMdoZZ0h7

Human Readable Output

User session was cleared for: 00ui5brmwtJpMdoZZ0h7

okta-list-zones


Get an Okta Zone object.

Base Command

okta-list-zones

Input

Argument Name Description Required
limit The maximum number of results to return. Optional

Context Output

Path Type Description
Okta.Zone.created Date Zone creation timestamp, in the format 2020-04-06T22:23:12.000Z.
Okta.Zone.gateways.type String Gateways IP entry type, e.g., CIDR.
Okta.Zone.gateways.value String Gateways IP entry value, e.g., 34.103.1.108/32.
Okta.Zone.id String Zone ID, e.g., nzoqsmcx1qWYJ6wYF0h7.
Okta.Zone.lastUpdated Date Zone last update timestamp, e.g., 2020-04-06T22:23:12.000Z.
Okta.Zone.name String Zone name.
Okta.Zone.proxies.type String Proxies IP entry type e.g. CIDR.
Okta.Zone.proxies.value Unknown Proxies IP entry value, e.g., 34.103.1.108/32.
Okta.Zone.status String Zone status, e.g., ACTIVE.
Okta.Zone.system Number True if this is a system zone, false if user-created.
Okta.Zone.type String Zone type, e.g., IP.
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).

Command Example


#### Context Example

{
“Okta”: {
“Zone”: [
{
“_links”: {
“deactivate”: {
“hints”: {
“allow”: [
“POST”
]
},
“href”: “https://dev-950355.oktapreview.com/api/v1/zones/nzo9rbw8evGOFV1VE0h7/lifecycle/deactivate”
},
“self”: {
“hints”: {
“allow”: [
“GET”,
“PUT”,
“DELETE”
]
},
“href”: “https://dev-950355.oktapreview.com/api/v1/zones/nzo9rbw8evGOFV1VE0h7”
}
},
“created”: “2017-03-03T22:05:24.000Z”,
“gateways”: [
{
“type”: “CIDR”,
“value”: “2.2.2.2/32”
}
],
“id”: “nzo9rbw8evGOFV1VE0h7”,
“lastUpdated”: “2020-04-23T08:58:55.000Z”,
“name”: “LegacyIpZone”,
“proxies”: null,
“status”: “ACTIVE”,
“system”: true,
“type”: “IP”
},
{
“_links”: {
“deactivate”: {
“hints”: {
“allow”: [
“POST”
]
},
“href”: “https://dev-950355.oktapreview.com/api/v1/zones/nzoqsmcx1qWYJ6wY33h7/lifecycle/deactivate”
},
“self”: {
“hints”: {
“allow”: [
“GET”,
“PUT”,
“DELETE”
]
},
“href”: “https://dev-950355.oktapreview.com/api/v1/zones/nzoqsmcx1qWYJ6wY33h7”
}
},
“created”: “2020-04-06T22:23:12.000Z”,
“gateways”: [
{
“type”: “CIDR”,
“value”: “1.1.1.2/32”
},
{
“type”: “CIDR”,
“value”: “1.1.1.3/32”
},
{
“type”: “CIDR”,
“value”: “2.2.2.2/32”
},
{
“type”: “CIDR”,
“value”: “2.2.2.3/32”
}
],
“id”: “nzoqsmcx1qWYJ6wY33h7”,
“lastUpdated”: “2020-06-05T08:57:57.000Z”,
“name”: “MyZone”,
“proxies”: null,
“status”: “ACTIVE”,
“system”: false,
“type”: “IP”
}
]
}
}


#### Human Readable Output
>
>### Okta Zones
>
>|name|id|gateways|status|system|lastUpdated|created|
>|---|---|---|---|---|---|---|
>| LegacyIpZone | nzo9rbw8evGOFV1VE0h7 | {'type': 'CIDR', 'value': '2.2.2.2/32'} | ACTIVE | true | 2020-04-23T08:58:55.000Z | 2017-03-03T22:05:24.000Z |
>| MyZone | nzoqsmcx1qWYJ6wY33h7 | {'type': 'CIDR', 'value': '3.3.3.4/32'},<br/>{'type': 'CIDR', 'value': '5.5.5.3/32'},<br/>{'type': 'CIDR', 'value': '3.3.3.1/32'},<br/>{'type': 'CIDR', 'value': '2.2.2.3/32'} | ACTIVE | false | 2020-06-05T08:57:57.000Z | 2020-04-06T22:23:12.000Z |

### okta-update-zone

***
Update an Okta Zone.

#### Base Command

`okta-update-zone`

#### Input

| **Argument Name** | **Description**                                                                                                                                         | **Required** |
| --- |---------------------------------------------------------------------------------------------------------------------------------------------------------| --- |
| zoneID | Zone ID to update, e.g., nzoqsmcx1qWYJ6wYF0h7.                                                                                                          | Required |
| zoneName | Updates the zone name.                                                                                                                                  | Optional |
| gatewayIPs | Updates Gateway IP addresses: CIDR range (1.1.0.0/16) or single IP address (2.2.2.2).                                                                   | Optional |
| proxyIPs | Update Proxy IP addresses: CIDR range (1.1.0.0/16) or single IP address (2.2.2.2).                                                                      | Optional |
| updateType | Indicate the action of adding an IP to an existing zone or overriding the existing IPs. Possible values are: "APPEND", "OVERRIDE". Default is "OVERRIDE". | Optional |

#### Context Output

| **Path** | **Type** | **Description** |
| --- | --- | --- |
| Okta.Zone.created | Date | Zone creation timestamp, e.g., 2020-04-06T22:23:12.000Z. |
| Okta.Zone.gateways.type | String | Gateways IP entry type, e.g., CIDR. |
| Okta.Zone.gateways.value | String | Gateways IP entry value, e.g., 34.103.1.108/32. |
| Okta.Zone.id | String | Okta Zone ID, e.g., nzoqsmcx1qWYJ6wYF0h7. |
| Okta.Zone.lastUpdated | Date | Zone last update timestamp, in the format 2020-04-06T22:23:12.000Z. |
| Okta.Zone.name | String | Zone name. |
| Okta.Zone.proxies.type | String | Proxies IP entry type, e.g., CIDR. |
| Okta.Zone.proxies.value | Unknown | Proxies IP entry value, e.g., 34.103.1.108/32. |
| Okta.Zone.status | String | Zone status, e.g., ACTIVE. |
| Okta.Zone.system | Number | True if this is a system zone, false if user-created. |
| Okta.Zone.type | String | Zone type, e.g., IP. |
| Okta.Metadata.x-rate-limit-limit | Number | The rate limit ceiling that’s applicable for the current request. |
| Okta.Metadata.x-rate-limit-remaining | Number | The amount of requests left for the current rate-limit window. |
| Okta.Metadata.x-rate-limit-reset | Number | The time at which the rate limit resets, specified in UTC epoch time (in seconds). |

#### Command Example

```!okta-update-zone zoneID=nzoqsmcx1qWYJ6wY33h7 zoneName=MyZone```

#### Context Example

{
“Okta”: {
“Zone”: {
“_links”: {
“deactivate”: {
“hints”: {
“allow”: [
“POST”
]
},
“href”: “https://dev-950355.oktapreview.com/api/v1/zones/nzoqsmcx1qWYJ6wY33h7/lifecycle/deactivate”
},
“self”: {
“hints”: {
“allow”: [
“GET”,
“PUT”,
“DELETE”
]
},
“href”: “https://dev-950355.oktapreview.com/api/v1/zones/nzoqsmcx1qWYJ6wY33h7”
}
},
“created”: “2020-04-06T22:23:12.000Z”,
“gateways”: [
{
“type”: “CIDR”,
“value”: “1.1.3.5/32”
},
{
“type”: “CIDR”,
“value”: “5.3.143.103/32”
},
{
“type”: “CIDR”,
“value”: “5.3.246.228/32”
},
{
“type”: “CIDR”,
“value”: “5.3.246.229/32”
}
],
“id”: “nzoqsmcx1qWYJ6wY33h7”,
“lastUpdated”: “2020-06-05T08:57:57.000Z”,
“name”: “MyZone”,
“proxies”: null,
“status”: “ACTIVE”,
“system”: false,
“type”: “IP”
}
}
}


#### Human Readable Output

>### Okta Zones
>
>|name|id|gateways|status|system|lastUpdated|created|
>|---|---|---|---|---|---|---|
>| MyZone | nzoqsmcx1qWYJ6wY33h7 | {'type': 'CIDR', 'value': '1.3.1.5/32'},<br/>{'type': 'CIDR', 'value': '1.3.1.5/32'},<br/>{'type': 'CIDR', 'value': '1.3.1.5/32'},<br/>{'type': 'CIDR', 'value': '1.3.1.5/32'} | ACTIVE | false | 2020-06-05T08:57:57.000Z | 2020-04-06T22:23:12.000Z |

### okta-get-zone

***
Get a Zone by its ID.

#### Base Command

`okta-get-zone`

#### Input

| **Argument Name** | **Description** | **Required** |
| --- | --- | --- |
| zoneID | Zone ID to get, e.g., nzoqsmcx1qWYJ6wYF0h.7. | Required |

#### Context Output

| **Path** | **Type** | **Description** |
| --- | --- | --- |
| Okta.Zone.created | Date | Zone creation timestamp, in the format 2020-04-06T22:23:12.000Z. |
| Okta.Zone.gateways.type | String | Gateways IP entry type, e.g., CIDR. |
| Okta.Zone.gateways.value | String | Gateways IP entry value, e.g., 34.103.1.108/32. |
| Okta.Zone.id | String | Okta Zone ID, e.g., nzoqsmcx1qWYJ6wYF0h7. |
| Okta.Zone.lastUpdated | Date | Zone last update timestamp, in the format 2020-04-06T22:23:12.000Z. |
| Okta.Zone.name | String | Zone name. |
| Okta.Zone.proxies.type | String | Proxies IP entry type, e.g., CIDR. |
| Okta.Zone.proxies.value | Unknown | Proxies IP entry value, e.g., 34.103.1.108/32. |
| Okta.Zone.status | String | Zone status, e.g,. ACTIVE. |
| Okta.Zone.system | Number | True if this is a system zone, false if user-created. |
| Okta.Zone.type | String | Zone type, e.g., IP. |
| Okta.Metadata.x-rate-limit-limit | Number | The rate limit ceiling that’s applicable for the current request. |
| Okta.Metadata.x-rate-limit-remaining | Number | The amount of requests left for the current rate-limit window. |
| Okta.Metadata.x-rate-limit-reset | Number | The time at which the rate limit resets, specified in UTC epoch time (in seconds). |

#### Command Example

```!okta-get-zone zoneID=nzoqsmcx1qWYJ6wY33h7```

#### Context Example

{
“Okta”: {
“Zone”: {
“_links”: {
“deactivate”: {
“hints”: {
“allow”: [
“POST”
]
},
“href”: “https://dev-950355.oktapreview.com/api/v1/zones/nzoqsmcx1qWYJ6wY33h7/lifecycle/deactivate”
},
“self”: {
“hints”: {
“allow”: [
“GET”,
“PUT”,
“DELETE”
]
},
“href”: “https://dev-950355.oktapreview.com/api/v1/zones/nzoqsmcx1qWYJ6wY33h7”
}
},
“created”: “2020-04-06T22:23:12.000Z”,
“gateways”: [
{
“type”: “CIDR”,
“value”: “1.3.1.3/32”
},
{
“type”: “CIDR”,
“value”: “3.5.146.103/32”
},
{
“type”: “CIDR”,
“value”: “3.5.1.228/32”
},
{
“type”: “CIDR”,
“value”: “3.5.1.229/32”
}
],
“id”: “nzoqsmcx1qWYJ6wY33h7”,
“lastUpdated”: “2020-06-05T08:57:57.000Z”,
“name”: “MyZone”,
“proxies”: null,
“status”: “ACTIVE”,
“system”: false,
“type”: “IP”
}
}
}


#### Human Readable Output

>### Okta Zones
>
>|name|id|gateways|status|system|lastUpdated|created|
>|---|---|---|---|---|---|---|
>| MyZone | nzoqsmcx1qWYJ6wY33h7 | {'type': 'CIDR', 'value': '1.3.1.3/32'},<br/>{'type': 'CIDR', 'value': '3.5.146.103/32'},<br/>{'type': 'CIDR', 'value': '3.5.1.228/32'},<br/>{'type': 'CIDR', 'value': '3.5.1.229/32'} | ACTIVE | false | 2020-06-05T08:57:57.000Z | 2020-04-06T22:23:12.000Z |

### okta-list-users

***
Lists users in your organization.

#### Base Command

`okta-list-users`

#### Input

| **Argument Name** | **Description** | **Required** |
| --- | --- | --- |
| verbose | Whether to return extended user information. Can be "true" or "false". The default is "false". Possible values are: true, false. Default is false. | Optional |
| limit | The maximum number of results to return. | Optional |
| query | Searches the name property of groups for matching values. | Optional |
| filter | Useful for performing structured queries where constraints on group attribute values can be explicitly targeted. <br/>The following expressions are supported(among others) for groups with the filter query parameter: <br/>type eq "OKTA_GROUP" - Groups that have a type of OKTA_GROUP; lastUpdated lt "yyyy-MM-dd''T''HH:mm:ss.SSSZ" - Groups with profile last updated before a specific timestamp; lastMembershipUpdated eq "yyyy-MM-dd''T''HH:mm:ss.SSSZ" - Groups with memberships last updated at a specific timestamp; id eq "00g1emaKYZTWRYYRRTSK" - Group with a specified ID.
For more information about filtering, visit https://developer.okta.com/docs/api/getting_started/design_principles#filtering. | Optional |
| after | The cursor in which to retrive the results from and on. If the query didn't reach the end of results, the tag will be found in the readable output under the tag key. | Optional |

#### Context Output

| **Path** | **Type** | **Description** |
| --- | --- | --- |
| Account.ID | String | Okta account ID. |
| Account.Email | String | Okta account email. |
| Account.Username | String | Okta account username. |
| Account.DisplayName | String | Okta account display name. |
| Account.Status | String | Okta account status. |
| Account.Created | Date | Timestamp for when the user was created. |
| Account.Activated | Date | Timestamp for when the user was activated. |
| Account.StatusChanged | Date | Timestamp for when the user's status was last changed. |
| Account.PasswordChanged | Date | Timestamp for when the user's password was last changed. |
| Okta.User.tag| String | The location of the next item, used with after param. |
| Okta.Metadata.x-rate-limit-limit | Number | The rate limit ceiling that’s applicable for the current request. |
| Okta.Metadata.x-rate-limit-remaining | Number | The amount of requests left for the current rate-limit window. |
| Okta.Metadata.x-rate-limit-reset | Number | The time at which the rate limit resets, specified in UTC epoch time (in seconds). |

#### Command Example

```!okta-list-users```

#### Context Example

```json
{
    "Okta":
    {
        "User":
        {
            "tag": "test12tag"
        }
    },
    "Account": [
        {
            "Created": "2018-07-24T20:20:04.000Z",
            "DisplayName": "Dbot XSOAR",
            "Email": "dbot@xsoar.com",
            "ID": "XXXXXXXXX",
            "Status": "STAGED",
            "Type": "Okta",
            "Username": "dbot@xsoar.com"
        }
    ]
}

Human Readable Output

Okta users found

Users

First Name ID Last Login Last Name Login Mobile Phone Status
Dbot XXXXX   XSOAR dbot@xsoar.com   STAGED

tag: test12tag

okta-create-zone


Creates a Zone with the specified name.

Base Command

okta-create-zone

Input

Argument Name Description Required
name Zone name. Required
gateway_ips Update Gateway IP addresses: CIDR range (1.1.0.0/16) or single IP address (2.2.2.2). Optional
proxies Update Proxy IP addresses: CIDR range (1.1.0.0/16) or single IP address (2.2.2.2). Optional

Context Output

Path Type Description
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).

okta-create-group


Create a new group in Okta tenant.

Base Command

okta-create-group

Input

Argument Name Description Required
name Name of the group to add. Required
description Description of the group to add. Optional

Context Output

Path Type Description
OktaGroup.ID Unknown Group ID in Okta.
OktaGroup.Name Unknown Group name in Okta.
OktaGroup.Description Unknown Group description in Okta.
OktaGroup.Type Unknown Group type in Okta.
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).

Command example

!okta-create-group name="TestGroup" description="TestGroup description."

Context Example

{
    "OktaGroup": {
        "Description": "TestGroup description.",
        "ID": "00g3qb398kItYXzKd1d7",
        "Name": "TestGroup",
        "Type": "OKTA_GROUP"
    }
}

Human Readable Output

Group Created: [GroupID:00g3qb398kItYXzKd1d7, GroupName: TestGroup]

okta-assign-group-to-app


Assign a group to an application.

Base Command

okta-assign-group-to-app

Input

Argument Name Description Required
groupName Name of the group to assign to the app. Optional
groupId ID of the group to assign to the app. Optional
appName Friendly name of the app that the group will be assigned to. Optional

Context Output

Path Type Description
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).

Command example

!okta-assign-group-to-app appName="Default-App" groupName="TestGroup"

Human Readable Output

Group: TestGroup added to PA App successfully

okta-expire-password


Expires a password for an existing Okta user.

Base Command

okta-expire-password

Input

Argument Name Description Required
username Okta username for which to expire the password. Required
temporary_password When true, you’ll need to change the password in the next login. Possible values are: true, false. Default is false. Optional
revoke_session When true, revokes the user’s existing sessions. Optional
hide_password When true, prevents the password from being saved in the war room. Optional

Context Output

Path Type Description
Account.Activated Date Timestamp for when the user was activated.
Account.Created Date Timestamp for when the user was created.
Account.DisplayName String Okta account display name.
Account.Email String Okta account email.
Account.ID String Created Okta account ID.
Account.PasswordChanged Date Timestamp for when the user’s password was last changed.
Account.Status String Okta account current status.
Account.StatusChanged Date Timestamp for when the user’s status was last changed.
Account.Type String Okta account type.
Account.Username String Okta account usernames returned by the search.
Okta.Metadata.x-rate-limit-limit Number The rate limit ceiling that’s applicable for the current request.
Okta.Metadata.x-rate-limit-remaining Number The amount of requests left for the current rate-limit window.
Okta.Metadata.x-rate-limit-reset Number The time at which the rate limit resets, specified in UTC epoch time (in seconds).

Command example

!okta-expire-password username="4x1xh5rl@test.com" temporary_password="false"

Context Example

{
    "Account": {
        "Activated": "2022-06-20T04:48:04.000Z",
        "Created": "2022-06-20T04:47:59.000Z",
        "DisplayName": "Test 1  Test1",
        "Email": "4x1xh5rl@test.com",
        "ID": "00u19cr5qv91HjELI0h8",
        "PasswordChanged": "2022-06-20T04:48:07.000Z",
        "Status": "PASSWORD_EXPIRED",
        "StatusChanged": "2023-09-10T12:56:04.000Z",
        "Type": "Okta",
        "Username": "4x1xh5rl@test.com"
    }
}

Human Readable Output

Okta Expired Password

_links activated created credentials id lastUpdated passwordChanged profile status statusChanged type
suspend: {“href”: “https://test.oktapreview.com/api/v1/users/00u19cr5qv91HjELI0h8/lifecycle/suspend”, “method”: “POST”}
schema: {“href”: “https://test.oktapreview.com/api/v1/meta/schemas/user/osc66lckcvDyVcGzS0h7”}
resetPassword: {“href”: “https://test.oktapreview.com/api/v1/users/00u19cr5qv91HjELI0h8/lifecycle/reset_password”, “method”: “POST”}
forgotPassword: {“href”: “https://test.oktapreview.com/api/v1/users/00u19cr5qv91HjELI0h8/credentials/forgot_password”, “method”: “POST”}
expirePassword: {“href”: “https://test.oktapreview.com/api/v1/users/00u19cr5qv91HjELI0h8/lifecycle/expire_password”, “method”: “POST”}
changeRecoveryQuestion: {“href”: “https://test.oktapreview.com/api/v1/users/00u19cr5qv91HjELI0h8/credentials/change_recovery_question”, “method”: “POST”}
self: {“href”: “https://test.oktapreview.com/api/v1/users/00u19cr5qv91HjELI0h8”}
type: {“href”: “https://test.oktapreview.com/api/v1/meta/types/user/oty66lckcvDyVcGzS0h7”}
changePassword: {“href”: “https://test.oktapreview.com/api/v1/users/00u19cr5qv91HjELI0h8/credentials/change_password”, “method”: “POST”}
deactivate: {“href”: “https://test.oktapreview.com/api/v1/users/00u19cr5qv91HjELI0h8/lifecycle/deactivate”, “method”: “POST”}
2022-06-20T04:48:04.000Z 2022-06-20T04:47:59.000Z password: {}
recovery_question: {“question”: “whats the first school?”}
provider: {“type”: “OKTA”, “name”: “OKTA”}
00u19cr5qv91HjELI0h8 2023-09-10T12:56:04.000Z 2022-06-20T04:48:07.000Z firstName: Test 1
lastName: Test1
preferredLanguage: en
mobilePhone: null
city: Tel-Aviv
displayName: Test 1 that
nickName: Testush
secondEmail: null
login: 4x1xh5rl@test.com
email: 4x1xh5rl@test.com
employeeNumber: 12345
PASSWORD_EXPIRED 2023-09-10T12:56:04.000Z id: oty66lckcvDyVcGzS0h7

okta-auth-reset


Reset OAuth authentication data (authentication process will start from the beginning, and a new token will be generated).

Base Command

okta-auth-reset

Input

There are no input arguments for this command.

Context Output

There is no context output for this command.

Configuration parameters

  • url — Okta URL (https://<domain>.okta.com) (required)
  • credentials
  • apitoken — API Token
  • use_oauth — Use OAuth 2.0 Authentication
  • client_id — Client ID
  • private_key — Private Key
  • jwt_algorithm — JWT Signing Algorithm
  • key_id — Key ID
  • insecure — Trust any certificate (not secure)
  • proxy — Use system proxy settings

Commands (35)

  • okta-activate-user

    Activates a single user.

  • okta-add-to-group

    Adds a user to a group with OKTA_GROUP type.

  • okta-assign-group-to-app

    Assign a group to an application.

  • okta-auth-reset

    Reset OAuth authentication data (authentication process will start from the beginning, and a new token will be generated).

  • okta-clear-user-sessions

    Removes all active identity provider sessions. This forces the user to authenticate upon the next operation. By default, OpenID Connect and OAuth refresh and access tokens issued to the user are revoked. Token revocation can be disabled if needed. For more information and examples: https://developer.okta.com/docs/reference/api/users/#user-sessions

  • okta-create-group

    Create a new group in Okta tenant.

  • okta-create-user

    Creates a new user with an option of setting a password, recovery question, and answer. The new user will immediately be able to log in after activation with the assigned password. This flow is common when developing a custom user registration experience.

  • okta-create-zone

    Creates a Zone with the specified name.

  • okta-deactivate-user

    Deactivates a single user.

  • okta-delete-user

    Deletes the specified user.

  • okta-expire-password

    Expires a password for an existing Okta user.

  • okta-get-application-assignments

    Returns events for when a user was assigned to an application.

  • okta-get-application-authentication

    Returns logs using specified filters.

  • okta-get-failed-logins

    Returns failed login events.

  • okta-get-group-assignments

    Gets events for when a user was added to a group.

  • okta-get-group-members

    Enumerates all users that are members of a group.

  • okta-get-groups

    Returns all user groups associated with a specified user.

  • okta-get-logs

    Gets logs by providing optional filters.

  • okta-get-user

    Fetches information for a single user. You must enter one or more parameters for the command to run.

  • okta-get-user-factors

    Returns all the enrolled factors for the specified user.

  • okta-get-zone

    Get a Zone by its ID.

  • okta-list-groups

    Lists groups in your organization. A subset of groups can be returned that match a supported filter expression or query.

  • okta-list-users

    Lists users in your organization.

  • okta-list-zones

    Get an Okta Zone object.

  • okta-remove-from-group

    Removes a user from a group with OKTA_GROUP type.

  • okta-reset-factor

    Un-enrolls an existing factor for the specified user. This enables the user to enroll a new factor.

  • okta-search

    Searches for Okta users.

  • okta-set-password

    Sets passwords without validating existing user credentials.

  • okta-suspend-user

    Suspends a single user. This operation can only be performed on users with an ACTIVE status. After the porcess is completed, the user's status is SUSPENDED.

  • okta-unlock-user

    Unlocks a single user.

  • okta-unsuspend-user

    Returns a single user to ACTIVE status. This operation can only be performed on users that have a SUSPENDED status.

  • okta-update-user

    Updates a user with a given login. All fields are optional. Fields which are not set, will not be overwritten.

  • okta-update-zone

    Update an Okta Zone.

  • okta-verify-mfa-status

    Checks the status of the push factor mfa.

  • okta-verify-push-factor

    Enrolls and verifies a push factor for the specified user.

import json
from unittest.mock import MagicMock, patch

import pytest
import requests_mock
from Okta_v2 import (
    Client,
    apply_zone_updates,
    assign_group_to_app_command,
    clear_user_sessions_command,
    create_group_command,
    create_user_command,
    create_zone_command,
    delete_limit_param,
    get_after_tag,
    get_group_members_command,
    get_groups_for_user_command,
    get_logs_command,
    get_user_command,
    get_user_factors_command,
    get_zone_command,
    list_users_command,
    list_zones_command,
    set_password_command,
    update_zone_command,
    verify_push_factor_command,
    verify_mfa_status_command,
    extract_user_and_factor_id_from_url,
)

client = Client(base_url="demisto.com", api_token="XXX")

user_data = {
    "id": "TestID",
    "status": "PROVISIONED",
    "created": "2020-02-19T08:18:20.000Z",
    "activated": "2020-02-20T11:44:43.000Z",
    "statusChanged": "2020-02-20T11:45:24.000Z",
    "lastLogin": "2020-02-23T11:45:24.000Z",
    "lastUpdated": "2020-02-20T11:45:24.000Z",
    "passwordChanged": "2020-02-19T08:18:21.000Z",
    "type": {"id": "oty66lckcvDyVcGzS0h7"},
    "profile": {
        "firstName": "test",
        "lastName": "this",
        "mobilePhone": "null",
        "city": "Tel-Aviv",
        "displayName": "test1",
        "secondEmail": "test@this.com",
        "login": "test@this.com",
        "email": "test@this.com",
        "manager": "manager",
        "managerEmail": "manager@test.com",
    },
    "credentials": {"provider": {"type": "OKTA", "name": "OKTA"}},
    "_links": {},
}
factors_data = [
    {
        "id": "mblpt21nffaaN5F060h7",
        "factorType": "sms",
        "provider": "OKTA",
        "vendorName": "OKTA",
        "status": "PENDING_ACTIVATION",
        "created": "2020-02-18T11:48:16.000Z",
        "lastUpdated": "2020-02-18T11:48:16.000Z",
        "profile": {"phoneNumber": "+12025550191"},
        "_links": {},
    },
    {
        "id": "uftpt24kdrDJ7fDOq0h7",
        "factorType": "token:software:totp",
        "provider": "GOOGLE",
        "vendorName": "GOOGLE",
        "status": "PENDING_ACTIVATION",
        "created": "2020-02-18T11:45:14.000Z",
        "lastUpdated": "2020-02-18T11:45:14.000Z",
        "profile": {"credentialId": "woo@demisto.com"},
        "_links": {},
    },
    {
        "id": "opfpt1joeaArlg27g0h7",
        "factorType": "push",
        "provider": "OKTA",
        "vendorName": "OKTA",
        "status": "PENDING_ACTIVATION",
        "created": "2020-02-18T11:45:03.000Z",
        "lastUpdated": "2020-02-18T11:45:03.000Z",
        "_links": {"self": {}, "poll": {}, "user": {}},
        "_embedded": {"activation": {"factorResult": "TIMEOUT", "_links": {}}},
    },
]
group_data = [
    {
        "id": "00g66lckcsAJpLcNc0h7",
        "created": "2016-04-12T15:01:50.000Z",
        "lastUpdated": "2016-04-12T15:01:50.000Z",
        "lastMembershipUpdated": "2020-02-19T09:01:32.000Z",
        "objectClass": ["okta:user_group"],
        "type": "BUILT_IN",
        "profile": {"name": "Everyone", "description": "All users in your organization"},
        "_links": {},
    }
]
verify_push_factor_response = {
    "factorResult": "WAITING",
    "profile": {
        "credentialId": "test@this.com",
        "deviceType": "SmartPhone_IPhone",
        "keys": [
            {
                "kty": "EC",
                "use": "sig",
                "kid": "default",
                "x": "3Y53lDoQYwzzVbjsbsPnqOnVaotIrVByQh5Sa-RwOHQ",
                "y": "0zHY_y9rVh-bq_-lR-MrmzNtUZrrIMbTrsjtxUyUT2Q",
                "crv": "P-256",
            }
        ],
        "name": "iPhone (5)",
        "platform": "IOS",
        "version": "13.1.3",
    },
    "expiresAt": "2020-02-24T11:37:08.000Z",
    "_links": {
        "cancel": {
            "href": "https://test.com/api/v1/users/TestID/factors/FactorID/transactions/TransactionID",
            "hints": {"allow": ["DELETE"]},
        },
        "poll": {
            "href": "https://test.com/api/v1/users/TestID/factors/FactorID/transactions/TransactionID",
            "hints": {"allow": ["GET"]},
        },
    },
}
polling_response_success = {"factorResult": "SUCCESS"}
polling_response_rejected = {
    "factorResult": "REJECTED",
    "_links": {
        "verify": {"href": "https://test.com/api/v1/users/TestID/factors/FactorID/verify", "hints": {"allow": ["POST"]}},
        "factor": {},
    },
}
create_user_response = {
    "id": "00ub0oNGTSWTBKOLGLNR",
    "status": "STAGED",
    "created": "2013-07-02T21:36:25.344Z",
    "activated": "",
    "statusChanged": "",
    "lastLogin": "",
    "lastUpdated": "2013-07-02T21:36:25.344Z",
    "passwordChanged": "2013-07-02T21:36:25.344Z",
    "profile": {
        "firstName": "Testush",
        "lastName": "Test",
        "email": "test@this.com",
        "login": "test@this.com",
        "mobilePhone": "555-415-1337",
    },
    "credentials": {"password": {}, "provider": {"type": "OKTA", "name": "OKTA"}},
    "_links": {
        "activate": {"href": "https://test.com/api/v1/users/TestID/lifecycle/activate"},
        "self": {"href": "https://test.com/api/v1/users/TestID"},
    },
}
create_group_response = {
    "id": "00g3q8tjdyoOw6fJE1d7",
    "created": "2022-05-20T14:59:29.000Z",
    "lastUpdated": "2022-05-20T14:59:29.000Z",
    "lastMembershipUpdated": "2022-05-20T14:59:29.000Z",
    "objectClass": ["okta:user_group"],
    "type": "OKTA_GROUP",
    "profile": {"name": "TestGroup", "description": "Test Group Description"},
    "_links": {
        "logo": [
            {
                "name": "medium",
                "href": "https://op3static.oktacdn.com/assets/img/logos/groups/odyssey/okta-medium.png",
                "type": "image/png",
            },
            {
                "name": "large",
                "href": "https://op3static.oktacdn.com/assets/img/logos/groups/odyssey/okta-large.png",
                "type": "image/png",
            },
        ],
        "users": {"href": "https://test.com/api/v1/groups/00g3q8tjdyoOw6fJE1d7/users"},
        "apps": {"href": "https://test.com/api/v1/groups/00g3q8tjdyoOw6fJE1d7/apps"},
    },
}
assign_group_to_app_response = {
    "id": "00g3q8tjdyoOw6fJE1d7",
    "lastUpdated": "2022-05-20T16:01:16.000Z",
    "priority": 5,
    "profile": {},
    "_links": {
        "app": {"href": "https://test.com/api/v1/apps/0oa3ik9908vngPiMB1d7"},
        "self": {"href": "https://test.com/api/v1/apps/0oa3ik9908vngPiMB1d7/groups/00g3q8tjdyoOw6fJE1d7"},
        "group": {"href": "https://test.com/api/v1/groups/00g3q8tjdyoOw6fJE1d7"},
    },
}
group_members = [
    {
        "id": "TestID1",
        "status": "ACTIVE",
        "created": "2016-04-12T15:01:52.000Z",
        "activated": "",
        "statusChanged": "2020-02-12T15:05:06.000Z",
        "lastLogin": "2020-02-24T11:40:36.000Z",
        "lastUpdated": "2020-02-24T11:42:22.000Z",
        "passwordChanged": "2020-02-24T11:40:08.000Z",
        "type": {"id": "oty66lckcvDyVcGzS0h7"},
        "profile": {
            "firstName": "Test1",
            "lastName": "Test1",
            "primaryPhone": "8888888888",
            "mobilePhone": "",
            "secondEmail": "",
            "department": "everyone,admin,bla",
            "login": "test@this.com",
            "email": "test@this.com",
        },
        "credentials": {
            "password": {},
            "recovery_question": {"question": "born city"},
            "provider": {"type": "OKTA", "name": "OKTA"},
        },
        "_links": {},
    },
    {
        "id": "TestID2",
        "status": "STAGED",
        "created": "2018-07-24T20:20:04.000Z",
        "activated": "",
        "statusChanged": "",
        "lastLogin": "",
        "lastUpdated": "2018-07-24T20:20:04.000Z",
        "passwordChanged": "",
        "type": {"id": "oty66lckcvDyVcGzS0h7"},
        "profile": {
            "firstName": "Test2",
            "lastName": "Test2",
            "mobilePhone": "",
            "secondEmail": "",
            "login": "john@doe.com",
            "email": "john@doe.com",
        },
        "credentials": {"provider": {"type": "OKTA", "name": "OKTA"}},
        "_links": {},
    },
    {
        "id": "TestID3",
        "status": "PROVISIONED",
        "created": "2018-07-31T12:48:33.000Z",
        "activated": "2020-02-19T12:33:20.000Z",
        "statusChanged": "2020-02-19T12:33:20.000Z",
        "lastLogin": "",
        "lastUpdated": "2020-02-19T12:33:20.000Z",
        "passwordChanged": "2020-02-06T13:32:56.000Z",
        "type": {"id": "oty66lckcvDyVcGzS0h7"},
        "profile": {
            "firstName": "test",
            "lastName": "that",
            "manager": "MegaTester",
            "mobilePhone": "",
            "city": "TLV",
            "displayName": "alsotest",
            "secondEmail": "woo@demisto.com",
            "login": "woo@demisto.com",
            "email": "woo@demisto.com",
            "employeeNumber": "123427",
        },
        "credentials": {"provider": {"type": "OKTA", "name": "OKTA"}},
        "_links": {},
    },
]
logs = [
    {
        "actor": {
            "id": "UserTestID1",
            "type": "User",
            "alternateId": "soso@demisto.com",
            "displayName": "Test1 Testush",
            "detailEntry": "",
        },
        "client": {
            "userAgent": {"rawUserAgent": "python-requests/2.22.0", "os": "Windows", "browser": "Chrome"},
            "zone": "null",
            "device": "Computer",
            "id": "",
            "ipAddress": "8.8.8.8",
            "geographicalContext": {
                "city": "Tel Aviv",
                "state": "Tel Aviv",
                "country": "Israel",
                "postalCode": "",
                "geolocation": {"lat": 32.0678, "lon": 34.7647},
            },
        },
        "authenticationContext": {
            "authenticationProvider": "",
            "credentialProvider": "",
            "credentialType": "",
            "issuer": "",
            "interface": "",
            "authenticatio'nStep": 0,
            "externalSessionId": "trsGDHiJe2ISM2GneNwg_tIWw",
        },
        "displayMessage": "Add user to application membership",
        "eventType": "application.user_membership.add",
        "outcome": {"result": "SUCCESS", "reason": ""},
        "published": "2020-02-18T11:23:05.066Z",
        "securityContext": {"asNumber": "", "asOrg": "", "isp": "", "domain": "", "isProxy": ""},
        "severity": "INFO",
        "debugContext": {
            "debugData": {
                "requestId": "XkvJGFsS6hsPnC7KoFliVAAABzI",
                "requestUri": "/api/v1/users",
                "threatSuspected": "false",
                "url": "/api/v1/users?activate=true",
            }
        },
        "legacyEventType": "app.generic.provision.assign_user_to_app",
        "transaction": {"type": "WEB", "id": "XkvJGFsS6hsPnC7KoFliVAAABzI", "detail": {}},
        "uuid": "081c84f9-5241-11ea-ad7c-6125e916db06",
        "version": "0",
        "request": {
            "ipChain": [
                {
                    "ip": "8.8.8.8",
                    "geographicalContext": {
                        "city": "Tel Aviv",
                        "state": "Tel Aviv",
                        "country": "Israel",
                        "postalCode": "",
                        "geolocation": {"lat": 32.0678, "lon": 34.7647},
                    },
                    "version": "V4",
                    "source": "",
                }
            ]
        },
        "target": [
            {
                "id": "UserTestID2",
                "type": "AppUser",
                "alternateId": "momo@demisto.com",
                "displayName": "Test 1 that",
                "detailEntry": "",
            },
            {
                "id": "0oabfkvxe1npBRdow0h7",
                "type": "AppInstance",
                "alternateId": "Demisto-SAML-OKTA",
                "displayName": "Demisto-SAML-OKTA",
                "detailEntry": "",
            },
            {
                "id": "00upt1h0w93PALT9v0h7",
                "type": "User",
                "alternateId": "momo@demisto.com",
                "displayName": "Test 1 that",
                "detailEntry": "",
            },
        ],
    },
    {
        "actor": {
            "id": "UserTestID2",
            "type": "User",
            "alternateId": "TestID2@demisto.com",
            "displayName": "Testush2 test",
            "detailEntry": "",
        },
        "client": {
            "userAgent": {"rawUserAgent": "python-requests/2.22.0", "os": "Unknown", "browser": "UNKNOWN"},
            "zone": "null",
            "device": "Unknown",
            "id": "",
            "ipAddress": "8.8.8.8",
            "geographicalContext": {
                "city": "Tel Aviv",
                "state": "Tel Aviv",
                "country": "Israel",
                "postalCode": "",
                "geolocation": {"lat": 32.0678, "lon": 34.7647},
            },
        },
        "authenticationContext": {
            "authenticationProvider": "",
            "credentialProvider": "",
            "credentialType": "",
            "issuer": "",
            "interface": "",
            "authenticationStep": 0,
            "externalSessionId": "trsGDHiJe2ISM2GneNwg_tIWw",
        },
        "displayMessage": "Add user to application membership",
        "eventType": "application.user_membership.add",
        "outcome": {"result": "SUCCESS", "reason": ""},
        "published": "2020-02-18T11:23:04.791Z",
        "securityContext": {"asNumber": "", "asOrg": "", "isp": "", "domain": "", "isProxy": ""},
        "severity": "INFO",
        "debugContext": {
            "debugData": {
                "requestId": "XkvJGFsS6hsPnC7KoFliVAAABzI",
                "requestUri": "/api/v1/users",
                "threatSuspected": "false",
                "url": "/api/v1/users?activate=true",
            }
        },
        "legacyEventType": "app.generic.provision.assign_user_to_app",
        "transaction": {"type": "WEB", "id": "XkvJGFsS6hsPnC7KoFliVAAABzI", "detail": {}},
        "uuid": "07f28ec5-5241-11ea-ad7c-6125e916db06",
        "version": "0",
        "request": {
            "ipChain": [
                {
                    "ip": "127.0.0.1",
                    "geographicalContext": {
                        "city": "Tel Aviv",
                        "state": "Tel Aviv",
                        "country": "Israel",
                        "postalCode": "",
                        "geolocation": {"lat": 32.0678, "lon": 34.7647},
                    },
                    "version": "V4",
                    "source": "",
                }
            ]
        },
        "target": [
            {
                "id": "0uapt1h0wbuz8uWvb0h7",
                "type": "AppUser",
                "alternateId": "momo@demisto.com",
                "displayName": "Test 1 that",
                "detailEntry": "",
            },
            {
                "id": "0oabe0e2jruaQccDf0h7",
                "type": "AppInstance",
                "alternateId": "ShrikSAML",
                "displayName": "ShrikSAML",
                "detailEntry": "",
            },
            {
                "id": "00upt1h0w93PALT9v0h7",
                "type": "User",
                "alternateId": "momo@demisto.com",
                "displayName": "Test 1 that",
                "detailEntry": "",
            },
        ],
    },
]

okta_zone = {
    "_links": {
        "deactivate": {
            "hints": {"allow": ["POST"]},
            "href": "https://dev-530328.oktapreview.com/api/v1/zones/nzoqsmcx1qWYJ6wYF7q0/lifecycle/deactivate",
        },
        "self": {
            "hints": {"allow": ["GET", "PUT", "DELETE"]},
            "href": "https://dev-530328.oktapreview.com/api/v1/zones/nzoqsmcx1qWYJ6wYF7q0",
        },
    },
    "created": "2020-04-06T22:23:12.000Z",
    "gateways": [{"type": "CIDR", "value": "4.5.3.2/16"}, {"type": "CIDR", "value": "1.2.1.2/32"}],
    "id": "nzoqsmcx1qWYJ6wYF7q0",
    "lastUpdated": "2020-05-15T05:13:06.000Z",
    "name": "Test Zone",
    "proxies": None,
    "status": "ACTIVE",
    "system": False,
    "type": "IP",
}

LOGS = [{"mock_log1": "mock_value1"}, {"mock_log2": "mock_value2"}, {"mock_log3": "mock_value3"}]


def util_load_json(path: str):
    """
    Utility to load json data from a local folder.
    """
    with open(path, encoding="utf-8") as file:
        return json.loads(file.read())


@pytest.mark.parametrize(
    # Write and define the expected
    "args ,expected_context, expected_readable",
    [
        (
            {"userId": "TestID", "username": "", "verbose": "false"},
            {
                "ID": "TestID",
                "Username": "test@this.com",
                "DisplayName": "test this",
                "Email": "test@this.com",
                "Status": "PROVISIONED",
                "Type": "Okta",
                "Created": "2020-02-19T08:18:20.000Z",
                "Activated": "2020-02-20T11:44:43.000Z",
                "StatusChanged": "2020-02-20T11:45:24.000Z",
                "PasswordChanged": "2020-02-19T08:18:21.000Z",
                "Manager": "manager",
                "ManagerEmail": "manager@test.com",
            },
            "test@this.com",
        ),
        (
            {"userId": "", "username": "test@this.com", "verbose": "true"},
            {
                "ID": "TestID",
                "Username": "test@this.com",
                "DisplayName": "test this",
                "Email": "test@this.com",
                "Status": "PROVISIONED",
                "Type": "Okta",
                "Created": "2020-02-19T08:18:20.000Z",
                "Activated": "2020-02-20T11:44:43.000Z",
                "StatusChanged": "2020-02-20T11:45:24.000Z",
                "PasswordChanged": "2020-02-19T08:18:21.000Z",
                "Manager": "manager",
                "ManagerEmail": "manager@test.com",
            },
            "Additional Data",
        ),
    ],
)
def test_get_user_command(mocker, args, expected_context, expected_readable):
    mocker.patch.object(client, "get_user", return_value=user_data)
    readable, outputs, _ = get_user_command(client, args)
    assert outputs.get("Account(val.ID && val.ID === obj.ID)")[0] == expected_context
    assert expected_readable in readable


def test_get_user_command_not_found_user(mocker):
    """
     Given:
    - Username.

    When:
    - running get_user_command.

    Then:
    - Ensure that no exception was raised, and assert the readable output.
    """
    args = {"username": "test@this.com"}
    mocker.patch.object(client, "get_user", side_effect=Exception("Error in API call [404] - Not found"))
    readable, _, _ = get_user_command(client, args)
    assert readable == "User 'test@this.com' was not found."


def test_get_user_command_email(mocker):
    """
    Given:
        - User email parameter.
    When:
        - Running get_user_command with userEmail.
    Then:
        - Ensure that the user is found via email search and returned correctly.
    """
    args = {"userEmail": "isaac.brock@example.com", "verbose": "false"}
    user_data = {
        "id": "TestID",
        "status": "ACTIVE",
        "created": "2013-06-24T16:39:18.000Z",
        "activated": "2013-06-24T16:39:19.000Z",
        "statusChanged": "2013-06-24T16:39:19.000Z",
        "lastLogin": "2013-06-24T17:39:19.000Z",
        "lastUpdated": "2013-07-02T21:36:25.344Z",
        "passwordChanged": "2013-07-02T21:36:25.344Z",
        "profile": {
            "login": "isaac.brock@example.com",
            "firstName": "Isaac",
            "lastName": "Brock",
            "nickName": "issac",
            "displayName": "Isaac Brock",
            "email": "isaac.brock@example.com",
            "secondEmail": "isaac@example.org",
            "manager": "manager",
            "managerEmail": "manager@test.com",
        },
    }
    expected_context = {
        "ID": "TestID",
        "Username": "isaac.brock@example.com",
        "DisplayName": "Isaac Brock",
        "Email": "isaac.brock@example.com",
        "Status": "ACTIVE",
        "Type": "Okta",
        "Created": "2013-06-24T16:39:18.000Z",
        "Activated": "2013-06-24T16:39:19.000Z",
        "StatusChanged": "2013-06-24T16:39:19.000Z",
        "PasswordChanged": "2013-07-02T21:36:25.344Z",
        "Manager": "manager",
        "ManagerEmail": "manager@test.com",
    }
    expected_readable = "isaac.brock@example.com"

    mocker.patch.object(client, "list_users", return_value=([user_data], None))
    mock_get_user = mocker.patch.object(client, "get_user", return_value=user_data)
    readable, outputs, _ = get_user_command(client, args)

    assert outputs.get("Account(val.ID && val.ID === obj.ID)")[0] == expected_context
    assert expected_readable in readable
    mock_get_user.assert_not_called()


@pytest.mark.parametrize(
    # Write and define the expected
    "args ,expected_context, expected_readable",
    [
        (
            {"userId": "TestID", "username": "", "verbose": "false"},
            {
                "ID": "TestID",
                "Username": "test@this.com",
                "DisplayName": "test this",
                "Email": "test@this.com",
                "Status": "PROVISIONED",
                "Type": "Okta",
                "Created": "2020-02-19T08:18:20.000Z",
                "Activated": "2020-02-20T11:44:43.000Z",
                "StatusChanged": "2020-02-20T11:45:24.000Z",
                "PasswordChanged": "2020-02-19T08:18:21.000Z",
                "Manager": "manager",
                "ManagerEmail": "manager@test.com",
            },
            "test@this.com",
        ),
        (
            {"userId": "", "username": "test@this.com", "verbose": "true"},
            {
                "ID": "TestID",
                "Username": "test@this.com",
                "DisplayName": "test this",
                "Email": "test@this.com",
                "Status": "PROVISIONED",
                "Type": "Okta",
                "Created": "2020-02-19T08:18:20.000Z",
                "Activated": "2020-02-20T11:44:43.000Z",
                "StatusChanged": "2020-02-20T11:45:24.000Z",
                "PasswordChanged": "2020-02-19T08:18:21.000Z",
                "Manager": "manager",
                "ManagerEmail": "manager@test.com",
            },
            "Additional Data",
        ),
    ],
)
def test_list_user_command(mocker, args, expected_context, expected_readable):
    mocker.patch.object(client, "list_users", return_value=(user_data, "123dasu23c"))
    readable, outputs, _ = list_users_command(client, args)
    assert outputs.get("Account(val.ID && val.ID == obj.ID)")[0] == expected_context
    assert expected_readable in readable
    assert "tag: 123dasu23c" in readable


@pytest.mark.parametrize("args", [({"userId": "TestID", "username": "", "verbose": "false"})])
def test_after_key_list_user_command(mocker, args):
    """
    Given
    - args.

    When
    - Running list_users command.

    Then
    - Validate that since there's no more results to show, there's no tag key in the readable output.
    """
    mocker.patch.object(client, "list_users", return_value=(user_data, None))
    readable, _, _ = list_users_command(client, args)
    assert "tag:" not in readable


@pytest.mark.parametrize(
    "url, expected_after_tag", [("https://dev-725178.oktapreview.com/api/v1/users?limit=10&after=qazwsx123", "qazwsx123")]
)
def test_get_after_tag_function(url, expected_after_tag):
    """
    Given
    - url.
    When
    - Running get_after_tag function.

    Then
    - Validate that tag was extracted correctly.
    """
    after_tag = get_after_tag(url)
    assert expected_after_tag == after_tag


@pytest.mark.parametrize(
    "url, expected_url",
    [
        (
            "https://dev-725178.oktapreview.com/api/v1/users?limit=10&after=qazwsx123",
            "https://dev-725178.oktapreview.com/api/v1/users?after=qazwsx123",
        )
    ],
)
def test_delete_limit_param_function(url, expected_url):
    """
    Given
    - url.
    When
    - Running delete_limit_param function.

    Then
    - Ensure that the limit param was deleted.
    """
    modified_url = delete_limit_param(url)
    assert expected_url == modified_url


@pytest.mark.parametrize(
    "args ,expected_context",
    [
        (
            {"userId": "TestID"},
            {
                "ID": "uftpt24kdrDJ7fDOq0h7",
                "FactorType": "token:software:totp",
                "Provider": "GOOGLE",
                "Status": "PENDING_ACTIVATION",
                "Profile": {"credentialId": "woo@demisto.com"},
            },
        ),
        (
            {"username": "test@this.com"},
            {
                "ID": "uftpt24kdrDJ7fDOq0h7",
                "FactorType": "token:software:totp",
                "Provider": "GOOGLE",
                "Status": "PENDING_ACTIVATION",
                "Profile": {"credentialId": "woo@demisto.com"},
            },
        ),
    ],
)
def test_get_user_factors_command(mocker, args, expected_context):
    mock_raw_response = MagicMock()
    mock_raw_response.json.return_value = expected_context
    mock_raw_response.headers = {"x-rate-limit-limit": "1", "x-rate-limit-remaining": "1", "x-rate-limit-reset": "1"}
    mocker.patch.object(client, "get_user_id", return_value="TestID")
    mocker.patch.object(client, "_http_request", return_value=mock_raw_response)
    mocker.patch.object(client, "get_readable_factors", return_value=[expected_context])

    result = get_user_factors_command(client, args)
    readable_output, outputs, raw_response = result
    assert expected_context == outputs.get("Account(val.ID && val.ID === obj.ID)").get("Factor")[0]
    assert outputs.get("Account(val.ID && val.ID === obj.ID)").get("ID") == args.get("userId") or "TestID"


@pytest.mark.parametrize("args", [{"username": "test@this.com"}])
def test_get_groups_for_user_command(mocker, args):
    expected_context = {
        "ID": "00g66lckcsAJpLcNc0h7",
        "Created": "2016-04-12T15:01:50.000Z",
        "ObjectClass": ["okta:user_group"],
        "LastUpdated": "2016-04-12T15:01:50.000Z",
        "LastMembershipUpdated": "2020-02-19T09:01:32.000Z",
        "Type": "BUILT_IN",
        "Name": "Everyone",
        "Description": "All users in your organization",
    }
    mocker.patch.object(client, "get_user_id", return_value="TestID")
    mocker.patch.object(client, "get_groups_for_user", return_value=group_data)
    _, outputs, _ = get_groups_for_user_command(client, args)
    assert outputs.get("Account(val.ID && val.ID === obj.ID)").get("Group")[0] == expected_context
    assert outputs.get("Account(val.ID && val.ID === obj.ID)").get("ID") == "TestID"


@pytest.mark.parametrize(
    "args, polling_response, result",
    [
        ({"userId": "TestID", "factorId": "FactorID"}, polling_response_rejected, "REJECTED"),
        ({"userId": "TestID", "factorId": "FactorID"}, polling_response_success, "SUCCESS"),
    ],
)
def test_verify_push_factor_command(mocker, args, polling_response, result):
    mocker.patch.object(client, "verify_push_factor", return_value=verify_push_factor_response)
    mocker.patch.object(client, "poll_verify_push", return_value=polling_response)
    _, outputs, _ = verify_push_factor_command(client, args)
    assert outputs.get("Account(val.ID && val.ID === obj.ID)").get("ID") == "TestID"
    assert outputs.get("Account(val.ID && val.ID === obj.ID)").get("VerifyPushResult") == result


@pytest.mark.parametrize(
    "args, polling_time, max_polling_calls, expected_calls, expected_result",
    [
        (
            {"userId": "TestID", "factorId": "FactorID", "polling_time": "2", "max_polling_calls": "3"},
            2,
            3,
            3,
            "TIMEOUT",
        ),
        (
            {"userId": "TestID", "factorId": "FactorID", "polling_time": "1", "max_polling_calls": "5"},
            1,
            5,
            2,
            "SUCCESS",
        ),
    ],
)
def test_verify_push_factor_command_polling_args(mocker, args, polling_time, max_polling_calls, expected_calls, expected_result):
    """
    Given:
    - Arguments for verify_push_factor_command with custom polling_time and max_polling_calls

    When:
    - Running verify_push_factor_command with these arguments

    Then:
    - Ensure poll_verify_push is called with the correct polling_time and max_polling_calls
    - Ensure time.sleep is called the expected number of times with the correct polling_time
    - Verify the expected result is returned
    """
    # Mock the verify_push_factor method to return a response with a poll link
    mocker.patch.object(client, "verify_push_factor", return_value=verify_push_factor_response)

    # Mock time.sleep to avoid actual waiting during tests
    mocker.patch("time.sleep")

    # For the first test case (TIMEOUT), all responses should be "WAITING" until timeout
    # For the second test case (SUCCESS), the second response should be "SUCCESS"
    if expected_result == "TIMEOUT":
        waiting_response = {"factorResult": "WAITING"}
        timeout_response = {"factorResult": "TIMEOUT"}

        # Mock http_request to return "WAITING" for all calls
        mocker.patch.object(client, "http_request", side_effect=[waiting_response] * max_polling_calls)

        # Mock poll_verify_push to simulate timeout
        mocker.patch.object(client, "poll_verify_push", return_value=timeout_response)
    else:
        # For SUCCESS case, return SUCCESS on the second call
        success_response = {"factorResult": "SUCCESS"}

        # Mock poll_verify_push to return SUCCESS after some calls
        mocker.patch.object(client, "poll_verify_push", return_value=success_response)

    # Call the function
    _, outputs, _ = verify_push_factor_command(client, args)

    # Verify poll_verify_push was called with correct arguments
    client.poll_verify_push.assert_called_once_with(
        "https://test.com/api/v1/users/TestID/factors/FactorID/transactions/TransactionID", polling_time, max_polling_calls
    )

    # Verify the result
    assert outputs.get("Account(val.ID && val.ID === obj.ID)").get("ID") == "TestID"
    assert outputs.get("Account(val.ID && val.ID === obj.ID)").get("VerifyPushResult") == expected_result


def test_verify_push_factor_command_no_polling(mocker):
    """
    Given:
    - Arguments for verify_push_factor_command with polling set to False
    When:
    - Running verify_push_factor_command
    Then:
    - Ensure that the polling URL is returned in the outputs and poll_verify_push is not called.
    """
    args = {"userId": "TestID", "factorId": "FactorID", "polling": "false"}
    mocker.patch.object(client, "verify_push_factor", return_value=verify_push_factor_response)
    mock_poll = mocker.patch.object(client, "poll_verify_push")

    readable, outputs, raw_response = verify_push_factor_command(client, args)

    assert (
        outputs.get("Okta.PollingStatusURL(true)")
        == "https://test.com/api/v1/users/TestID/factors/FactorID/transactions/TransactionID"
    )
    assert "Push factor challenge has been initiated. To check the push factor challenge status" in readable
    mock_poll.assert_not_called()


@pytest.mark.parametrize(
    "args",
    [({"firstName": "Testush", "lastName": "Test", "email": "test@this.com", "login": "test@this.com", "password": "Aa123456"})],
)
def test_create_user_command(mocker, args):
    mocker.patch.object(client, "create_user", return_value=create_user_response)
    readable, outputs, _ = create_user_command(client, args)
    assert "STAGED" in readable
    assert outputs.get("Account(val.ID && val.ID === obj.ID)")[0].get("Status") == "STAGED"


@pytest.mark.parametrize("args", [({"name": "TestGroup", "description": "Test Group Description"})])
def test_create_group_command(mocker, args):
    mocker.patch.object(client, "create_group", return_value=create_group_response)
    readable, outputs, _ = create_group_command(client, args)
    assert outputs.get("OktaGroup(val.ID && val.ID === obj.ID)")[0].get("Type") == "OKTA_GROUP"


@pytest.mark.parametrize("args", [({"groupName": "TestGroup", "appName": "TestApp"})])
def test_assign_group_to_app_command(mocker, args):
    mocker.patch.object(client, "get_group_id", return_value="00g3q8tjdyoOw6fJE1d7")
    mocker.patch.object(client, "get_app_id", return_value="a456appid654")
    mocker.patch.object(client, "assign_group_to_app", return_value=assign_group_to_app_response)
    readable, outputs, _ = assign_group_to_app_command(client, args)
    assert _.get("id") == "00g3q8tjdyoOw6fJE1d7"


@pytest.mark.parametrize(
    "args, expected",
    [
        (
            {"groupId": "Test Group", "limit": 5},
            {
                "ID": "TestID2",
                "Username": "john@doe.com",
                "DisplayName": "Test2 Test2",
                "Email": "john@doe.com",
                "Status": "STAGED",
                "Type": "Okta",
                "Created": "2018-07-24T20:20:04.000Z",
            },
        )
    ],
)
def test_get_group_members_command(mocker, args, expected):
    mocker.patch.object(client, "get_group_members", return_value=group_members)
    readable, outputs, _ = get_group_members_command(client, args)
    assert "Test Group" in readable
    assert expected == outputs.get("Account(val.ID && val.ID === obj.ID)")[1]


def test_get_logs_command(mocker):
    mocker.patch.object(client, "get_logs", return_value=logs)
    readable, outputs, _ = get_logs_command(client, {})
    assert logs == outputs.get("Okta.Logs.Events(val.uuid && val.uuid === obj.uuid)")
    assert "Unknown browser on Unknown OS Unknown device" in readable
    assert "Chrome on Windows Computer" in readable


@pytest.mark.parametrize("args", [({"zoneID": "nzoqsmcx1qWYJ6wYF7q0"})])
def test_get_zone_command(mocker, args):
    mocker.patch.object(client, "get_zone", return_value=okta_zone)
    readable, outputs, _ = get_zone_command(client, args)
    assert "Test Zone" in readable
    assert outputs.get("Okta.Zone(val.id && val.id === obj.id)").get("id", "") == "nzoqsmcx1qWYJ6wYF7q0"


def test_list_zones_command(mocker):
    mocker.patch.object(client, "list_zones", return_value=okta_zone)
    readable, outputs, _ = list_zones_command(client, {})
    assert "Test Zone" in readable
    assert outputs.get("Okta.Zone(val.id && val.id === obj.id)").get("id", "") == "nzoqsmcx1qWYJ6wYF7q0"


@pytest.mark.parametrize("args", [({"zoneID": "nzoqsmcx1qWYJ6wYF7q0", "zoneName": "NewZoneName"})])
def test_update_zone_command(mocker, args):
    my_okta_zone = okta_zone
    my_okta_zone["name"] = "NewZoneName"
    mocker.patch.object(client, "get_zone", return_value=okta_zone)
    mocker.patch.object(client, "update_zone", return_value=my_okta_zone)
    readable, outputs, _ = update_zone_command(client, args)
    assert outputs.get("Okta.Zone(val.id && val.id === obj.id)").get("name", "") == "NewZoneName"


@pytest.mark.parametrize("args", [({"gateway_ips": "8.8.8.8", "name": "NewZoneName"})])
def test_create_zone_command(mocker, args):
    my_okta_zone = okta_zone
    my_okta_zone["name"] = "NewZoneName"
    mocker.patch.object(client, "create_zone", return_value=okta_zone)
    readable, outputs, _ = create_zone_command(client, args)
    assert outputs.get("Okta.Zone(val.id && val.id === obj.id)").get("name", "") == "NewZoneName"


EXPEXTED_LOGS_RESULT = [
    {
        "Actor": "dummy name (User)",
        "ActorAlternaneId": "example",
        "EventInfo": "Remove user from group membership",
        "EventOutcome": "SUCCESS",
        "EventSeverity": "INFO",
        "Client": "Unknown browser on Unknown OS Unknown device",
        "RequestIP": "8.8.8.8",
        "ChainIP": ["8.8.8.8"],
        "Targets": "test this (User)\ntest1 (UserGroup)\n",
        "Time": "12/13/2021, 01:47:08",
    },
    {
        "Actor": "dummy name (User)",
        "ActorAlternaneId": "example",
        "EventInfo": "Remove user from group membership",
        "EventOutcome": "SUCCESS",
        "EventSeverity": "INFO",
        "Client": "Unknown browser on Unknown OS Unknown device",
        "RequestIP": "8.8.8.8",
        "ChainIP": [],
        "Targets": "test this (User)\ntest1 (UserGroup)\n",
        "Time": "12/13/2021, 01:47:08",
    },
]


def test_get_readable_logs():
    logs_raw_response = util_load_json("test_data/get_logs_response.json")
    result = client.get_readable_logs(logs_raw_response)
    assert len(result) == 2
    assert result == EXPEXTED_LOGS_RESULT


def test_set_password_command():
    client = Client(base_url="https://demisto.com", api_token="XXX")
    headers = {
        "x-rate-limit-limit": "1",
        "x-rate-limit-remaining": "1",
        "x-rate-limit-reset": "1",
    }
    with requests_mock.Mocker() as m:
        m.get('https://demisto.com/api/v1/users?filter=profile.login eq "test"', json=[{"id": "1234"}], headers=headers)
        mock_request = m.post(
            "https://demisto.com/api/v1/users/1234", json={"passwordChanged": "2020-03-26T13:57:13.000Z"}, headers=headers
        )

        result = set_password_command(client, {"username": "test", "password": "a1b2c3"})

    assert result[0] == "test password was last changed on 2020-03-26T13:57:13.000Z"
    assert mock_request.last_request.text == '{"credentials": {"password": {"value": "a1b2c3"}}}'


def test_set_temp_password_command():
    client = Client(base_url="https://demisto.com", api_token="XXX")
    headers = {
        "x-rate-limit-limit": "1",
        "x-rate-limit-remaining": "1",
        "x-rate-limit-reset": "1",
    }
    with requests_mock.Mocker() as m:
        m.get('https://demisto.com/api/v1/users?filter=profile.login eq "test"', json=[{"id": "1234"}], headers=headers)
        m.post("https://demisto.com/api/v1/users/1234", json={"passwordChanged": "2023-03-22T10:15:26.000Z"}, headers=headers)
        m.post(
            "https://demisto.com/api/v1/users/1234/lifecycle/expire_password?tempPassword=true",
            json={"tempPassword": "cAn5N3gx"},
            headers=headers,
        )

        result = set_password_command(client, {"username": "test", "password": "a1b2c3", "temporary_password": "true"})
    expected_results = (
        "test password was last changed on 2023-03-22T10:15:26.000Z\n"
        "### Okta Temporary Password\n|tempPassword|\n|---|\n| cAn5N3gx |\n"
    )
    assert result[0] == expected_results


def mock_get_paged_results(url_suffix="", query_params=None, max_limit=None):
    if max_limit:
        return LOGS[:max_limit]
    else:
        return LOGS


LOGS_WITH_LIMIT = [(None, 3), (1, 1), (3, 3), (1001, 3)]


@pytest.mark.parametrize("limit, logs_amount", LOGS_WITH_LIMIT)
def test_get_logs_command_with_limit(mocker, requests_mock, limit, logs_amount):
    """
    Given:
        - An Okta IAM client object.
    When:
        - Calling function okta-get-logs
        - Events should come in two batches of two events in the first batch, and one event in the second batch.
    Then:
        - Ensure three events are returned in incident the correct format.
    """
    from Okta_v2 import get_logs_command

    client = Client(base_url="https://demisto.com", api_token="XXX")
    mocker.patch.object(Client, "get_paged_results", side_effect=mock_get_paged_results)
    mocker.patch.object(Client, "get_readable_logs", side_effect=mock_get_paged_results)
    requests_mock.get(
        f"https://demisto.com/api/v1/logs?limit={limit}",
        json=LOGS[:limit],
        headers={
            "x-rate-limit-limit": "1",
            "x-rate-limit-remaining": "1",
            "x-rate-limit-reset": "1",
        },
    )
    args = {"limit": limit}
    readable, outputs, raw_response = get_logs_command(client=client, args=args)
    assert len(outputs.get("Okta.Logs.Events(val.uuid && val.uuid === obj.uuid)")) == logs_amount


def test_expire_password_with_revoke_session():
    """
    Given:
        - A client object with mocked methods for getting user ID, revoking a session, and formatting the user context.
        - Arguments for expire_password_command with username, hide_password set to False, and revoke_session set to True.
    When:
        - Calling expire_password_command with revoke_session set to True.
    Then:
        - Ensure the revoke_session method is called.
        - Ensure the response includes the correct tempPassword and user context.
        - Ensure the readable output is formatted as expected.
    """
    from Okta_v2 import expire_password_command

    client = MagicMock()
    args = {"username": "test_user", "hide_password": "False", "revoke_session": "True"}

    client.get_user_id.return_value = "user123"
    client.revoke_session.return_value = {"tempPassword": "test_password"}
    client.get_users_context.return_value = {"ID": "user123"}

    readable_output, outputs, raw_response = expire_password_command(client, args)

    client.revoke_session.assert_called_once_with("user123")
    assert "Account(val.ID && val.ID === obj.ID)" in outputs
    assert outputs["Account(val.ID && val.ID === obj.ID)"]["ID"] == "user123"
    assert "test_password" in raw_response["tempPassword"]
    assert readable_output == "### Okta Expired Password\n|tempPassword|\n|---|\n| test_password |\n"


def test_expire_password_without_revoke_session():
    """
    Given:
        - Arguments for expire_password_command with username, hide_password set to False, and revoke_session set to False.
    When:
        - Calling expire_password_command.
    Then:
        - Ensure the expire_password method is called.
        - Ensure the response includes the correct tempPassword and user context.
        - Ensure the readable output is formatted as expected.
    """
    from Okta_v2 import expire_password_command

    client = MagicMock()
    args = {"username": "test_user", "hide_password": "False", "revoke_session": "False"}

    client.get_user_id.return_value = "user123"
    client.expire_password.return_value = {"tempPassword": "test_password"}
    client.get_users_context.return_value = {"ID": "user123"}

    readable_output, outputs, raw_response = expire_password_command(client, args)

    client.expire_password.assert_called_once_with("user123", args)
    assert "Account(val.ID && val.ID === obj.ID)" in outputs
    assert outputs["Account(val.ID && val.ID === obj.ID)"]["ID"] == "user123"
    assert "test_password" in raw_response["tempPassword"]
    assert readable_output == "### Okta Expired Password\n|tempPassword|\n|---|\n| test_password |\n"


def test_hide_password():
    """
    Given:
        - Arguments for expire_password_command with username, hide_password set to True, and revoke_session set to False.
    When:
        - Calling expire_password_command.
    Then:
        - Ensure the tempPassword in the response is hidden.
        - Ensure the readable output is formatted to indicate the password is hidden.
    """
    from Okta_v2 import expire_password_command

    client = MagicMock()
    args = {"username": "test_user", "hide_password": "True", "revoke_session": "False"}

    client.get_user_id.return_value = "user123"
    client.expire_password.return_value = {"tempPassword": "test_password"}
    client.get_users_context.return_value = {"ID": "user123"}

    readable_output, outputs, raw_response = expire_password_command(client, args)

    assert raw_response["tempPassword"] == "Output removed by user. hide_password argument set to True"
    assert readable_output == (
        "### Okta Expired Password\n|tempPassword|\n|---|\n| Output removed by user. hide_password argument set to True |\n"
    )


def test_show_password():
    """
    Given:
        - Arguments for expire_password_command with username, hide_password set to False, and revoke_session set to False.
    When:
        - Calling expire_password_command.
    Then:
        - Ensure the tempPassword in the response is shown.
        - Ensure the readable output displays the tempPassword.
    """
    from Okta_v2 import expire_password_command

    client = MagicMock()
    args = {"username": "test_user", "hide_password": "False", "revoke_session": "False"}

    client.get_user_id.return_value = "user123"
    client.expire_password.return_value = {"tempPassword": "test_password"}
    client.get_users_context.return_value = {"ID": "user123"}

    readable_output, outputs, raw_response = expire_password_command(client, args)

    assert raw_response["tempPassword"] == "test_password"
    assert readable_output == "### Okta Expired Password\n|tempPassword|\n|---|\n| test_password |\n"


def test_missing_username_and_user_id():
    """
    Given:
        - Arguments for expire_password_command with hide_password and revoke_session but no username or user ID.
    When:
        - Calling expire_password_command without providing a username or user ID.
    Then:
        - Ensure an exception is raised indicating that either a username or user ID must be provided.
    """
    from Okta_v2 import expire_password_command

    client = MagicMock()
    args = {"hide_password": "False", "revoke_session": "False"}

    client.get_user_id.return_value = None

    try:
        expire_password_command(client, args)
    except Exception as e:
        assert "You must supply either 'Username' or 'userId" in str(e)


@patch.object(Client, "http_request")
def test_revoke_session(mock_http_request):
    """
    Given:
        - A valid user ID.
    When:
        - Calling revoke_session with a user ID.
    Then:
        - Ensure http_request is called with the correct method, URL, and parameters.
    """
    user_id = "12345"
    expected_uri = f"/api/v1/users/{user_id}/lifecycle/expire_password_with_temp_password"
    expected_params = {"revokeSessions": "true"}
    client.revoke_session(user_id)
    mock_http_request.assert_called_once_with(method="POST", url_suffix=expected_uri, params=expected_params)


def test_apply_zone_update_override():
    """
    Given: empty ZoneObeject
    When: apply_zone_updates is called with "OVERRIDE" update type and specific gatewayIPs and proxyIPs,
    Then: the zoneObject should be updated with the provided data.
    """
    zoneObject = {}
    updated_zone = apply_zone_updates(
        zoneObject, "TestZone", ["192.168.1.1", "10.0.0.0-10.0.0.10"], ["10.0.0.1", "192.168.1.0-192.168.1.5"], "OVERRIDE"
    )
    assert updated_zone == {
        "name": "TestZone",
        "gateways": [{"type": "CIDR", "value": "192.168.1.1/32"}, {"type": "RANGE", "value": "10.0.0.0-10.0.0.10"}],
        "proxies": [{"type": "CIDR", "value": "10.0.0.1/32"}, {"type": "RANGE", "value": "192.168.1.0-192.168.1.5"}],
    }


def test_apply_zone_update_append_with_range():
    """
    Given: zoneObject already with some gateways,
    When: apply_zone_updates is called with "APPEND" update type and IP ranges,
    Then: the new gateways with IP ranges should be appended to the existing ones in the zoneObject.
    """
    zoneObject = {"gateways": [{"type": "CIDR", "value": "192.168.1.1/32"}]}
    updated_zone = apply_zone_updates(
        zoneObject, "NewZone", ["192.168.1.2-192.168.1.10"], ["10.0.0.1", "10.0.0.2-10.0.0.5"], "APPEND"
    )
    assert updated_zone == {
        "name": "NewZone",
        "gateways": [{"type": "CIDR", "value": "192.168.1.1/32"}, {"type": "RANGE", "value": "192.168.1.2-192.168.1.10"}],
        "proxies": [{"type": "CIDR", "value": "10.0.0.1/32"}, {"type": "RANGE", "value": "10.0.0.2-10.0.0.5"}],
    }


@pytest.mark.parametrize(
    "group_name, mock_response, expected_id",
    [
        (
            "Existing Group",
            [{"id": "123", "profile": {"name": "Existing Group"}}],
            "123",
        ),
        (
            "Non-existent Group",
            [{"id": "123", "profile": {"name": "Existing Group"}}],
            None,
        ),
        (
            "Empty Response",
            [],
            None,
        ),
        (
            "Multiple Groups",
            [
                {"id": "123", "profile": {"name": "Group A"}},
                {"id": "456", "profile": {"name": "Multiple Groups"}},
            ],
            "456",
        ),
    ],
)
def test_get_group_id(mocker, group_name, mock_response, expected_id):
    """
    Given:
        - A group name to search for.
    When:
        - Calling the get_group_id method.
    Then:
        - Ensure the correct group ID is returned if found, otherwise None.
    """
    mocker.patch.object(client, "http_request", return_value=mock_response)
    mocker.patch("Okta_v2.encode_string_results", side_effect=lambda x: x)  # Mock encode_string_results

    group_id = client.get_group_id(group_name)
    assert group_id == expected_id


def test_verify_mfa_status_command(mocker):
    """
    Given:
    - polling_url.

    When:
    - running verify_mfa_status_command.

    Then:
    - Ensure that the status is returned correctly.
    """
    args = {"polling_url": "https://test.com/api/v1/users/TestID/factors/FactorID/transactions/TransactionID"}
    mock_response = {"id": "TransactionID", "factorResult": "SUCCESS"}
    mocker.patch.object(client, "get_push_factor_status", return_value=mock_response)

    readable, outputs, raw_response = verify_mfa_status_command(client, args)

    assert "The status of the push factor challenge is SUCCESS" in readable
    assert outputs.get("Okta.FactorResult(val.ID && val.ID === obj.ID)").get("factorResult") == "SUCCESS"
    assert outputs.get("Okta.FactorResult(val.ID && val.ID === obj.ID)").get("ID") == "FactorID"
    assert raw_response == mock_response


@pytest.mark.parametrize(
    "url, expected_user_id, expected_factor_id",
    [
        ("https://example.okta.com/api/v1/users/user-id/factors/factor-id", "user-id", "factor-id"),
        ("https://example.okta.com/api/v1/users/U123/factors/F456/transactions/T789", "U123", "F456"),
        ("http://localhost/users/me/factors/my-factor", "me", "my-factor"),
    ],
)
def test_extract_user_and_factor_id_from_url_success(url, expected_user_id, expected_factor_id):
    """
    Given:
        - A valid polling URL containing user and factor IDs.
    When:
        - Calling extract_user_and_factor_id_from_url.
    Then:
        - Ensure the user ID and factor ID are correctly extracted.
    """
    user_id, factor_id = extract_user_and_factor_id_from_url(url)
    assert user_id == expected_user_id
    assert factor_id == expected_factor_id


@pytest.mark.parametrize(
    "url",
    [
        "https://example.okta.com/api/v1/users/user-id",
        "https://example.okta.com/api/v1/factors/factor-id",
        "https://example.okta.com/api/v1/something/else",
        "",
    ],
)
def test_extract_user_and_factor_id_from_url_failure(url):
    """
    Given:
        - An invalid polling URL.
    When:
        - Calling extract_user_and_factor_id_from_url.
    Then:
        - Ensure a DemistoException is raised.
    """
    from CommonServerPython import DemistoException

    with pytest.raises(DemistoException, match="Could not extract user ID and Factor ID from the polling URL"):
        extract_user_and_factor_id_from_url(url)


def test_clear_user_sessions_with_oauth_tokens(mocker):
    """
    Given:
        - Arguments for clear_user_sessions_command with revokeOauthTokens set to true.
    When:
        - Running clear_user_sessions_command.
    Then:
        - Ensure the clear_user_sessions method is called with revoke_oauth_tokens=True.
        - Ensure the API is called with the oauthTokens query parameter.
    """
    mock_http_request = mocker.patch.object(client, "http_request", return_value="")
    client.request_metadata = {}

    args = {"userId": "TestUserID456", "revokeOauthTokens": "true"}
    readable_output, outputs, raw_response = clear_user_sessions_command(client, args)

    mock_http_request.assert_called_once_with(
        method="DELETE",
        url_suffix="/api/v1/users/TestUserID456/sessions",
        params={"oauthTokens": True},
        resp_type="text",
    )
    assert "TestUserID456" in readable_output


def test_clear_user_sessions_without_oauth_tokens(mocker):
    """
    Given:
        - Arguments for clear_user_sessions_command with revokeOauthTokens set to false.
    When:
        - Running clear_user_sessions_command.
    Then:
        - Ensure the clear_user_sessions method is called with revoke_oauth_tokens=False.
        - Ensure the API is called without the oauthTokens query parameter.
    """
    mock_http_request = mocker.patch.object(client, "http_request", return_value="")
    client.request_metadata = {}

    args = {"userId": "TestUserID789", "revokeOauthTokens": "false"}
    readable_output, outputs, raw_response = clear_user_sessions_command(client, args)

    mock_http_request.assert_called_once_with(
        method="DELETE",
        url_suffix="/api/v1/users/TestUserID789/sessions",
        params={"oauthTokens": False},
        resp_type="text",
    )
    assert "TestUserID789" in readable_output