Integration of Auth0 PHP SDK into Nette framework

tl;dr Auth0 Nette Extension has been open–sourced by Some move and made available at packagist composer repository.

Nette is a popular PHP framework developed in Czechia. It even appeared as the 3rd most popular framework in 2015 annual survey by SitePoint.

Auth0 is an identity management service allowing developers and companies to offset the user management and security aspects to an existing solution. In also integrates existing solution like social buttons or Microsoft Active Directory to unify the signup/signin process and provides developers with dozens of ready-made SDKs, libraries and integrations.

At Some move, we use Auth0 to connect users from our Microsoft Office365 subscription with WordPress sites user base as well as our own-developed travel planning website TravelSupport. Regardless of website or software, we always sign in using the @somemove.cz credentials. Since our TravelSupport website is written in PHP using Nette framework, we used Auth0 PHP to implement the authorization code grant flow. You can learn the basics of Nette&Auth0 in the tutorial.

But the extension code goes further.

Extension with defaults — Without the extension, the Auth0\SDK\Auth0 class needs to be listed in services as the tutorial shows. Nette and Auth0 does not integrate smoothly – both touch the session and in order to make it work in Nette ecosystem, the best option is to disable persistence of all data received as well as state handler.

The 1.0 version of the extension does this respective job, but also provides all optional parameters with defaults. Instead of declaring a new service, a new section auth0is expected in config file where you declare just the client credentials and other required details.

auth0:
	'domain' : 'your.auth0.com'
	'audience' : 'https://audience.url'
	'scope' : 'openid profile offline_access'
	'client_id' : '{CLIENT_ID}'
	'client_secret' : '{CLIENT_SECRET}'
	'redirect_uri' : 'https://your.callback'

This is also place where you can override the defaults if you like.

Nette Session Store — We wanted to store the tokens as well as user information in the session. Auth0 SDK provides an interface to implement a custom session store, so we create one. It is populated by a Session object from Nette Dependency Injection and uses that object to store key-value pairs received by the authorization flow. The login in the store also works around the starting of a session where Auth0 executes the code sooner than Nette starts to initialize its Session object.

The 1.1 version of the extension initializes the session store by default and injects it into the Auth0 client. In order to disable the persistence, you may always declare the store = FALSE, or set FALSE for respective key stored in the store.

What next?

To fully cover the features of the Auth0 client in Nette, we still miss a Nette implementation for SessionStateHandler. That is a last part currently disabled as it touches the PHP session directly.

For a more ready-made implementation, we could pack an Auth0 Nette Authenticator so the developers do not need to repeat the code. The same goes with a presenter initiating the login process.

When Getting Started example for WebTask fails

I have been playing with WebTask from Auth0 a bit. Interested in, I followed the first example to run a basic “Hello, World!” script. When execute, webtasks responded with compilation failed error like:

{
  "code": 400,
  "message": "Compilation failed: Unexpected token ILLEGAL",
  "error": "Unexpected token ILLEGAL",
  "stack": "SyntaxError: Unexpected token ILLEGAL\n    at Object.exports.runInThisContext (vm.js:53:16)\n    at WebtaskModule.compileWebtask (/data/sandbox/lib/module.js:95:32)\n    at defaultJavascriptCompiler (/data/sandbox/lib/compiler.js:134:30)\n    at defaultCompiler (/data/sandbox/lib/compiler.js:143:16)\n    at /data/sandbox/lib/compiler.js:240:17\n    at /data/sandbox/node_modules/async/dist/async.js:3816:26\n    at replenish (/data/sandbox/node_modules/async/dist/async.js:982:17)\n    at iterateeCallback (/data/sandbox/node_modules/async/dist/async.js:967:17)\n    at /data/sandbox/node_modules/async/dist/async.js:944:16\n    at /data/sandbox/node_modules/async/dist/async.js:3821:13"
}

I searched a bit what could be the root cause and did not find anything. If you face the very same problem, check your .js file encoding. Mine was encoded to Unicode with BOM character and internal node.js does not like. When I saved it with UTF-8, the webtask started to greet everyone.

IntelliJ Idea, QWERTZ klávesnice, AltGr a hranaté závorky

