Single sign-on ve vpsAdminu / vpsAdmin single sign-on

Read the announcement in English.

Úvod

Chtěl bych vám představit nový systém přihlašování do vpsAdminu. Cílem mojí snahy bylo sjednotit způsob přihlašování do vpsAdminu, znalostní báze, Discourse a případně dalších služeb do budoucna.

Změny se týkají především webového rozhraní vpsAdminu běžícího na https://vpsadmin.vpsfree.cz. Přihlašování nyní využívá OAuth2 a máme tak jeden autorizační server pro všechny webové služby. Mezi vpsAdminem, znalostní bázi i Discourse funguje single sign-on, tzn. přihlašovací údaje stačí zadat jen jednou. Přihlašovací formulář je sice na jiné adrese, i tak by ale prohlížeč měl být schopen doplnit údaje, pokud je máte uložené.

Single sign-on

Když se přihlásíte do libovolné služby, autorizační server si vás zapamatuje. Pokud pak přejdete na jinou službu a budete se chtít přihlásit, už nebude potřeba znovu zadávat jméno a heslo. Single sign-on bude fungovat až do odhlášení ze všech služeb, do kterých jste se v daném prohlížeči přihlásili. Přesněji řečeno, single sign-on bude aktivní, dokud budou platit vystavené OAuth2 přístupové tokeny. Například Discourse použije token jen k ověření identity, založení účtu, a dále funguje nezávisle.

Pokud by někdo nechtěl single sign-on využívat, v nastavení profilu ve vpsAdminu je možné tuto funkci vypnout. Každé přihlášení pak bude vyžadovat zadání jména a hesla.

Nastavitelná délka sezení

Webové rozhraní vpsAdminu vás po 20 minutách neaktivity odhlásí. Tuto dobu lze nyní změnit v nastavení v profilu ve vpsAdminu. Pokud nastavíte délku sezení na nulu, k automatickému odhlášení nedojde nikdy. Používejte dle vlastního uvážení.

Alternativně, pokud kliknete na čas zbývající do odhlášení, dojde k jeho prodloužení. Dlouhý klik ho potom zruší úplně. Tato funkce už je ve vpsAdminu dlouho, ale není nikde popsaná.

Hromadné odhlášení

V nastavení profilu ve vpsAdminu si nyní můžete nastavit, že při odhlášení sezení se odhlásí všechny sezení dané služby. Například, pokud se do webového rozhraní přihlásíte 2x z jiného prohlížeče, nebo úplně jiného zařízení, odhlášení jednoho z nich ukončí obě sezení.

Malé zlepšováky

Noví členové si musí při prvním přihlášení změnit heslo. Někdo to buď nestihl a došlo k automatickému odhlášení, nebo omylem klikl na tlačitko “Login” dvakrát, tím první přihlášení vyčerpal a skončil s uzamčeným účtem. Nový přihlašovací formulář řeší obě situace: změna hesla je vynucena během přihlašovacího procesu, tj. bez ní k přihlášení nedojde a účet tak nejde tímto způsobem zablokovat. Potvrzení přihlašovacího formuláře je taktéž vizuálně znázorněno a je zabráněno opakovanému odeslání formuláře.

Dále je možné si zobrazit heslo a ověřit tak, že váše klávesnice píše to, co čekáte. Pokud zapomenete heslo nebo ztratíte autentizační zařízení pro TOTP, hned vidíte co máte dělat: použít tzn. recovery code a nebo napsat na podporu.

Nastavitelné oprávnění v API

Pokud používáte API, mohou vás zajímat nastavitelné scopes. Každá akce v API je jedno scope, jehož název najdete v dokumentaci API. U jednotlivých přístupových tokenů si můžete nastavit, jaké scopes bude mít k dispozici, tedy jaké akce bude moct volat. Scopes lze použít u přihlašování pomocí tokenů a OAuth2.

Například s vpsfreectl použijeme scopes takto:

vpsfreectl --auth token --scope 'vps#*:vps_id=123' --save vps show 123

Příkaz výše vytvoří autentizační token, který bude omezen na volání akcí nad resource vps s ID 123.

Další příklady scopes:

  • all povolí přístup ke všem akcím, toto scope využívá webové rozhraní
  • prázdný scope, přístup je povolen jen k akci user#current, což zobrazí info o aktuálním uživateli; toto se využívá pro přihlášení do Discourse a KB
  • vps#show povolí zobrazení info o jakékoli VPS
  • vps#show:vps_id=123 info o VPS s ID 123
  • vps#* umožní volat všechny akce nad všemi VPS
  • vps#*:vps_id=123 všechny akce nad VPS s ID 123
  • {vps,dataset}#{index,show} umožní vylistovat VPS a datasety a zobrazit údaje o jednom konkrétním

