<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>Thema "Betreff: Rest Api ohne Phototan-App nutzen können" in Konto, Depot &amp; Karte</title>
    <link>https://community.comdirect.de/t5/konto-depot-karte/rest-api-ohne-phototan-app-nutzen-k%C3%B6nnen/m-p/257179#M38337</link>
    <description>&lt;P&gt;Ich bin jetzt kein Experte in PSD2-Angelegenheiten, aber ich vermute, dass das im Sinne der "starken Kundenauthentifizierung" nicht gehen wird, da 2 Faktoren gefordert werden und der API Key nur einer wäre.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Vielleicht weiß&amp;nbsp;&lt;a href="https://community.comdirect.de/t5/user/viewprofilepage/user-id/87"&gt;@SMT_Service&lt;/a&gt;&amp;nbsp;da ja mehr &lt;span class="lia-unicode-emoji" title=":leicht_lächelndes_Gesicht:"&gt;🙂&lt;/span&gt;&lt;/P&gt;</description>
    <pubDate>Tue, 20 Dec 2022 18:29:02 GMT</pubDate>
    <dc:creator>Tarulia</dc:creator>
    <dc:date>2022-12-20T18:29:02Z</dc:date>
    <item>
      <title>Rest Api ohne Phototan-App nutzen können</title>
      <link>https://community.comdirect.de/t5/konto-depot-karte/rest-api-ohne-phototan-app-nutzen-k%C3%B6nnen/m-p/256891#M38292</link>
      <description>&lt;P&gt;Hallo zusammen:)&lt;BR /&gt;&lt;BR /&gt;Ich habe mir eine kleine App für meine persöhnliche Zwecken geplannt.&lt;BR /&gt;Die App wollte ich über ein Cron-Job in meinem Server laufen lassen, die extrahierte Daten wollte ich in einem MySql Datenbank speichern.&lt;BR /&gt;&lt;BR /&gt;Ich bin die Steps der Api-Doku durchgegangen und da ist mir aufgefallen, dass ich zwichen Step 2.4 und Step 2.5 auf meinem Handy Photo-Tan App aufmachen soll und da "Login zum personlichen Bereich" einmal bestätigen muss.&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;Somit wurde meine App über ein Cron Job natürlich nie lauffähig sein.&lt;BR /&gt;&lt;BR /&gt;Was ich so grob erreichen möchte wäre aktueller Kontostand und alle Umsatze (Ein- und Ausgaben) des aktuellen Tags, diese Infos hätte ich gerne mit meinem Tech-Stack Symfony 6.2 (PHP 8.1) und MariaDB Mysql umsetzen wollen.&lt;BR /&gt;&lt;BR /&gt;Kann mar mir bitte irgendwas dazu empfehlen und bzw genau sagen ob ich irgendwas übersehe und es doch möglich ohne Phototan App ist?&lt;BR /&gt;&lt;BR /&gt;Viele Grüße&lt;BR /&gt;Alex&lt;/P&gt;</description>
      <pubDate>Sat, 17 Dec 2022 23:43:22 GMT</pubDate>
      <guid>https://community.comdirect.de/t5/konto-depot-karte/rest-api-ohne-phototan-app-nutzen-k%C3%B6nnen/m-p/256891#M38292</guid>
      <dc:creator>truefalse10</dc:creator>
      <dc:date>2022-12-17T23:43:22Z</dc:date>
    </item>
    <item>
      <title>Betreff: Rest Api ohne Phototan-App nutzen können</title>
      <link>https://community.comdirect.de/t5/konto-depot-karte/rest-api-ohne-phototan-app-nutzen-k%C3%B6nnen/m-p/257179#M38337</link>
      <description>&lt;P&gt;Ich bin jetzt kein Experte in PSD2-Angelegenheiten, aber ich vermute, dass das im Sinne der "starken Kundenauthentifizierung" nicht gehen wird, da 2 Faktoren gefordert werden und der API Key nur einer wäre.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Vielleicht weiß&amp;nbsp;&lt;a href="https://community.comdirect.de/t5/user/viewprofilepage/user-id/87"&gt;@SMT_Service&lt;/a&gt;&amp;nbsp;da ja mehr &lt;span class="lia-unicode-emoji" title=":leicht_lächelndes_Gesicht:"&gt;🙂&lt;/span&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 20 Dec 2022 18:29:02 GMT</pubDate>
      <guid>https://community.comdirect.de/t5/konto-depot-karte/rest-api-ohne-phototan-app-nutzen-k%C3%B6nnen/m-p/257179#M38337</guid>
      <dc:creator>Tarulia</dc:creator>
      <dc:date>2022-12-20T18:29:02Z</dc:date>
    </item>
    <item>
      <title>Betreff: Rest Api ohne Phototan-App nutzen können</title>
      <link>https://community.comdirect.de/t5/konto-depot-karte/rest-api-ohne-phototan-app-nutzen-k%C3%B6nnen/m-p/298460#M50403</link>
      <description>&lt;P&gt;Hey Tarulia:)&lt;BR /&gt;Ich habs tatsächlich hinbekommen, wie man das alles umsetzen kann (PHP und MySql):&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;DIV&gt;&lt;PRE&gt;&lt;SPAN&gt;&amp;lt;?php&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;declare&lt;/SPAN&gt;(&lt;SPAN&gt;strict_types&lt;/SPAN&gt;=&lt;SPAN&gt;1&lt;/SPAN&gt;);&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;namespace &lt;/SPAN&gt;&lt;SPAN&gt;App&lt;/SPAN&gt;\&lt;SPAN&gt;Service&lt;/SPAN&gt;;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;use &lt;/SPAN&gt;&lt;SPAN&gt;App&lt;/SPAN&gt;\&lt;SPAN&gt;Entity&lt;/SPAN&gt;\&lt;SPAN&gt;AccessResponse&lt;/SPAN&gt;;&lt;BR /&gt;&lt;SPAN&gt;use &lt;/SPAN&gt;&lt;SPAN&gt;App&lt;/SPAN&gt;\&lt;SPAN&gt;Entity&lt;/SPAN&gt;\&lt;SPAN&gt;User&lt;/SPAN&gt;;&lt;BR /&gt;&lt;SPAN&gt;use &lt;/SPAN&gt;&lt;SPAN&gt;App&lt;/SPAN&gt;\&lt;SPAN&gt;Repository&lt;/SPAN&gt;\&lt;SPAN&gt;AccessResponseRepository&lt;/SPAN&gt;;&lt;BR /&gt;&lt;SPAN&gt;use &lt;/SPAN&gt;&lt;SPAN&gt;App&lt;/SPAN&gt;\&lt;SPAN&gt;Repository&lt;/SPAN&gt;\&lt;SPAN&gt;UserRepository&lt;/SPAN&gt;;&lt;BR /&gt;&lt;SPAN&gt;use &lt;/SPAN&gt;&lt;SPAN&gt;GuzzleHttp&lt;/SPAN&gt;\&lt;SPAN&gt;Client&lt;/SPAN&gt;;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;class &lt;/SPAN&gt;&lt;SPAN&gt;RefreshTokenService&lt;BR /&gt;&lt;/SPAN&gt;{&lt;BR /&gt;    &lt;SPAN&gt;public const &lt;/SPAN&gt;&lt;SPAN&gt;API_URL &lt;/SPAN&gt;= &lt;SPAN&gt;'https://api.comdirect.de'&lt;/SPAN&gt;;&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;private &lt;/SPAN&gt;&lt;SPAN&gt;Client &lt;/SPAN&gt;&lt;SPAN&gt;$client&lt;/SPAN&gt;;&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;public function &lt;/SPAN&gt;&lt;SPAN&gt;__construct&lt;/SPAN&gt;(&lt;BR /&gt;        &lt;SPAN&gt;private readonly &lt;/SPAN&gt;&lt;SPAN&gt;AccessResponseRepository &lt;/SPAN&gt;&lt;SPAN&gt;$accessResponseRepository&lt;/SPAN&gt;,&lt;BR /&gt;        &lt;SPAN&gt;private readonly &lt;/SPAN&gt;&lt;SPAN&gt;UserRepository           &lt;/SPAN&gt;&lt;SPAN&gt;$userRepository&lt;/SPAN&gt;,&lt;BR /&gt;    )&lt;BR /&gt;    {&lt;BR /&gt;        &lt;SPAN&gt;$this&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;client &lt;/SPAN&gt;= &lt;SPAN&gt;new &lt;/SPAN&gt;&lt;SPAN&gt;Client&lt;/SPAN&gt;();&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;public function &lt;/SPAN&gt;&lt;SPAN&gt;generateAccessToken&lt;/SPAN&gt;(): &lt;SPAN&gt;void&lt;BR /&gt;&lt;/SPAN&gt;    {&lt;BR /&gt;        &lt;SPAN&gt;$sessionId &lt;/SPAN&gt;= &lt;SPAN&gt;$this&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;generateSessionId&lt;/SPAN&gt;();&lt;BR /&gt;        &lt;SPAN&gt;$requestId &lt;/SPAN&gt;= &lt;SPAN&gt;$this&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;generateRequestId&lt;/SPAN&gt;();&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;$users &lt;/SPAN&gt;= &lt;SPAN&gt;$this&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;userRepository&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;findAll&lt;/SPAN&gt;();&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;$accessResponses &lt;/SPAN&gt;= &lt;SPAN&gt;$this&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;initAccessAndRefreshTokens&lt;/SPAN&gt;(&lt;SPAN&gt;$users&lt;/SPAN&gt;);&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;$sessionUuids &lt;/SPAN&gt;= &lt;SPAN&gt;$this&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getSessionUuid&lt;/SPAN&gt;(&lt;BR /&gt;            &lt;SPAN&gt;$users&lt;/SPAN&gt;,&lt;BR /&gt;            &lt;SPAN&gt;$accessResponses&lt;/SPAN&gt;,&lt;BR /&gt;            &lt;SPAN&gt;$sessionId&lt;/SPAN&gt;,&lt;BR /&gt;            &lt;SPAN&gt;$requestId&lt;BR /&gt;&lt;/SPAN&gt;        );&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;$tanIds &lt;/SPAN&gt;= &lt;SPAN&gt;$this&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;activateSession&lt;/SPAN&gt;(&lt;BR /&gt;            &lt;SPAN&gt;$users&lt;/SPAN&gt;,&lt;BR /&gt;            &lt;SPAN&gt;$accessResponses&lt;/SPAN&gt;,&lt;BR /&gt;            &lt;SPAN&gt;$sessionUuids&lt;/SPAN&gt;,&lt;BR /&gt;            &lt;SPAN&gt;$sessionId&lt;/SPAN&gt;,&lt;BR /&gt;            &lt;SPAN&gt;$requestId&lt;/SPAN&gt;,&lt;BR /&gt;        );&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;$this&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;activateTans&lt;/SPAN&gt;(&lt;BR /&gt;            &lt;SPAN&gt;$users&lt;/SPAN&gt;,&lt;BR /&gt;            &lt;SPAN&gt;$accessResponses&lt;/SPAN&gt;,&lt;BR /&gt;            &lt;SPAN&gt;$sessionId&lt;/SPAN&gt;,&lt;BR /&gt;            &lt;SPAN&gt;$sessionUuids&lt;/SPAN&gt;,&lt;BR /&gt;            &lt;SPAN&gt;$requestId&lt;/SPAN&gt;,&lt;BR /&gt;            &lt;SPAN&gt;$tanIds&lt;BR /&gt;&lt;/SPAN&gt;        );&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;$this&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getFinalAccessTokens&lt;/SPAN&gt;(&lt;BR /&gt;            &lt;SPAN&gt;$users&lt;/SPAN&gt;,&lt;BR /&gt;            &lt;SPAN&gt;$accessResponses&lt;/SPAN&gt;,&lt;BR /&gt;            &lt;SPAN&gt;$sessionId&lt;/SPAN&gt;,&lt;BR /&gt;            &lt;SPAN&gt;$requestId&lt;/SPAN&gt;,&lt;BR /&gt;        );&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;/**&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;     * @param &lt;/SPAN&gt;&lt;SPAN&gt;User[] &lt;/SPAN&gt;&lt;SPAN&gt;$users&lt;BR /&gt;&lt;/SPAN&gt;     &lt;SPAN&gt;* @return &lt;/SPAN&gt;&lt;SPAN&gt;AccessResponse[]&lt;BR /&gt;&lt;/SPAN&gt;     &lt;SPAN&gt;*/&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;private function &lt;/SPAN&gt;&lt;SPAN&gt;initAccessAndRefreshTokens&lt;/SPAN&gt;(&lt;SPAN&gt;array &lt;/SPAN&gt;&lt;SPAN&gt;$users&lt;/SPAN&gt;&lt;span class="lia-unicode-emoji" title=":enttäuschtes_Gesicht:"&gt;😞&lt;/span&gt; &lt;SPAN&gt;array&lt;BR /&gt;&lt;/SPAN&gt;    {&lt;BR /&gt;        &lt;SPAN&gt;$accessReponses &lt;/SPAN&gt;= [];&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;foreach &lt;/SPAN&gt;(&lt;SPAN&gt;$users &lt;/SPAN&gt;&lt;SPAN&gt;as &lt;/SPAN&gt;&lt;SPAN&gt;$user&lt;/SPAN&gt;) {&lt;BR /&gt;            &lt;SPAN&gt;$response &lt;/SPAN&gt;= &lt;SPAN&gt;$this&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;client&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;post&lt;/SPAN&gt;(&lt;BR /&gt;                &lt;SPAN&gt;self&lt;/SPAN&gt;::&lt;SPAN&gt;API_URL &lt;/SPAN&gt;. &lt;SPAN&gt;'/oauth/token'&lt;/SPAN&gt;,&lt;BR /&gt;                [&lt;BR /&gt;                    &lt;SPAN&gt;'headers' &lt;/SPAN&gt;=&amp;gt; [&lt;BR /&gt;                        &lt;SPAN&gt;'Accept' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;'application/json'&lt;/SPAN&gt;,&lt;BR /&gt;                        &lt;SPAN&gt;'Content-Type' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;'application/x-www-form-urlencoded'&lt;BR /&gt;&lt;/SPAN&gt;                    ],&lt;BR /&gt;                    &lt;SPAN&gt;'form_params' &lt;/SPAN&gt;=&amp;gt; [&lt;BR /&gt;                        &lt;SPAN&gt;'client_id' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;$user&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getComdirectApiKey&lt;/SPAN&gt;(),&lt;BR /&gt;                        &lt;SPAN&gt;'client_secret' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;$user&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getComdirectApiSecret&lt;/SPAN&gt;(),&lt;BR /&gt;                        &lt;SPAN&gt;'username' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;$user&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getComdirectUsername&lt;/SPAN&gt;(),&lt;BR /&gt;                        &lt;SPAN&gt;'password' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;$user&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getComdirectPassword&lt;/SPAN&gt;(),&lt;BR /&gt;                        &lt;SPAN&gt;'grant_type' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;'password'&lt;/SPAN&gt;,&lt;BR /&gt;                    ]&lt;BR /&gt;                ]&lt;BR /&gt;            );&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;/**&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             * @var &lt;/SPAN&gt;&lt;SPAN&gt;array{&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             *     access_token: string,&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             *     refresh_token: string,&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             * } &lt;/SPAN&gt;&lt;SPAN&gt;$responseBody&lt;BR /&gt;&lt;/SPAN&gt;             &lt;SPAN&gt;*/&lt;BR /&gt;&lt;/SPAN&gt;            &lt;SPAN&gt;$responseBody &lt;/SPAN&gt;= &lt;SPAN&gt;json_decode&lt;/SPAN&gt;(&lt;SPAN&gt;$response&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getBody&lt;/SPAN&gt;()-&amp;gt;&lt;SPAN&gt;getContents&lt;/SPAN&gt;(), &lt;SPAN&gt;true&lt;/SPAN&gt;);&lt;BR /&gt;            &lt;SPAN&gt;$accessToken &lt;/SPAN&gt;= &lt;SPAN&gt;$responseBody&lt;/SPAN&gt;[&lt;SPAN&gt;'access_token'&lt;/SPAN&gt;];&lt;BR /&gt;            &lt;SPAN&gt;$refreshToken &lt;/SPAN&gt;= &lt;SPAN&gt;$responseBody&lt;/SPAN&gt;[&lt;SPAN&gt;'refresh_token'&lt;/SPAN&gt;];&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;$accessResponse &lt;/SPAN&gt;= (&lt;SPAN&gt;new &lt;/SPAN&gt;&lt;SPAN&gt;AccessResponse&lt;/SPAN&gt;())&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setAccessToken&lt;/SPAN&gt;(&lt;SPAN&gt;$accessToken&lt;/SPAN&gt;)&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setRefreshToken&lt;/SPAN&gt;(&lt;SPAN&gt;$refreshToken&lt;/SPAN&gt;)&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setUser&lt;/SPAN&gt;(&lt;SPAN&gt;$user&lt;/SPAN&gt;);&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;$this&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;accessResponseRepository&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;save&lt;/SPAN&gt;(&lt;SPAN&gt;$accessResponse&lt;/SPAN&gt;);&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;$accessReponses&lt;/SPAN&gt;[&lt;SPAN&gt;$user&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getId&lt;/SPAN&gt;()] = &lt;SPAN&gt;$accessResponse&lt;/SPAN&gt;;&lt;BR /&gt;        }&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;return &lt;/SPAN&gt;&lt;SPAN&gt;$accessReponses&lt;/SPAN&gt;;&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;/**&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;     * @param &lt;/SPAN&gt;&lt;SPAN&gt;User[] &lt;/SPAN&gt;&lt;SPAN&gt;$users&lt;BR /&gt;&lt;/SPAN&gt;     &lt;SPAN&gt;* @param &lt;/SPAN&gt;&lt;SPAN&gt;AccessResponse[] &lt;/SPAN&gt;&lt;SPAN&gt;$accessResponses&lt;BR /&gt;&lt;/SPAN&gt;     &lt;SPAN&gt;* @return &lt;/SPAN&gt;&lt;SPAN&gt;string[]&lt;BR /&gt;&lt;/SPAN&gt;     &lt;SPAN&gt;*/&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;private function &lt;/SPAN&gt;&lt;SPAN&gt;getSessionUuid&lt;/SPAN&gt;(&lt;BR /&gt;        &lt;SPAN&gt;array  &lt;/SPAN&gt;&lt;SPAN&gt;$users&lt;/SPAN&gt;,&lt;BR /&gt;        &lt;SPAN&gt;array  &lt;/SPAN&gt;&lt;SPAN&gt;$accessResponses&lt;/SPAN&gt;,&lt;BR /&gt;        &lt;SPAN&gt;string &lt;/SPAN&gt;&lt;SPAN&gt;$sessionId&lt;/SPAN&gt;,&lt;BR /&gt;        &lt;SPAN&gt;string &lt;/SPAN&gt;&lt;SPAN&gt;$requestId&lt;/SPAN&gt;,&lt;BR /&gt;    &lt;span class="lia-unicode-emoji" title=":enttäuschtes_Gesicht:"&gt;😞&lt;/span&gt; &lt;SPAN&gt;array&lt;BR /&gt;&lt;/SPAN&gt;    {&lt;BR /&gt;        &lt;SPAN&gt;$identifiers &lt;/SPAN&gt;= [];&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;foreach &lt;/SPAN&gt;(&lt;SPAN&gt;$users &lt;/SPAN&gt;&lt;SPAN&gt;as &lt;/SPAN&gt;&lt;SPAN&gt;$user&lt;/SPAN&gt;) {&lt;BR /&gt;            &lt;SPAN&gt;$response &lt;/SPAN&gt;= &lt;SPAN&gt;$this&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;client&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;get&lt;/SPAN&gt;(&lt;BR /&gt;                &lt;SPAN&gt;self&lt;/SPAN&gt;::&lt;SPAN&gt;API_URL &lt;/SPAN&gt;. &lt;SPAN&gt;'/api/session/clients/user/v1/sessions'&lt;/SPAN&gt;,&lt;BR /&gt;                [&lt;BR /&gt;                    &lt;SPAN&gt;'headers' &lt;/SPAN&gt;=&amp;gt; [&lt;BR /&gt;                        &lt;SPAN&gt;'Accept' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;'application/json'&lt;/SPAN&gt;,&lt;BR /&gt;                        &lt;SPAN&gt;'Authorization' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;'Bearer ' &lt;/SPAN&gt;. &lt;SPAN&gt;$accessResponses&lt;/SPAN&gt;[&lt;SPAN&gt;$user&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getId&lt;/SPAN&gt;()]-&amp;gt;&lt;SPAN&gt;getAccessToken&lt;/SPAN&gt;(),&lt;BR /&gt;                        &lt;SPAN&gt;'Content-Type' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;'application/json'&lt;/SPAN&gt;,&lt;BR /&gt;                        &lt;SPAN&gt;'x-http-request-info' &lt;/SPAN&gt;=&amp;gt;&lt;BR /&gt;                            &lt;SPAN&gt;sprintf&lt;/SPAN&gt;(&lt;BR /&gt;                                &lt;SPAN&gt;'{"clientRequestId":{"sessionId":"%s","requestId":"%s"}}'&lt;/SPAN&gt;,&lt;BR /&gt;                                &lt;SPAN&gt;$sessionId&lt;/SPAN&gt;,&lt;BR /&gt;                                &lt;SPAN&gt;$requestId&lt;BR /&gt;&lt;/SPAN&gt;                            ),&lt;BR /&gt;                    ]&lt;BR /&gt;                ]&lt;BR /&gt;            );&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;/** @var &lt;/SPAN&gt;&lt;SPAN&gt;mixed[] &lt;/SPAN&gt;&lt;SPAN&gt;$responseData &lt;/SPAN&gt;&lt;SPAN&gt;*/&lt;BR /&gt;&lt;/SPAN&gt;            &lt;SPAN&gt;$responseData &lt;/SPAN&gt;= &lt;SPAN&gt;json_decode&lt;/SPAN&gt;(&lt;SPAN&gt;$response&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getBody&lt;/SPAN&gt;()-&amp;gt;&lt;SPAN&gt;getContents&lt;/SPAN&gt;(), &lt;SPAN&gt;true&lt;/SPAN&gt;);&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;/**&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             * @var &lt;/SPAN&gt;&lt;SPAN&gt;array{&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             *         identifier: string&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             * } &lt;/SPAN&gt;&lt;SPAN&gt;$responseDataFirstElement&lt;BR /&gt;&lt;/SPAN&gt;             &lt;SPAN&gt;*/&lt;BR /&gt;&lt;/SPAN&gt;            &lt;SPAN&gt;$responseDataFirstElement &lt;/SPAN&gt;= &lt;SPAN&gt;reset&lt;/SPAN&gt;(&lt;SPAN&gt;$responseData&lt;/SPAN&gt;);&lt;BR /&gt;            &lt;SPAN&gt;$identifiers&lt;/SPAN&gt;[&lt;SPAN&gt;$user&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getId&lt;/SPAN&gt;()] = &lt;SPAN&gt;$responseDataFirstElement&lt;/SPAN&gt;[&lt;SPAN&gt;'identifier'&lt;/SPAN&gt;];&lt;BR /&gt;        }&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;return &lt;/SPAN&gt;&lt;SPAN&gt;$identifiers&lt;/SPAN&gt;;&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;/**&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;     * @param &lt;/SPAN&gt;&lt;SPAN&gt;User[] &lt;/SPAN&gt;&lt;SPAN&gt;$users&lt;BR /&gt;&lt;/SPAN&gt;     &lt;SPAN&gt;* @param &lt;/SPAN&gt;&lt;SPAN&gt;AccessResponse[] &lt;/SPAN&gt;&lt;SPAN&gt;$accessResponses&lt;BR /&gt;&lt;/SPAN&gt;     &lt;SPAN&gt;* @param &lt;/SPAN&gt;&lt;SPAN&gt;string[] &lt;/SPAN&gt;&lt;SPAN&gt;$sessionUuids&lt;BR /&gt;&lt;/SPAN&gt;     &lt;SPAN&gt;* @return  &lt;/SPAN&gt;&lt;SPAN&gt;string[]&lt;BR /&gt;&lt;/SPAN&gt;     &lt;SPAN&gt;*/&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;private function &lt;/SPAN&gt;&lt;SPAN&gt;activateSession&lt;/SPAN&gt;(&lt;BR /&gt;        &lt;SPAN&gt;array  &lt;/SPAN&gt;&lt;SPAN&gt;$users&lt;/SPAN&gt;,&lt;BR /&gt;        &lt;SPAN&gt;array  &lt;/SPAN&gt;&lt;SPAN&gt;$accessResponses&lt;/SPAN&gt;,&lt;BR /&gt;        &lt;SPAN&gt;array  &lt;/SPAN&gt;&lt;SPAN&gt;$sessionUuids&lt;/SPAN&gt;,&lt;BR /&gt;        &lt;SPAN&gt;string &lt;/SPAN&gt;&lt;SPAN&gt;$sessionId&lt;/SPAN&gt;,&lt;BR /&gt;        &lt;SPAN&gt;string &lt;/SPAN&gt;&lt;SPAN&gt;$requestId&lt;/SPAN&gt;,&lt;BR /&gt;    &lt;span class="lia-unicode-emoji" title=":enttäuschtes_Gesicht:"&gt;😞&lt;/span&gt; &lt;SPAN&gt;array&lt;BR /&gt;&lt;/SPAN&gt;    {&lt;BR /&gt;        &lt;SPAN&gt;$result &lt;/SPAN&gt;= [];&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;foreach &lt;/SPAN&gt;(&lt;SPAN&gt;$users &lt;/SPAN&gt;&lt;SPAN&gt;as &lt;/SPAN&gt;&lt;SPAN&gt;$user&lt;/SPAN&gt;) {&lt;BR /&gt;            &lt;SPAN&gt;$sessionUuid &lt;/SPAN&gt;= &lt;SPAN&gt;$sessionUuids&lt;/SPAN&gt;[&lt;SPAN&gt;$user&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getId&lt;/SPAN&gt;()];&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;$response &lt;/SPAN&gt;= &lt;SPAN&gt;$this&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;client&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;post&lt;/SPAN&gt;(&lt;BR /&gt;                &lt;SPAN&gt;self&lt;/SPAN&gt;::&lt;SPAN&gt;API_URL &lt;/SPAN&gt;. &lt;SPAN&gt;'/api/session/clients/user/v1/sessions/' &lt;/SPAN&gt;. &lt;SPAN&gt;$sessionUuid &lt;/SPAN&gt;. &lt;SPAN&gt;'/validate'&lt;/SPAN&gt;,&lt;BR /&gt;                [&lt;BR /&gt;                    &lt;SPAN&gt;'headers' &lt;/SPAN&gt;=&amp;gt; [&lt;BR /&gt;                        &lt;SPAN&gt;'Accept' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;'application/json'&lt;/SPAN&gt;,&lt;BR /&gt;                        &lt;SPAN&gt;'Authorization' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;'Bearer ' &lt;/SPAN&gt;. &lt;SPAN&gt;$accessResponses&lt;/SPAN&gt;[&lt;SPAN&gt;$user&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getId&lt;/SPAN&gt;()]-&amp;gt;&lt;SPAN&gt;getAccessToken&lt;/SPAN&gt;(),&lt;BR /&gt;                        &lt;SPAN&gt;'Content-Type' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;'application/json'&lt;/SPAN&gt;,&lt;BR /&gt;                        &lt;SPAN&gt;'x-http-request-info' &lt;/SPAN&gt;=&amp;gt;&lt;BR /&gt;                            &lt;SPAN&gt;sprintf&lt;/SPAN&gt;(&lt;BR /&gt;                                &lt;SPAN&gt;'{"clientRequestId":{"sessionId":"%s","requestId":"%s"}}'&lt;/SPAN&gt;, &lt;SPAN&gt;$sessionId&lt;/SPAN&gt;, &lt;SPAN&gt;$requestId&lt;BR /&gt;&lt;/SPAN&gt;                            ),&lt;BR /&gt;                    ],&lt;BR /&gt;                    &lt;SPAN&gt;'json' &lt;/SPAN&gt;=&amp;gt; [&lt;BR /&gt;                        &lt;SPAN&gt;'identifier' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;$sessionUuid&lt;/SPAN&gt;,&lt;BR /&gt;                        &lt;SPAN&gt;'sessionTanActive' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;true&lt;/SPAN&gt;,&lt;BR /&gt;                        &lt;SPAN&gt;'activated2FA' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;true&lt;BR /&gt;&lt;/SPAN&gt;                    ]&lt;BR /&gt;                ]&lt;BR /&gt;            );&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;$authenticationInfo &lt;/SPAN&gt;= &lt;SPAN&gt;$response&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getHeaders&lt;/SPAN&gt;()[&lt;SPAN&gt;'x-once-authentication-info'&lt;/SPAN&gt;];&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;/**&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             * @var &lt;/SPAN&gt;&lt;SPAN&gt;array{&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             *     id: string&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             * } &lt;/SPAN&gt;&lt;SPAN&gt;$responseData&lt;BR /&gt;&lt;/SPAN&gt;             &lt;SPAN&gt;*/&lt;BR /&gt;&lt;/SPAN&gt;            &lt;SPAN&gt;$responseData &lt;/SPAN&gt;= &lt;SPAN&gt;json_decode&lt;/SPAN&gt;(&lt;SPAN&gt;$authenticationInfo&lt;/SPAN&gt;[&lt;SPAN&gt;0&lt;/SPAN&gt;], &lt;SPAN&gt;true&lt;/SPAN&gt;);&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;$result&lt;/SPAN&gt;[&lt;SPAN&gt;$user&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getId&lt;/SPAN&gt;()] = &lt;SPAN&gt;$responseData&lt;/SPAN&gt;[&lt;SPAN&gt;'id'&lt;/SPAN&gt;];&lt;BR /&gt;        }&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;return &lt;/SPAN&gt;&lt;SPAN&gt;$result&lt;/SPAN&gt;;&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;/**&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;     * @param &lt;/SPAN&gt;&lt;SPAN&gt;User[] &lt;/SPAN&gt;&lt;SPAN&gt;$users&lt;BR /&gt;&lt;/SPAN&gt;     &lt;SPAN&gt;* @param &lt;/SPAN&gt;&lt;SPAN&gt;AccessResponse[] &lt;/SPAN&gt;&lt;SPAN&gt;$accessResponses&lt;BR /&gt;&lt;/SPAN&gt;     &lt;SPAN&gt;* @param &lt;/SPAN&gt;&lt;SPAN&gt;string &lt;/SPAN&gt;&lt;SPAN&gt;$sessionId&lt;BR /&gt;&lt;/SPAN&gt;     &lt;SPAN&gt;* @param &lt;/SPAN&gt;&lt;SPAN&gt;string[] &lt;/SPAN&gt;&lt;SPAN&gt;$sessionUuids&lt;BR /&gt;&lt;/SPAN&gt;     &lt;SPAN&gt;* @param &lt;/SPAN&gt;&lt;SPAN&gt;string &lt;/SPAN&gt;&lt;SPAN&gt;$requestId&lt;BR /&gt;&lt;/SPAN&gt;     &lt;SPAN&gt;* @param &lt;/SPAN&gt;&lt;SPAN&gt;string[] &lt;/SPAN&gt;&lt;SPAN&gt;$tanIds&lt;BR /&gt;&lt;/SPAN&gt;     &lt;SPAN&gt;*/&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;private function &lt;/SPAN&gt;&lt;SPAN&gt;activateTans&lt;/SPAN&gt;(&lt;BR /&gt;        &lt;SPAN&gt;array  &lt;/SPAN&gt;&lt;SPAN&gt;$users&lt;/SPAN&gt;,&lt;BR /&gt;        &lt;SPAN&gt;array  &lt;/SPAN&gt;&lt;SPAN&gt;$accessResponses&lt;/SPAN&gt;,&lt;BR /&gt;        &lt;SPAN&gt;string &lt;/SPAN&gt;&lt;SPAN&gt;$sessionId&lt;/SPAN&gt;,&lt;BR /&gt;        &lt;SPAN&gt;array  &lt;/SPAN&gt;&lt;SPAN&gt;$sessionUuids&lt;/SPAN&gt;,&lt;BR /&gt;        &lt;SPAN&gt;string &lt;/SPAN&gt;&lt;SPAN&gt;$requestId&lt;/SPAN&gt;,&lt;BR /&gt;        &lt;SPAN&gt;array  &lt;/SPAN&gt;&lt;SPAN&gt;$tanIds&lt;BR /&gt;&lt;/SPAN&gt;    &lt;span class="lia-unicode-emoji" title=":enttäuschtes_Gesicht:"&gt;😞&lt;/span&gt; &lt;SPAN&gt;void&lt;BR /&gt;&lt;/SPAN&gt;    {&lt;BR /&gt;        &lt;SPAN&gt;sleep&lt;/SPAN&gt;(&lt;SPAN&gt;10&lt;/SPAN&gt;); &lt;SPAN&gt;//pause to activate photo tan app&lt;BR /&gt;&lt;/SPAN&gt;        &lt;SPAN&gt;foreach &lt;/SPAN&gt;(&lt;SPAN&gt;$users &lt;/SPAN&gt;&lt;SPAN&gt;as &lt;/SPAN&gt;&lt;SPAN&gt;$user&lt;/SPAN&gt;) {&lt;BR /&gt;            &lt;SPAN&gt;$this&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;client&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;patch&lt;/SPAN&gt;(&lt;BR /&gt;                &lt;SPAN&gt;self&lt;/SPAN&gt;::&lt;SPAN&gt;API_URL &lt;/SPAN&gt;. &lt;SPAN&gt;'/api/session/clients/user/v1/sessions/' &lt;/SPAN&gt;. &lt;SPAN&gt;$sessionUuids&lt;/SPAN&gt;[&lt;SPAN&gt;$user&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getId&lt;/SPAN&gt;()],&lt;BR /&gt;                [&lt;BR /&gt;                    &lt;SPAN&gt;'headers' &lt;/SPAN&gt;=&amp;gt; [&lt;BR /&gt;                        &lt;SPAN&gt;'Accept' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;'application/json'&lt;/SPAN&gt;,&lt;BR /&gt;                        &lt;SPAN&gt;'Authorization' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;'Bearer ' &lt;/SPAN&gt;. &lt;SPAN&gt;$accessResponses&lt;/SPAN&gt;[&lt;SPAN&gt;$user&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getId&lt;/SPAN&gt;()]-&amp;gt;&lt;SPAN&gt;getAccessToken&lt;/SPAN&gt;(),&lt;BR /&gt;                        &lt;SPAN&gt;'x-http-request-info' &lt;/SPAN&gt;=&amp;gt;&lt;BR /&gt;                            &lt;SPAN&gt;sprintf&lt;/SPAN&gt;(&lt;BR /&gt;                                &lt;SPAN&gt;'{"clientRequestId":{"sessionId":"%s","requestId":"%s"}}'&lt;/SPAN&gt;, &lt;SPAN&gt;$sessionId&lt;/SPAN&gt;, &lt;SPAN&gt;$requestId&lt;BR /&gt;&lt;/SPAN&gt;                            ),&lt;BR /&gt;                        &lt;SPAN&gt;'Content-Type' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;'application/json'&lt;/SPAN&gt;,&lt;BR /&gt;                        &lt;SPAN&gt;'x-once-authentication-info' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;sprintf&lt;/SPAN&gt;(&lt;BR /&gt;                            &lt;SPAN&gt;'{"id":"%s"}'&lt;/SPAN&gt;, &lt;SPAN&gt;$tanIds&lt;/SPAN&gt;[&lt;SPAN&gt;$user&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getId&lt;/SPAN&gt;()]&lt;BR /&gt;                        )&lt;BR /&gt;                    ],&lt;BR /&gt;                    &lt;SPAN&gt;'json' &lt;/SPAN&gt;=&amp;gt; [&lt;BR /&gt;                        &lt;SPAN&gt;'identifier' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;$sessionUuids&lt;/SPAN&gt;[&lt;SPAN&gt;$user&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getId&lt;/SPAN&gt;()],&lt;BR /&gt;                        &lt;SPAN&gt;'sessionTanActive' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;true&lt;/SPAN&gt;,&lt;BR /&gt;                        &lt;SPAN&gt;'activated2FA' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;true&lt;BR /&gt;&lt;/SPAN&gt;                    ]&lt;BR /&gt;                ]&lt;BR /&gt;            );&lt;BR /&gt;        }&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;/**&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;     * @param &lt;/SPAN&gt;&lt;SPAN&gt;User[] &lt;/SPAN&gt;&lt;SPAN&gt;$users&lt;BR /&gt;&lt;/SPAN&gt;     &lt;SPAN&gt;* @param &lt;/SPAN&gt;&lt;SPAN&gt;AccessResponse[] &lt;/SPAN&gt;&lt;SPAN&gt;$accessResponses&lt;BR /&gt;&lt;/SPAN&gt;     &lt;SPAN&gt;*/&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;private function &lt;/SPAN&gt;&lt;SPAN&gt;getFinalAccessTokens&lt;/SPAN&gt;(&lt;BR /&gt;        &lt;SPAN&gt;array  &lt;/SPAN&gt;&lt;SPAN&gt;$users&lt;/SPAN&gt;,&lt;BR /&gt;        &lt;SPAN&gt;array  &lt;/SPAN&gt;&lt;SPAN&gt;$accessResponses&lt;/SPAN&gt;,&lt;BR /&gt;        &lt;SPAN&gt;string &lt;/SPAN&gt;&lt;SPAN&gt;$sessionId&lt;/SPAN&gt;,&lt;BR /&gt;        &lt;SPAN&gt;string &lt;/SPAN&gt;&lt;SPAN&gt;$requestId&lt;BR /&gt;&lt;/SPAN&gt;    &lt;span class="lia-unicode-emoji" title=":enttäuschtes_Gesicht:"&gt;😞&lt;/span&gt; &lt;SPAN&gt;void&lt;BR /&gt;&lt;/SPAN&gt;    {&lt;BR /&gt;        &lt;SPAN&gt;foreach &lt;/SPAN&gt;(&lt;SPAN&gt;$users &lt;/SPAN&gt;&lt;SPAN&gt;as &lt;/SPAN&gt;&lt;SPAN&gt;$user&lt;/SPAN&gt;) {&lt;BR /&gt;            &lt;SPAN&gt;$response &lt;/SPAN&gt;= &lt;SPAN&gt;$this&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;client&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;post&lt;/SPAN&gt;(&lt;BR /&gt;                &lt;SPAN&gt;self&lt;/SPAN&gt;::&lt;SPAN&gt;API_URL &lt;/SPAN&gt;. &lt;SPAN&gt;'/oauth/token'&lt;/SPAN&gt;,&lt;BR /&gt;                [&lt;BR /&gt;                    &lt;SPAN&gt;'headers' &lt;/SPAN&gt;=&amp;gt; [&lt;BR /&gt;                        &lt;SPAN&gt;'Accept' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;'application/json'&lt;/SPAN&gt;,&lt;BR /&gt;                        &lt;SPAN&gt;'Content-Type' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;'application/x-www-form-urlencoded'&lt;BR /&gt;&lt;/SPAN&gt;                    ],&lt;BR /&gt;                    &lt;SPAN&gt;'form_params' &lt;/SPAN&gt;=&amp;gt; [&lt;BR /&gt;                        &lt;SPAN&gt;'client_id' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;$user&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getComdirectApiKey&lt;/SPAN&gt;(),&lt;BR /&gt;                        &lt;SPAN&gt;'client_secret' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;$user&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getComdirectApiSecret&lt;/SPAN&gt;(),&lt;BR /&gt;                        &lt;SPAN&gt;'grant_type' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;'cd_secondary'&lt;/SPAN&gt;,&lt;BR /&gt;                        &lt;SPAN&gt;'token' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;$accessResponses&lt;/SPAN&gt;[&lt;SPAN&gt;$user&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getId&lt;/SPAN&gt;()]-&amp;gt;&lt;SPAN&gt;getAccessToken&lt;/SPAN&gt;()&lt;BR /&gt;                    ]&lt;BR /&gt;                ]&lt;BR /&gt;            );&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;/**&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             * @var &lt;/SPAN&gt;&lt;SPAN&gt;array{&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             *     access_token: string,&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             *     token_type: string,&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             *     refresh_token: string,&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             *     expires_in: int,&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             *     scope: string,&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             *     kdnr: string,&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             *     bpid: string,&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             *     kontaktId: string,&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             * } &lt;/SPAN&gt;&lt;SPAN&gt;$responseData&lt;BR /&gt;&lt;/SPAN&gt;             &lt;SPAN&gt;*/&lt;BR /&gt;&lt;/SPAN&gt;            &lt;SPAN&gt;$responseData &lt;/SPAN&gt;= &lt;SPAN&gt;json_decode&lt;/SPAN&gt;(&lt;SPAN&gt;$response&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getBody&lt;/SPAN&gt;()-&amp;gt;&lt;SPAN&gt;getContents&lt;/SPAN&gt;(), &lt;SPAN&gt;true&lt;/SPAN&gt;);&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;$accessResponse &lt;/SPAN&gt;= &lt;SPAN&gt;new &lt;/SPAN&gt;&lt;SPAN&gt;AccessResponse&lt;/SPAN&gt;();&lt;BR /&gt;            &lt;SPAN&gt;$accessResponse&lt;BR /&gt;&lt;/SPAN&gt;                -&amp;gt;&lt;SPAN&gt;setAccessToken&lt;/SPAN&gt;(&lt;SPAN&gt;$responseData&lt;/SPAN&gt;[&lt;SPAN&gt;'access_token'&lt;/SPAN&gt;])&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setTokenType&lt;/SPAN&gt;(&lt;SPAN&gt;$responseData&lt;/SPAN&gt;[&lt;SPAN&gt;'token_type'&lt;/SPAN&gt;])&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setRefreshToken&lt;/SPAN&gt;(&lt;SPAN&gt;$responseData&lt;/SPAN&gt;[&lt;SPAN&gt;'refresh_token'&lt;/SPAN&gt;])&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setExpiresIn&lt;/SPAN&gt;(&lt;SPAN&gt;$responseData&lt;/SPAN&gt;[&lt;SPAN&gt;'expires_in'&lt;/SPAN&gt;])&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setScope&lt;/SPAN&gt;(&lt;SPAN&gt;$responseData&lt;/SPAN&gt;[&lt;SPAN&gt;'scope'&lt;/SPAN&gt;])&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setKdnr&lt;/SPAN&gt;(&lt;SPAN&gt;$responseData&lt;/SPAN&gt;[&lt;SPAN&gt;'kdnr'&lt;/SPAN&gt;])&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setBpid&lt;/SPAN&gt;((&lt;SPAN&gt;string&lt;/SPAN&gt;)&lt;SPAN&gt;$responseData&lt;/SPAN&gt;[&lt;SPAN&gt;'bpid'&lt;/SPAN&gt;])&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setKontaktId&lt;/SPAN&gt;((&lt;SPAN&gt;string&lt;/SPAN&gt;)&lt;SPAN&gt;$responseData&lt;/SPAN&gt;[&lt;SPAN&gt;'kontaktId'&lt;/SPAN&gt;])&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setSessionId&lt;/SPAN&gt;(&lt;SPAN&gt;$sessionId&lt;/SPAN&gt;)&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setReguestId&lt;/SPAN&gt;(&lt;SPAN&gt;$requestId&lt;/SPAN&gt;)&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setCreatedAt&lt;/SPAN&gt;(&lt;SPAN&gt;new &lt;/SPAN&gt;&lt;SPAN&gt;\&lt;/SPAN&gt;&lt;SPAN&gt;DateTimeImmutable&lt;/SPAN&gt;())&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setUser&lt;/SPAN&gt;(&lt;SPAN&gt;$user&lt;/SPAN&gt;);&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;$this&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;accessResponseRepository&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;save&lt;/SPAN&gt;(&lt;SPAN&gt;$accessResponse&lt;/SPAN&gt;);&lt;BR /&gt;        }&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;private function &lt;/SPAN&gt;&lt;SPAN&gt;generateSessionId&lt;/SPAN&gt;(): &lt;SPAN&gt;string&lt;BR /&gt;&lt;/SPAN&gt;    {&lt;BR /&gt;        &lt;SPAN&gt;$sessionId &lt;/SPAN&gt;= &lt;SPAN&gt;''&lt;/SPAN&gt;;&lt;BR /&gt;        &lt;SPAN&gt;for &lt;/SPAN&gt;(&lt;SPAN&gt;$i &lt;/SPAN&gt;= &lt;SPAN&gt;0&lt;/SPAN&gt;; &lt;SPAN&gt;$i &lt;/SPAN&gt;&amp;lt;= &lt;SPAN&gt;31&lt;/SPAN&gt;; &lt;SPAN&gt;$i&lt;/SPAN&gt;++) {&lt;BR /&gt;            &lt;SPAN&gt;$sessionId &lt;/SPAN&gt;.= &lt;SPAN&gt;rand&lt;/SPAN&gt;(&lt;SPAN&gt;0&lt;/SPAN&gt;, &lt;SPAN&gt;1&lt;/SPAN&gt;);&lt;BR /&gt;        }&lt;BR /&gt;        &lt;SPAN&gt;return &lt;/SPAN&gt;&lt;SPAN&gt;$sessionId&lt;/SPAN&gt;;&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;private function &lt;/SPAN&gt;&lt;SPAN&gt;generateRequestId&lt;/SPAN&gt;(): &lt;SPAN&gt;string&lt;BR /&gt;&lt;/SPAN&gt;    {&lt;BR /&gt;        &lt;SPAN&gt;return &lt;/SPAN&gt;(&lt;SPAN&gt;new &lt;/SPAN&gt;&lt;SPAN&gt;\&lt;/SPAN&gt;&lt;SPAN&gt;DateTime&lt;/SPAN&gt;())-&amp;gt;&lt;SPAN&gt;format&lt;/SPAN&gt;(&lt;SPAN&gt;'HHmm'&lt;/SPAN&gt;) . &lt;SPAN&gt;rand&lt;/SPAN&gt;(&lt;SPAN&gt;0&lt;/SPAN&gt;, &lt;SPAN&gt;9&lt;/SPAN&gt;);&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;/**&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;     * @param &lt;/SPAN&gt;&lt;SPAN&gt;User[] &lt;/SPAN&gt;&lt;SPAN&gt;$users&lt;BR /&gt;&lt;/SPAN&gt;     &lt;SPAN&gt;*/&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;public function &lt;/SPAN&gt;&lt;SPAN&gt;refreshAccessToken&lt;/SPAN&gt;(&lt;SPAN&gt;array &lt;/SPAN&gt;&lt;SPAN&gt;$users&lt;/SPAN&gt;&lt;span class="lia-unicode-emoji" title=":enttäuschtes_Gesicht:"&gt;😞&lt;/span&gt; &lt;SPAN&gt;void&lt;BR /&gt;&lt;/SPAN&gt;    {&lt;BR /&gt;        &lt;SPAN&gt;foreach &lt;/SPAN&gt;(&lt;SPAN&gt;$users &lt;/SPAN&gt;&lt;SPAN&gt;as &lt;/SPAN&gt;&lt;SPAN&gt;$user&lt;/SPAN&gt;) {&lt;BR /&gt;            &lt;SPAN&gt;/** @var &lt;/SPAN&gt;&lt;SPAN&gt;AccessResponse &lt;/SPAN&gt;&lt;SPAN&gt;$actualToken &lt;/SPAN&gt;&lt;SPAN&gt;*/&lt;BR /&gt;&lt;/SPAN&gt;            &lt;SPAN&gt;$actualToken &lt;/SPAN&gt;= &lt;SPAN&gt;$this&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;accessResponseRepository&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;findOneBy&lt;/SPAN&gt;([&lt;BR /&gt;                &lt;SPAN&gt;'user' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;$user&lt;BR /&gt;&lt;/SPAN&gt;            ], [&lt;BR /&gt;                &lt;SPAN&gt;'id' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;'DESC'&lt;BR /&gt;&lt;/SPAN&gt;            ]);&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;$response &lt;/SPAN&gt;= &lt;SPAN&gt;$this&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;client&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;post&lt;/SPAN&gt;(&lt;BR /&gt;                &lt;SPAN&gt;self&lt;/SPAN&gt;::&lt;SPAN&gt;API_URL &lt;/SPAN&gt;. &lt;SPAN&gt;'/oauth/token'&lt;/SPAN&gt;,&lt;BR /&gt;                [&lt;BR /&gt;                    &lt;SPAN&gt;'headers' &lt;/SPAN&gt;=&amp;gt; [&lt;BR /&gt;                        &lt;SPAN&gt;'Accept' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;'application/json'&lt;/SPAN&gt;,&lt;BR /&gt;                        &lt;SPAN&gt;'Content-Type' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;'application/x-www-form-urlencoded'&lt;BR /&gt;&lt;/SPAN&gt;                    ],&lt;BR /&gt;                    &lt;SPAN&gt;'form_params' &lt;/SPAN&gt;=&amp;gt; [&lt;BR /&gt;                        &lt;SPAN&gt;'client_id' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;$user&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getComdirectApiKey&lt;/SPAN&gt;(),&lt;BR /&gt;                        &lt;SPAN&gt;'client_secret' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;$user&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getComdirectApiSecret&lt;/SPAN&gt;(),&lt;BR /&gt;                        &lt;SPAN&gt;'grant_type' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;'refresh_token'&lt;/SPAN&gt;,&lt;BR /&gt;                        &lt;SPAN&gt;'refresh_token' &lt;/SPAN&gt;=&amp;gt; &lt;SPAN&gt;$actualToken&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getRefreshToken&lt;/SPAN&gt;(),&lt;BR /&gt;                    ]&lt;BR /&gt;                ],&lt;BR /&gt;            );&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;$responseData &lt;/SPAN&gt;= &lt;SPAN&gt;$response&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getBody&lt;/SPAN&gt;()-&amp;gt;&lt;SPAN&gt;getContents&lt;/SPAN&gt;();&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;/**&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             * @var &lt;/SPAN&gt;&lt;SPAN&gt;array{&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             *     access_token: string,&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             *     refresh_token: string,&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             *     token_type: string,&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             *     expires_in: int,&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             *     scope: string,&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;             * } &lt;/SPAN&gt;&lt;SPAN&gt;$responseDataAsArray&lt;BR /&gt;&lt;/SPAN&gt;             &lt;SPAN&gt;*/&lt;BR /&gt;&lt;/SPAN&gt;            &lt;SPAN&gt;$responseDataAsArray &lt;/SPAN&gt;= &lt;SPAN&gt;json_decode&lt;/SPAN&gt;(&lt;SPAN&gt;$responseData&lt;/SPAN&gt;, &lt;SPAN&gt;true&lt;/SPAN&gt;);&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;$refreshedToken &lt;/SPAN&gt;= (&lt;SPAN&gt;new &lt;/SPAN&gt;&lt;SPAN&gt;AccessResponse&lt;/SPAN&gt;())&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setAccessToken&lt;/SPAN&gt;(&lt;SPAN&gt;$responseDataAsArray&lt;/SPAN&gt;[&lt;SPAN&gt;'access_token'&lt;/SPAN&gt;])&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setRefreshToken&lt;/SPAN&gt;(&lt;SPAN&gt;$responseDataAsArray&lt;/SPAN&gt;[&lt;SPAN&gt;'refresh_token'&lt;/SPAN&gt;])&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setTokenType&lt;/SPAN&gt;(&lt;SPAN&gt;$responseDataAsArray&lt;/SPAN&gt;[&lt;SPAN&gt;'token_type'&lt;/SPAN&gt;] . &lt;SPAN&gt;' (refreshed via token with id) ' &lt;/SPAN&gt;. &lt;SPAN&gt;$actualToken&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getId&lt;/SPAN&gt;())&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setExpiresIn&lt;/SPAN&gt;(&lt;SPAN&gt;$responseDataAsArray&lt;/SPAN&gt;[&lt;SPAN&gt;'expires_in'&lt;/SPAN&gt;])&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setScope&lt;/SPAN&gt;(&lt;SPAN&gt;$responseDataAsArray&lt;/SPAN&gt;[&lt;SPAN&gt;'scope'&lt;/SPAN&gt;])&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setBpid&lt;/SPAN&gt;(&lt;SPAN&gt;''&lt;/SPAN&gt;)&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setKdnr&lt;/SPAN&gt;(&lt;SPAN&gt;''&lt;/SPAN&gt;)&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setSessionId&lt;/SPAN&gt;(&lt;SPAN&gt;$actualToken&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getSessionId&lt;/SPAN&gt;())&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setReguestId&lt;/SPAN&gt;(&lt;SPAN&gt;$actualToken&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;getReguestId&lt;/SPAN&gt;())&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setKontaktId&lt;/SPAN&gt;(&lt;SPAN&gt;''&lt;/SPAN&gt;)&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setUser&lt;/SPAN&gt;(&lt;SPAN&gt;$user&lt;/SPAN&gt;)&lt;BR /&gt;                -&amp;gt;&lt;SPAN&gt;setCreatedAt&lt;/SPAN&gt;(&lt;SPAN&gt;new &lt;/SPAN&gt;&lt;SPAN&gt;\&lt;/SPAN&gt;&lt;SPAN&gt;DateTimeImmutable&lt;/SPAN&gt;());&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;$this&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;accessResponseRepository&lt;/SPAN&gt;-&amp;gt;&lt;SPAN&gt;save&lt;/SPAN&gt;(&lt;SPAN&gt;$refreshedToken&lt;/SPAN&gt;);&lt;BR /&gt;        }&lt;BR /&gt;    }&lt;BR /&gt;}&lt;/PRE&gt;&lt;P&gt;Nachdem ich activateSession aufrufe gibt es die Funktion aktivateTans -&amp;gt; da muss man innerhalb von 10 Sekunden schaffen können Push Tan in App zu bestätigen, danach hab ich ein Cron was einfach aktuellen Token aus initialen Bank Response abholt und refresht da der Token nur 599 Sekunden gültig ist. Cron habe ich auf alle 5 Minuten eingestellt und da läuft alles einwandfrei (siehe dazu refreshAccessToken funktion). Ich hoffe mit dem Code kann jemand was anfangen, ich kann auch mehr zeigen falls Interesse da ist (inklusive Docker Umgebung und Rest von Funktionen und Features die ich umgesetzt habe). Wenn Interesse da ist gerne melden, ich mach dann ein neues Repo auf und teile die gerne weiter:)&lt;BR /&gt;&lt;BR /&gt;&lt;a href="https://community.comdirect.de/t5/user/viewprofilepage/user-id/87"&gt;@SMT_Service&lt;/a&gt;&amp;nbsp;Ich hab auch paar coole Ideen und Vorschläge für Erweiterung von existierenden API, in meinem Projekt habe ich einen Telegram Bot geschrieben welcher mir dann Benachrichtigungen über neue Transaktionen schickt (manchmal 40 Minuten früher als die aus der Bank). Gerne können wir das jederzeit näher besprechen!&lt;BR /&gt;&lt;BR /&gt;Beste Grüße&lt;BR /&gt;Alexey Bereznyak&lt;/P&gt;&lt;/DIV&gt;</description>
      <pubDate>Tue, 16 Jan 2024 19:43:29 GMT</pubDate>
      <guid>https://community.comdirect.de/t5/konto-depot-karte/rest-api-ohne-phototan-app-nutzen-k%C3%B6nnen/m-p/298460#M50403</guid>
      <dc:creator>truefalse10</dc:creator>
      <dc:date>2024-01-16T19:43:29Z</dc:date>
    </item>
  </channel>
</rss>