Neptejte se mě proč, ale používám českou QWERTZ klávesnici, i při psaní zdrojových kódů. A ve všech produktech JetBrains do jednoho narážím na stejný problém – některé klávesové zkratky obsahující pravý AltGr nefungují. Vyvolá se zcela jiná nepochopitelná akce. Např. Scala plugin při kombinaci AltGr + F pro znak levé hranaté závorky ([) vypíše chybu “Selected block should be presented as expression„. Řešení jsem už hledal pro PhpStorm, Android SDK a protože jsem ho dnes opět hledal pro IntelliJ Idea, je na čase si ho poznamenat.

V adresáři produktu najděte soubor bin/idea.properties a doplňte následující nastavení:

actionSystem.force.alt.gr=true

Řešení našel už Jiří Pavlíček, takže díky za jeho článek!

Edit ex post

Při každé aktualizaci JetBrains produktů dochází k přepsání této změny a je nutné soubor editovat znovu. Existuje trvalejší řešení.

V USER_HOME existuje adresář s nastavením každého z produktů (např. .IntelliJIdea2017.1, .PhpStorm2017.1, apod.). Pokud v něm vytvoříte soubor idea.properties a vložíte do něj uvedené nastavení, instalace aktualizace jej převezme.

Edit ex post 2

Postup popsaný v minulé aktualizaci přestal v PhpStorm 2017.2 fungovat. Řešení je přesunout soubor idea.properties do podsložky config v adresáři USER_HOME/.PhpStormXXX. Po restartu editoru začne vše fungovat, jak má. Pokud stále některé znaky nemůžete napsat správně, zrušte klávesovou zkratku Extract Field v menu File > Settings > Keymap.

První nové Sesame RDF po sedmi letech

Sesame Framework, jedno z programových rozpraní pro práci s RDF v jazyce Java, se dnes dočkalo první zásadní verze po sedmi letech. Na RDF4J můžete stahovat verzi 4.0, která využívá mnohé z nových funkcí Javy 8 jako lambda výrazy, čtení formou Streamu nebo try-with-resources. Uživatelé Sesame API ocení také změnu výjimek na nekontrolované.

Tvůrci slibují kratší, kompaktnější a čitelnější kód.

Mezitím se nám podobný framework Jena přestěhoval z vývoje HP přes nezávislý open-source pod Apache Foundation. A musím říct, že existují projekty, které si existence Apache Jena ještě nevšimly. Např. ODF Toolkit mě nedávno nutil mít duplicitní závislosti na classpath.

Jak odesílat jménem skupiny v Office 365

Microsoft Exchange server nabízí možnost odesílat e-mailové zprávy jménem skupiny, ve které je uživatel členem. Bohužel, hostovaný Office 365 nedovoluje distribuční skupinu patřičně nastavit přes webové rozhraní. Na řadu tak opět přichází PowerShell, stejně jako v předchozím případě při vypínání expirace hesla.

Potřebujete PowerShell spuštěný jako administrátor. Pokud se připojujete na Office 365 poprvé, zkontrolujte si také nastavení politiky spouštění příkazů a případně ji nastavte následujícím způsobem.

PS C:\windows\system32> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

Execution Policy Change
The execution policy helps protect you from scripts that you do not trust. Changing the execution policy might expose
you to the security risks described in the about_Execution_Policies help topic at
http://go.microsoft.com/fwlink/?LinkID=135170. Do you want to change the execution policy?
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): Y

Připojte se na server s vaším administrátorským účtem.

PS C:\windows\system32> $cred = Get-Credential
PS C:\windows\system32> $s = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/po
wershell -Credential $cred -Authentication Basic –AllowRedirection
PS C:\windows\system32> $importresults = Import-PSSession $s

Nyní přidejte právo odesílat jménem skupiny každému uživateli.

PS C:\windows\system32> Add-RecipientPermission nejakaskupina@priklad.cz -AccessRights SendAs -Trustee nejaky.uzivatel@priklad.cz

Confirm
Are you sure you want to perform this action?
Adding recipient permission 'SendAs' for user or group 'nejaky.uzivatel@priklad.cz' on recipient
'nejakaskupina@priklad.cz'.
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [?] Help (default is "Y"):

Identity                Trustee                 AccessControlType       AccessRights            Inherited
--------                -------                 -----------------       ------------            ---------
Nejaka Skupina          nejaky.uzivatel          Allow                   {SendAs}                False

Může se stát, že Outlook 2013 si nestihne hned poté aktualizovat údaje ze serveru. Nastavení dané skupiny lze synchronizovat spolu s globálním adresářem, tj. zvolíme účet, na záložce Send/Receive zvolit Send/Receive Groups, pak položku Download Address Books… a potvrdíme.

Při odesílání rozbalíme roletku From (Od), Other E-mail Address…, From… a najdeme příslušnou skupinu.