Scope může obsahovat globy pro název resource a akce. Akce je od resource oddělena křížkem (#). Volitelné ID objektů se píšou za dvojtečkou a nemohou obsahovat globy, musí být přesně. Názvy scopes a parametrů najdete v dokumentaci API. Každý token může mít více nastavených scopes, oddělují se mezerou. Pro udělení přístupu musí aspoň jedno nastavené scope platit pro volanou akci v API.

Pro použití této funkce musíte mít aktuální verzi vpsfree-client (>= 0.18.0). Starší verze se budou na scope ptát na standardním vstupu.

English

I’d like to introduce a new vpsAdmin log in system. My goal was to unify the authentication process for vpsAdmin, knowledge base, Discourse and possibly other services in the future.

vpsAdmin web interface at https://vpsadmin.vpsfree.cz now authenticates using OAuth2 authorization server. The same authorization server is used for all other web services. The authorization server maintains a single sign-on for your session, so you need to enter your credentials only once and then you can access all of vpsAdmin, knowledge base and Discourse. Even though the login form is on a different address, your browser should be able to auto-fill your credentials in case you have them saved.

Single sign-on

When you log in to one service, the authorization server remembers you. When you try to log in to a different service, you won’t be asked for your credentials again. The single sign-on session will work until you’ve logged out of all services. To be exact, the single sign-on session will remain active as long as at least one OAuth2 access token is valid. For example, Discourse uses the access token only to verify your identity and then maintains a standalone session, so you can remain logged in to Discourse permanently, but the single sign-on session will not be active as long.

If you’d like to disable single sign-on for your account, you can do so in profile settings in vpsAdmin. Every login will then ask for your credentials.

Configurable session length

vpsAdmin web interface will automatically log you out after 20 minutes of inactivity. This timeout can now be configured in profile settings. If you’ll set the session length to 0, you will not be automatically logged out. Use at your own discretion.

Alternatively, the session can be temporarily extended by clicking on the timeout counter at the top right. Long-click will disable the timeout altogether. This feature is not new, but it isn’t documented anywhere.

Logout all sessions

If you use vpsAdmin from different browsers or devices, you might want to logout from all of them at once. This feature can now be enabled in profile settings. When configured, a logout from one session will logout all sessions from the same OAuth2 client, which is e.g. the web interface or knowledge base.

Small improvements

New members are required to change password on the first login. This has sometimes led to people accidentally locking out their accounts when they failed to change the password. Some people didn’t make it in time and were automatically logged out, or it was possible to click on the login button multiple times and thus waste the first login. The new login form makes the password reset a part of the authentication process, so it is not possible to lockout your account that way. We also make it visually clear that the login button has been clicked on and the form cannot be resubmitted.

The login form allows you to view the password, so you can check if the keyboard is typing what you expect. We also make it clear what to do when you’ve forgotten your password or lost your TOTP authentication device: either use a recovery code or contact support.

Configurable API scopes

If you’re using our API, you might be interested in configurable scopes. Every action in the API has one scope, you can find the individual scopes in the documentation. Access tokens can be restricted to selected scopes, allowing for fine-grained access control. Scopes can be used with token and OAuth2 authentication mechanisms.

For example, with vpsfreectl, we’d use scopes as:

vpsfreectl --auth token --scope 'vps#*:vps_id=123' --save vps show 123

The command above will ask for an authentication token that will only be allowed to call actions on the vps resource and only on VPS with ID 123.

More examples of scopes:

  • all allow access to all actions, this is used by the web interface and it is the default scope
  • an empty scope will allow access only to user#current, which gives information about the current user; this is used for logins from Discourse and KB
  • vps#show allow access to action show on vps resource
  • vps#show:vps_id=123 allow access to action show on a specific VPS
  • vps#* allow all actions on vps resource
  • vps#*:vps_id=123 all actions on vps resource, but only with VPS ID 123
  • {vps,dataset}#{index,show} list and show info about VPS and datasets

Scopes can contain globs for resource and action names. Action name is separated from resource name by a hash (#). Optional object IDs are separated from action name by a colon and cannot contain globs. You can find a list of available scopes and their parameters in the documentation. Each token can have multiple scopes separated by spaces. At least one scope must match the called action in order for access to be granted.

Note that you need an up-to-date version of vpsfree-client to use scopes (>= 0.18.0). Older versions will ask for scopes on standard input, as they’re not familiar with the mechanism.

7 Likes