Okta sign-in review board with location and VPN checks
See two weeks of Okta sign-ins grouped by person, with the city, network owner and VPN status behind every address, plus one-click lockdown.
Build me an app my security team opens each morning to review where our Okta sign-ins are actually coming from. It is a working console, not a report: the geography evidence and the response buttons live on the same screen.
Main view: a sign-in review board. Pull the last 14 days of successful and failed sign-in events with the Okta List System Log Events operation (session start, authentication and policy-deny events), following the cursor pagination until the window is complete. Group the events by user, not by raw event, so one traveller does not flood the board. Each user row shows their name and login, how many successful and failed sign-ins they had, how many distinct addresses and countries they signed in from, which applications were involved, and when they were last seen.
IP enrichment: collect every distinct address across the fetched events, deduplicate it, and enrich the whole set once per run with the IPinfo Batch IP Lookup operation, using Core / Plus IP Lookup for the richer record where the account's plan allows it. Cache each address once per run and persist the enrichment so reopening the board does not re-spend IPinfo quota, which is metered per plan and per day. For every address show the city and region, the country, the network owner (the autonomous system number and organisation name), and flags for VPN, proxy, Tor exit, relay and hosting or datacenter address.
Degrade gracefully on enrichment. IPinfo's privacy and VPN detection and its company data are paid-plan features: when the token's plan omits them, those fields are simply absent or the request is refused for that field. Do not let that break a row or the board. Fall back to the free country plus network owner signal and label the row from the organisation name, since a hosting or transit network name is still a strong tell that this is not a normal employee connection. Private and non-routable addresses come back marked as bogons with no geography, so render those as internal rather than unknown.
Sort users by risk, highest first. First, impossible travel: two successful sign-ins whose locations are too far apart for the time elapsed between them. Compute the great-circle distance between the two coordinates and the implied travel speed, and flag anything above a configurable threshold, defaulting to roughly 800 km/h. Second, the first time we have ever seen that user signing in from that country, compared against the countries seen for that user in the fetched window and in the app's own stored history. Third, sign-ins from hosting, datacenter or anonymizer networks. Everything else sits below, and benign repeats (same provider and same city that user has used before) sink to the bottom. Show the reason a user is ranked where they are, in plain words, on the row itself.
Filters across the top for user, country and application. Clicking a user opens a detail panel with their full timeline for the window: each sign-in with its timestamp, result, application, address, city and country, network owner, and any privacy flags.
Response buttons on each user row and in the detail panel, each behind a confirmation step: Okta Revoke All User Sessions to sign them out everywhere, Okta Reset User MFA Factors so they re-enrol, and Okta Reset User Password to start the reset flow. Record who pressed which button and when, and show that action history on the row so the next reviewer sees what was already done.
A cleared state that persists server side. Marking a case cleared removes it from the default board and it does not come back tomorrow unless that user has new risky activity after the cleared timestamp. Include a toggle to show cleared cases, with who cleared them and when.
A share button on each case that posts the case to the security channel using the Slack Bot Send a Message operation: the user, why they are flagged, the addresses involved with their city, country, network owner and privacy flags, and what has already been actioned. Make the destination channel a setting in the app.
An "Investigate this account" button that kicks off a background agent for that one user. The agent pulls that user's last 30 days of events with Okta List System Log Events, collects every distinct address they used, enriches them with IPinfo Batch IP Lookup and Get Full IP Details, and looks up the owning networks with IPinfo Get ASN Details to see who really operates each one. It then writes a plain English timeline of the account's activity and a verdict (looks like normal travel, looks compromised, or needs more information) with the evidence behind it. Store that output against the user's case and render it in the same detail panel the reviewer is already reading, with a status of queued, running or complete and a finished-at timestamp so nobody has to leave the app to check on it.
Practical notes to bake in: Okta system log history is retained for a limited window, 90 days by default, so keep the board window and the investigation window inside it and surface a clear message if a request reaches past retention. Respect Okta rate limits by honouring the reset headers rather than hammering the log endpoint. Batch every IP lookup and never look up the same address twice in a run. Make the review window (default 14 days) and the impossible-travel speed threshold configurable in the app's settings.
What does this prompt do?
- Shows the last 14 days of successful and failed Okta sign-ins grouped by person, so one traveller does not flood the board with dozens of rows
- Looks up every address behind those sign-ins and shows the city, the country, the company that owns the network, and whether it is a VPN, proxy, Tor exit or datacenter connection
- Sorts people by risk: impossible travel first, then the first time you have ever seen someone in a country, then sign-ins from hosting and anonymizer networks
- Puts the response on the same screen: sign the person out everywhere, reset their multi-factor setup, start a password reset, or share the case with your security channel
- Marks a case as cleared so a reviewed person does not come back on tomorrow's board
- Has an Investigate this account button that runs a background review of the person's last 30 days and writes a plain English timeline and verdict straight back into the panel
What do I need to use this?
- An Okta administrator account, so the app can read your sign-in history and take action on users
- An IPinfo account for the location and network lookups (a free account works, with fewer details)
- A Slack workspace if you want the share-to-channel button
- A security channel or reviewer group who will actually work the board each morning
How can I customize it?
- Change the review window from 14 days to whatever your team works, and pick which apps are in scope
- Tune what counts as impossible travel, such as the travel speed that trips the flag or a grace period for known road warriors
- Choose which Slack channel the share button posts to, and which response buttons reviewers are allowed to use
FAQs
Does this replace Okta's own suspicious activity detection?
Do I need a paid IPinfo plan?
What is impossible travel?
Will taking action here actually lock someone out?
What does the Investigate button do?
How far back can it look?
Related templates
Stage a batch of filings overnight, then approve each completed form from a screenshot before anything is ever submitted.
Pick a client and a date range to see sent, replies, meetings booked and the real deal value your cold email produced, campaign by campaign.
Review every conversation Fin closed as resolved, judge which ones actually stuck, and see what the gap is worth against your bill.
Merge your IT, HR and Facilities queues into one list ranked by SLA time left, then reply, change status and escalate without ever opening Jira.
See every page's translation status at a glance, edit translations side by side with the English, and publish only what your team has actually approved.
One place for sales and ops to request an NDA or vendor agreement, watch its status, and let legal launch the contract in a single click.
Stop eyeballing the Okta log every morning.
Get the sign-in geography, the VPN evidence and the lockdown buttons on one screen your security team can work from.