digraph G { user[label="Resource\nOwner"]; exchange[label="Client"]; messenger[label="Messaging service"]; challenger [label="Challenger HTTPD"]; helper [label="Helper script"]; DBMS [label="Postgres\nDBMS"]; subgraph cluster_0 { challenger; helper; DBMS; label="Challenger OAuth 2.0 service"; } user->exchange[label="0. request that\nrequires\nvalidated\naddress"]; exchange->challenger[label="1. authorize\naddress\nvalidation"]; user->challenger[label="2. Claimed\naddress"]; challenger->DBMS; DBMS->challenger; challenger->helper[label="3. TAN code\n+ address"]; helper->messenger[label="4. TAN code\n+ address"]; messenger->user[label="5. TAN code"]; user->challenger[label="6. TAN\ncode"]; user->exchange[label="7. Token"]; exchange->challenger[label="8. Get\nvalidated\naddress"]; }