Surface Pro 3, aneb Zbavil jsem se tří palců úhlopříčky

Tři roky mi sloužil MacBook Pro jako hlavní pracovní nástroj. Vytrpěl si toho se mnou hodně a dával mi to v poslední době znát. Mj. se dožadoval třetí výměny mrtvé síťové karty pro Wi-Fi, která vždy po půlroce od opravy záhadně odešla. Hledal jsem jako náhradu něco více mobilního a Juraj mne hodně nahlodal Surface Pro 2, který si pořídil na jaře. Řeknete si tablet, ale po připojení externí klávesnice, myši a monitoru nepoznáte rozdíl od klasického počítače.

Ačkoliv Microsoft představil nástupce, Surface Pro 3, už před čtvrtrokem, na evropském trhu se začal prodávat až 28. srpna. Nechápu to, ale počkal jsem si. Díky předobjednávce dorazil zdarma z německého Microsoft Store hned v první den prodeje a s Aristem jsme rozbalovali.

Mám tak k dispozici tablet s úhlopříčkou 12”, 8 GB RAM a 256 GB SSD, na kterém jsem schopný klidně programovat, editovat fotografie, hrát plnohodnotné hry nebo třeba nainstalovat JavaEE aplikaci.

Za týden používání jsem zatím bojoval s jedinou věcí – HD rozlišením. Jednak Windows 8.1 ne úplně dobře zvládají připojení/odpojení externího monitoru a následné přepočítání rozlišení obrazu. Druhá věc je, že většina desktopových aplikací ani nepočítá s tím, že by je někdo zobrazil na 2200px rozlišení, které je zobrazené na pouhé 12” úhlopříčce. 125% zobrazení prvků v systému pak někteřé aplikace rozhodí stejně spolehlivě. Asi nejhorší je otevřít vzdálenou plochu na Windows Server a nemít po ruce lupu. V tom byla adopce HD rozlišení na Mac OS X jednodušší. Všichni chtěli na retině vypadat dobře. U Windows je to ani nenapadlo.

Nicméně váhá a rychlost startu systému všechno vynahrazuje. SP3 je ideální na takové to domácí… cokoliv chcete na home office dělat. :)

Twitter Cards a WordPress plugin Jetpack

Plugin Jetpack doplňuje do CMS WordPress funkce, které dostanete na cloudovém řešení WordPress.com, mj. statistiky. Nedávno jsem na firemním webu Some move potřeboval nastavit metadata pro Twitter Card, o kterou jsme u Twitteru zažádali, ale plugin v defaultní instalaci vytváří chybné metainformace odkazující právě na profil Jetpacku. Nastavení znamenalo úpravu tématu a hledání na fórech.

Aby Twitter Card na webové stránce fungoval, musí obsahovat hlavička následující meta tagy.

<meta name="twitter:card" content="summary">
<meta name="twitter:domain" content="somemove.cz">
<meta name="twitter:site" content="@Somemove">
<meta name="twitter:creator" content="@Somemove">
<meta name="twitter:image:src" content="http://somemove.cz/wp-content/uploads/2013/09/somemove_logo.png">
<meta name="twitter:description" content="Some move, some don't... Sociální sítě, zákaznická péče a kvalita služeb v dopravě.">
<meta name="twitter:title" content="Some move">
<meta name="twitter:url" content="http://somemove.cz/">

Pokud vás napadá nejjednodušší řešení otevřít header.php příslušného tématu webu a tyto HTML tagy tam vložit, nebude to fungovat. Jetpack totiž kromě toho vloží duplicitní značky obsahující odkaz na profil @Jetpack.

Namísto toho musíte použít functions.php šablony a donutit Jetpack, aby pro získání metadat použil funkci, která defaultní hodnoty přemapuje na ty správné.

function tweakjp_custom_twitter_site( $og_tags ) {
  $og_tags['twitter:site'] = '@Somemove';
  $og_tags['twitter:card'] = 'summary';
  $og_tags['twitter:title'] = 'Some move';
  $og_tags['twitter:description'] = 'Some move, some don't... Sociální sítě, zákaznická péče a kvalita služeb v dopravě.';
  $og_tags['twitter:creator'] = '@Somemove';
  $og_tags['twitter:domain'] = 'somemove.cz';
  $og_tags['twitter:image:src'] = 'http://somemove.cz/wp-content/uploads/2013/09/somemove_logo.png';
  return $og_tags;
}

add_filter( 'jetpack_open_graph_tags', 'tweakjp_custom_twitter_site', 11 );

