66

How can I automatically login to captive portals on OS X?

A captive portal is used by (often not password-protected) wireless networks that present a web page as soon as you connect to them, requiring you to login.

I have to login to different wireless networks like this very frequently, and none of the captive portals seem to remember my login/password information. Is there a way to automate the login process somehow, or at least store the login/password pairs in the Keychain?

Update: There’s an iOS app called AutoWifi that basically handles this. If it’s possible to do this on iOS with all its restrictions, surely it must be possible to do something like it on OS X, right?


Related fun fact: This is how Apple tests for captive portals on OS X and iOS:

OS X and iOS make a request to http://www.apple.com/library/test/success.html every time you connect to a WiFi network.

As of Yosemite the URL is now: http://captive.apple.com/hotspot-detect.html

This URL returns the following HTML:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
    <TITLE>Success</TITLE>
</HEAD>
<BODY>
Success
</BODY>
</HTML>
  • 1
    Take a look at /Library/Preferences/SystemConfiguration/CaptiveNetworkSupport/Settings.plist. Manipulating the preferences here can easily compound serious security risks on top of the many Apple has decidedly implemented on their own. I'm not sure which browser you use to connect via these captive portals, but you can also try setting up network locations for them, or creating a simple macro depending on what you want to auto-fill. – l'L'l Apr 5 '12 at 17:46
  • 2
    That’s the thing — whenever OS X detects a captive portal, it opens a WebView popup window (not a real browser UI) with the login page. – Mathias Bynens Apr 6 '12 at 5:53
  • If you have a chance post the source code of the popup. – l'L'l Apr 6 '12 at 6:30
  • @ioi The HTML source of the page depends on the network. Once you get the popup, it’s possible to browse to the same page by just opening any browser and trying to load a URL. – Mathias Bynens Apr 6 '12 at 6:52
  • 2
    None of the answers answers the question! – Tyilo Jun 22 '13 at 11:28
27

You can rename

/System/Library/CoreServices/Captive Network Assistant.app

into

/System/Library/CoreServices/No More Captive Network Assistant.app

and you're all set. Password entering now goes via your browser of choice and can be stored using 1password or other plugins. Note that if you were already logged in while doing the renaming, it may take some time for your session to expire...

  • 1
    Looking forward to testing this out :) No downsides? – Mathias Bynens Dec 11 '12 at 21:51
  • 1
    While this may be simple(st?) solution, I would think cwd's answer is the proper way to do it even though it's admin-ish. There are certain things on Mac that Apple kind of forces us to be admin-ish on, when we want to "think different" from Apple. – David Jul 7 '15 at 19:14
  • On newer versions of macOS, you will need to disable System Integrity Protection before you are able to rename this file. I'm not opposed to renaming system stuff when necessary, but cwd's answer is better in this case. – Wowfunhappy Feb 17 at 6:06
54

Just found this Disable Captive Network Support in OS X

Which mentions "To disable it, set this preference:"

sudo defaults write /Library/Preferences/SystemConfiguration/com.apple.captive.control Active -boolean false

In case, you would ever want to remove this setting, you can do:

sudo defaults delete /Library/Preferences/SystemConfiguration/com.apple.captive.control Active

Then, as @Leon mentions, use the regular web browser to login. Or if you are on a network where that somehow does not work then you can still try and open the app manually ( located at /System/Library/CoreServices/Captive Network Assistant.app )

  • 2
    cwd++ This is still the best answer. Today on Mojave, I was unable to rename or delete the Captive Network Assistant.app, but I was able to force the disabling via defaults – danielpops Nov 10 '18 at 21:15
16

Tyilo's NetworkAutoLogin project on github is an os.x daemon that "Automagically logs into to Captive Portal Networks" with user-supplied credentials.

It uses PhantomJS & CasperJS to post the necessary info to the fields on the captive portal login page. Could be the secret login "password", a username-password pair, or just activating a EULA checkbox and the "connect" button.

I can't remember exactly how it is triggered, but it registers a .plist with launchctl.

You put configuration options in a json file, specifying the name of the fieldset (optional) on the captive portal page and the necessary fieldname + content pairs (required). Here's an example of the config file stored in ~/.networkautologin.js

{ // Example with all possible options
    match: {
        SSID: ['Example WiFi 1', 'Example WiFi 2'],
        BSSID: '01:23:45:67:89:AB',
        URL: 'http://logon.example.org/?url=http://www.apple.com/library/test/success.html'
    },
    form_selector: 'form#login_form',
    fields: {
        'username': 'test',
        'password': '123123'
    }
}
  • 1
    not crazy that it requires yet another daemon to be running in the background – cwd Aug 3 '14 at 13:47
  • I have compiled it but have been unable to observe the daemon trigger when presented with a preset captive network login page. – Mac Cowell Aug 12 '14 at 22:26
  • Likewise (even updated it to the new settings in yosemite+) – Jeef Jan 8 '16 at 16:06