Twitter Cards jsou tzv. rich snippet, který se ukazuje pod Twitter příspěvky daného profilu a odkazuje na zadaný web spolu s uvedením dalších rozšiřujících informací. Po schválení by měla karta vypadat následovně.

Test Some move Twitter Card (summary)

K vytvoření wifi hotspotu stačí notebook a Windows

Důvodů, proč můžete potřebovat Wi-Fi hotspot a nemít možnost použití klasický router, může být nespočet. Pokud máte notebook s Windows, který je připojený přes ethernetový kabel, nebo i Wi-Fi a chcete z vytvořit další hotspot, operační systém na to už obsahuje potřebnou funkci – hosted network.

Pokud chcete sdílet připojení notebooku, napřed musíte nastavit, že další zařízení se mohou přes počítač připojovat.

  1. Stiskněte Win + R, napiště ncpa.cpl a stiskněte Enter
  2. Otevřete Vlastnosti/Properties aktuálního připojení, záložku Sdílení/Sharing
  3. Zaškrtněte Allow other network users to connect through this computer’s internet connection
  4. Potvrďte následný dotaz systému.

Samotnou hostovanou síť vytvoříme přes Příkazou řádku běžící jako Administrátor

  1. Stiskněte Win + X, zvolte Command Prompt (Admin)
  2. Zadejte příkaz netsh wlan set hostednetwork mode=allow ssid=JMENO key=HESLO a stiskněte Enter
  3. Zapněte síť pomocí příkazu netsh wlan start hostednetwork
  4. Zobrazte síť pomocí příkazu netsh wlan show hostednetwork

Síť můžete kdykoliv vypnout pomocí příkazu netsh wlan stop hostednetwork.

Jak zrušit expiraci hesla v Office 365

Už před časem jsem vyměnil Google Apps pro hostování e-mailu za Microsoft Office 365. Mohla za to politika, kterou nastavil Google pro účty zdarma. (Reklama) Zvolil jsem tarif Office 365 Small Business Premium, kde mám 25 GB pro své data včetně pošty a 5 licencí MS Office 2013. (Konec reklamy) Nemile mě ale překvapilo upozornění, že moje heslo expiruje. U firemních Exchange účtů jsem si na to zvyknul, ale zde jsem snad “správce domény” já! Pokud stejně jako já hledáte tlačítko, kterým to vypnete, ve webovém rozhraní ho nenajdete. Fóra Microsoftu nakonec poskytla takové DYI (udělej si sám) řešení s pomocí Windows PowerShell cmdlet-ů.

PS C:Windowssystem32> $cred = get-credential
PS C:Windowssystem32> connect-msolservice -credential $cred
PS C:Windowssystem32> get-msoluser

UserPrincipalName       DisplayName        isLicensed
-----------------       -----------        ----------
me@jspetrak.name        Josef Petrák       True

PS C:Windowssystem32> Get-MSOLUser | Select UserPrincipalName, PasswordNeverExpires

UserPrincipalName       PasswordNeverExpires
-----------------       --------------------
me@jspetrak.name

PS C:Windowssystem32> set-msoluser -userprincipalname me@jspetrak.name -passwordneverexpire $true
PS C:Windowssystem32> Get-MSOLUser | Select UserPrincipalName, PasswordNeverExpires

UserPrincipalName       PasswordNeverExpires
-----------------       --------------------
me@jspetrak.name        True

PS C:Windowssystem32> remove-pssession $Session

Ve zkratce: get-credential vyvolá dialog pro zadání přihlašovacích údajů, connect-msolservice vás připojí na vzdálený Exchange server se zadanými údaji, get-msoluser vypíše údaje o účtech, set-msoluser uživatelské účty modifikuje a remove-psession vás odhlásí.

Konferenční workshop DámePráci.eu

Pozvánka — Projekt Párování pracovních míst s nezaměstnanými skrze sémantická data, tedy DámePráci.eu, pořádá 5. a 6. září konferenci Semantic Web in Business. Pokud vás zajímají praktické informace o sémantickém web a zejména Linked Data, určitě se neváhejte podívat. Já budu ve čtvrtek dopoledne jeden z lidí, kdo povede workshop Advertising Through Structured Data on the Web. Bude se jednat o ukázky práce s HTML/XHTML a RDFa, aby vaše webové stránky byly informačně bohaté nejen pro lidi, ale i pro stroje.

Podobné téma jsme před časem prezentovali v Národní technické knihovně na workhopu Google je nejlepší kuchař.