6
+50

Doesn't deleting (or renaming) /Library/Preferences/SystemConfiguration/CaptiveNetworkSupport/Settings.plist stop the auto-probing?

It could at least stop the opening of the WebView popup.

Otherwise replace all URLs in that Settings.plist with a local hosted copy of the success.html file and host the success.html file on your localhost webserver.

3

I seeing captive portal requests on my home network every 5 min. But I've changed in file /Library/Preferences/SystemConfiguration/CaptiveNetworkSupport/Settings.plist

string: http://www.apple.com/library/test/success.html to http://captive.apple.com/hotspot-detect.html (I meant ProbeURL section). apple changed probe URL for new OS, I do not know why, but new URL response is 200 (OK) and should works (I've faced with same problem on my mbp 2011 Mavericks).

3

With some help using AppleScript, Lynx, Fakeapp/Safari, and ControlPlane, My MacBook now always connected to captive portal automatically in my office. It still not an efficient way to make it, but it still get the job done perfectly. I hope someone can make it simpler.

Here's the code:

  1. Make sure we are in correct SSID

    do shell script "/System/Library/PrivateFrameworks/Apple80211.framework/Resources/airport -I | awk '/ SSID: / {print $2}'"
    
  2. Check captive portal address existence

    try
        do shell script ("ping -c 2 " & CaptiveAddress) -- set your captive address here
        set CaptiveExist to "yes"
    on error
        set CaptiveExist to "no"
    end try
    
  3. Test portal connection

    try
        set PortalOpened to do shell script ("/usr/local/bin/lynx --dump http://www.apple.com/library/test/success.html | grep 'Success'")
        if PortalOpened is "   Success" then
            set PortalOpened to "yes"
        else
            set PortalOpened to "no"
        end if
    on error
        set PortalOpened to "no"        
    end try
    
  4. Logging in to portal

    tell application "Fake"
        load URL "http://YourPortalAddress.html" -- put your captive address here
        set value of element with name "username" to "user"
        set value of element with name "password" in form with name "password" to "password"
        click element with id "logincaption"
    end tell
    
  5. Save those scripts as one application. Then use ControlPlane rules to make it run when triggered with specified SSID.

Surely login form on captive may have another HTML elements. You can add some display dialogs or notifications, another different SSID with it's own HTML elements and username/password. Fake is a browser+automator, so it will make life easier.

Don't forget to disable captive login popup. Now your Mac 100% autoconnect to the portal.

Hope that helps.

2

A captive portal is not like a password. It's more like a sign in sheet. Every time the network you're connected to hands out an IP address through DHCP, it gives you the captive portal to sign into/agree to and then it allows you to connect. From what I understand, this is a cross platform restriction that cannot be altered. It may be something that the network administrators can change, but even that may depend on the type of equipment being used.

  • You’re absolutely right that it’s more like a sign-in sheet than a password, but I’m surprised there doesn’t seem to be an easy way to autofill this sheet :) On iOS, there are apps that can take care of this. Isn’t there anything similar for OS X? – Mathias Bynens Mar 23 '12 at 12:33
  • What apps for iOS can do this? Wouldn't you then have to use that app for web browsing, etc.? – Matt Love Mar 23 '12 at 12:36
  • 1
    The AutoWiFi app handles this automatically; all you have to do is click “Connect” once and you’re logged in. – Mathias Bynens Mar 23 '12 at 12:40
2

Although a few years old this question and answer shows high in googling this. Unfortunately MacOS has changed since then. This page on MacWorld from 2016 seems to describe the current (as of this writing) state.

Which essentially is that because of SIP you can disable the assistant only in recovery mode. I have yet to find any solution to the other part of this question, "can we automate the login?"

  • 1
    In High sierra it no longer seems possible to rename Captive\ Network\ Assistant.app as suggested there. At least I could not even when running as root. – Henry Story Jan 4 '18 at 8:22
  • You need to disable that latest MacOS operating protection feature. support.intego.com/hc/en-us/articles/… I do not know if this approach still works, but at least you now can try. – historystamp Nov 23 '18 at 3:01
0

You can use Mili, an open-source tool I wrote for auto login hotspot pages. It also works on Linux.

When you change your Wi-Fi connection, Mili checks for Mikrotik services and then attempts to log in with your login information.

You can also use multi-login information like this:

{
    "username": "USER 1",
    "password": "PASS 1",
    "share": 5
}, 
{
    "username": "USER 2",
    "password": "PASS 2",
    "share": 1
}

We're looking for long answers that provide some explanation and context. Don't just give a one-line answer; explain why your answer is right, ideally with citations. Answers that don't include explanations may be removed.

  • Welcome to Ask Different. Site rules require that you indicate in your answer if you're affiliated with the software you're recommending. In this case, you're the author but you don't state this in your answer. Please see How to Answer for info on providing answers here and edit your answer to include the missing info. – fsb Feb 16 at 19:30

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .