walle89 / SwedbankJson

Unofficial API client for the Swedbank's and Sparbankerna's mobile apps in Sweden.
MIT License
74 stars 14 forks source link

Personligt inloggning försvinner februari 2016 #18

Closed hedqvist closed 8 years ago

hedqvist commented 9 years ago

Hej!

Efter att ha varit i kontakt med Swedbanks support så berättade dom att personlig inlogging dvs, personnummer + personlig kod kommer att försvinna under Mars 2015. Finns det några planer på att gå runt detta med alternativ inloggnings-lösning?

walle89 commented 9 years ago

Om det är så att personlig kod kommer att försvinna så är det bara BankID och säkerhetsdosan som man kan logga in med, men ingen av dessa går att göra automatiska inloggningar med. Det i sig är ett problem eftersom att både mina och andra projekt som jag känner till så är det närmast ett krav att kunna automatisera för att bland annat hämta hem transaktioner. Så frågan är om vad för värde detta projekt har efter en sådan åtgärd av banken.

Men finns det intresse så skulle jag kunna titta närmare på hur exakt dosan och BankID funkar tillsammans med API:et. Helst skulle man få BankID att fungera då det är dels mer bekväm än dosan, det går att hitta lösningar som gör att man kan halvautomatisera processen (ex. få en notis i mobilen som öppnar bankid-appen för att godkänna inloggingen) samt dels att den har aningen mindre rättigheter.

Men så länge som det inte finns någon officiellt uttalande från Swedbank så kommer jag sätta detta önskemål som ett lågt prioriterat önskemål och därmed kommer jag inte lägga större energi på detta eventuella framtida problem.

walle89 commented 9 years ago

Jag har i dagarna fått indikationer på att personlig kod kommer att försvinna och att det kommer att göra det utan någon förvarning från Swedbank. Därför har jag prioriterat om och har påbörjat med arbetet med att skriva om koden så att den ska förutom personlig kod även ska hantera åtminstone en av två typer av inloggning som går att göra med bankdosan.

Det finns ingen exakt datum när jag kan bli klar, men jag har kommit en bra bit på vägen och jag kommer troligen bli klar i början på mars.

eminos commented 9 years ago

Hej Eric. Vilka två typer av inloggning via bankdosan är det du refererar till, och hur kan man automatisera dessa?

walle89 commented 9 years ago

De två inloggingstyperna som jag syftar är de två olika varianter som finns för bankdosorna och kan beskrivas på följande sätt:

Tänk dig att du ska logga in på Internetbanken och du har skrivit in ditt personnummer samt väljer bankdosan som inloggingsmetod, så kommer du till ett steg där du ska fylla i ett 8-siffrigt nummer. Det finns två sätt att fylla rätt nummer, men kan bara använda ett av dem beroende på vad för dosa man har. Dessa är följande:

  1. Responskod - Du får ett 8-siffrigt nummer som du ska mata in i bankdosan och när du har gjort det så får du tillbaka ett 8-siffrigt nummer som du loggar in med.
  2. Loginkod - Tillskillad mot respnskod så fyllter du inte i någon sifferkombination, utan du får ditt 8-siffriga nummer direkt av dosan för att logga in med.

Förmodligen blir det Loginkod som jag implementerar först då den påminner mest om personlig kod.

Tyvärr är det så att Swedbank har valt att plocka bort den personliga koden som är den enda inloggingsmetod som man kan automatisera. Ska man automatisera en bankdosa så krävs det att man listar ut hur den genererar nya koder och sen hur det skiljer sig mellan andra dosor, vilket är allt annat än en lätt uppgift. Det enda som skulle kunna fungera är att man kopplar dosan till en robot som kan både mata in koder och läsa av svaret på displayen, men egentligen ingen bra lösning.

En mer realistisk lösning är att låta PHP-scirptet skicka push-notifikationer med en tjänst som exempelvis Pushover som uppmanar att man besöker en sida där man kan mata in koden som man har fått från sin bankdosa som man har med sig. När den väl har koden så kan den sköta resten.

Kom gärna med förslag på andra lösningar.

eminos commented 9 years ago

Men det var ju själva f*n! Då försvinner alltså möjligheten att automatisera en koll på saldot... Tack Swedbank... Då kommer Bankdroid också sluta fungera snart då (för Swedbank/Sparbankerna). Finns det något sätt att använda mobilt bankid, och på så sätt automatisera? Skriptet skickar en signal till en väntande app på mobilen som öppnar upp BankID-appen och magiskt i bakgrunden knappar in koden så att skriptet kan gå vidare med inloggningen.... (?) Eller så byter man bara bank, kanske enklaste lösningen...

walle89 commented 9 years ago

Nu har jag inte tittat på mycket på BankID, men som jag förstår det så är det inte möjligt det du beskriver. Visst, det är möjligt att BankID-appen öppnas för att skriva sin pinkod för att signera inloggningen, men jag tror det inte är möjligt att pinkoden skrivs in automatiskt. Man kanske kan ta APK-filen av BankID på Android och modifiera den, men inte heller detta är en bra lösning på problemet.

Tyvärr så tror jag inte att byte av bank är en långsiktig lösning. Flera banker har avskaffat personlig kod på sistone. SEB, Handelsbanken och nu senast Skandiabanken är bara några exempel.

När det gäller saldot, vill du bara ha koll på totalbeloppet? I så fall skulle snabbsaldo passa dig som handen i handsken, eftersom den inte kräver någon inloggning alls efter det man har satt upp det första gången. Men som sagt, den visar bara totalbeloppet och inte vilka transaktioner som har gjorts.

walle89 commented 9 years ago

Jag har nu lagt upp den första utkastet av den nya koden i Auth trädet (https://github.com/walle89/SwedbankJson/tree/Auth). Om någon är intresserad att ta titt på koden och/eller testa den så är det välkommet. Observera att man behöver modifiera koden en aningen jämfört med tidigare för att det ska fungera. Läs mer om det i README.ME. Det är samma installationsinstruktioner sedan tidigare men man anger version 'dev-Auth'. Composer-filen bör se ut något i stil med:

{
    "require": {
        "walle89/swedbank-json": "dev-Auth"
    }
}

Just nu finns det bara stöd för personlig kod, men bankdosan är på gång och tills dess att det är implementerat så kan ni titta på utkastet i kodexemplet.

walle89 commented 9 years ago

Nu har jag släppt kod som gör att man kan logga med in säkerhetsdosa. Anpassa bara koden efter README.MD och sedan är det bara tuta och köra.

Jag skulle vilja ha hjälp med att testa ifall säkerhetsdosa med responskod och se om det fungerar. Eftersom jag bara har varianten med engångskod kan inte inte verifiera om det kommer att fungera eller ej.

NisseDILLIGAF commented 9 years ago

Får detta felet när jag kör med nya Auth trädet

Fatal error: Can't use method return value in write context in /var/www/swedbank/vendor/walle89/swedbank-json/src/SwedbankJson.php on line 63

tar jag bort raden 63 'if (empty($this->_auth->getClient()))' så funkar det :/

walle89 commented 9 years ago

Har du uppdaterat koden enligt readme i Auth-trädet? Hur ser din kod ut? Se till att uppdatera den (gjorde precis nu en push).

NisseDILLIGAF commented 9 years ago

Jag uppdatera koden .. men får samma fel fast på rad 58 nu... kommenterar jag bort den raden funkar det...

walle89 commented 9 years ago

Hur ser din kod ut? Jag kan inte återskapa felet.

NisseDILLIGAF commented 9 years ago

jag kör efter readme exemplet


require_once 'vendor/autoload.php';

define('USERNAME', xxx); // Personnummer define('PASSWORD', 'xxx'); // Personlig kod define('BANKID', 'swedbank'); // Byt mot motsvarnde IOS/Android mobil app. Alternativ: swedbank, sparbanken, swedbank_ung, sparbanken_ung, swedbank_företag

$auth = new SwedbankJson\Auth\PersonalCode(BANKID, USERNAME, PASSWORD); $bankConn = new SwedbankJson\SwedbankJson($auth);

$accountInfo = $bankConn->accountDetails(); // Hämtar från första kontot, sannolikt lönekontot

$bankConn->terminate(); // Utlogging

echo 'Kontoutdrag';

print_r($accountInfo);

en liten fråga... måste jag logga in för att använda quickBalance? på Swedbanks android app så behöver man inte logga in för att kolla snabbsaldo...

walle89 commented 9 years ago

Vi börjar med quickBalance. Som wrappern ser ut idag så kan man inte anropa den utan att logga in, men det är något som stöds i Swedbanks API förstås. Detta har egentligen inte varit något problem innan eftersom det var så enkelt att logga in med Personlig kod, men när Swedbank skrotar personliga koden så blir det absolut någonting man får titta på. Men just nu finns det annat som behöver prioriteras.

Nu har jag själv gjort de steg som man behöver ta enligt readme samt ändra till dev-Auth i en ny tom mapp. Men jag får inte upp felet. Vilken version av PHP kör du?

NisseDILLIGAF commented 9 years ago

ok... ja, det var det jag tänkte att det kan vara bra när personlig kod försvinner... :)

jag kör php5

walle89 commented 9 years ago

Kör du PHP5.4, 5.5 eller 5.6?

Är du inte säker så skapa en php-fil med koden:

<?php phpinfo(); 

... och köra den förstås. :)

NisseDILLIGAF commented 9 years ago

PHP Version 5.4.37-1+deb.sury.org~precise+1

kanske dags att uppdatera? :)

walle89 commented 9 years ago

Okej, det förklarar saken. Jag har gjort en rättning och allt du behöver göra är att uppdatera.

NisseDILLIGAF commented 9 years ago

Ja, såg det... :) Nu funkar det... tack för hjälpen....!!

walle89 commented 9 years ago

Kanon! Prova gärna att logga in med bankdosan också så får man det testat. :)

NisseDILLIGAF commented 9 years ago

jadå, det funkar... :)

walle89 commented 9 years ago

Vad för typ av dosa använder du? Responskod eller Engångskod?

NisseDILLIGAF commented 9 years ago

Engångskod.. har inte testat Responskod... kan kolla det imorgon... har inte mer tid ikväll... tack för allt! ...skriver en rad när jag testat respons...

walle89 commented 9 years ago

Har du två olika dosor för två olika inloggningar? För annars brukar man ha antingen det ena eller det andra.

NisseDILLIGAF commented 9 years ago

nä, bara en dosa... normalt är det Engångskod för att logga in.. men sen kör jag Responskod när jag ska verifiera överföringar/betalningar ... tänkte att det kanske går att logga in så oxå?

walle89 commented 9 years ago

Nej, för att responskod ska fungera så måste Swedbank ge dig en 8-siffrig kod vid inloggning. Så länge som du inte får den koden så kan du inte logga in med responskod.

NisseDILLIGAF commented 9 years ago

ok... då kan jag tyvärr inte testa det... :/

walle89 commented 9 years ago

Inga problem, om det är ingen som har inlogging med responskod så är det ingen som vill ha det. :)

Tack för att du ställde upp!

walle89 commented 9 years ago

Inatt lanserade jag version 0.5.0 som innehåller möjligheten att logga in med säkerhetsdosa. Just nu stöds bara bankdosa med engångskod, vilket troligtvis bör täcka alla nya dosor som ges ut av banken. Dock andra typen av dosor, responskod, finns det inte stöd för i dagsläget. Läs mer i README.md vad skillnaden är mellan två inloggingsmetoder är.

Jag håller på att titta på en lösning för hur man kan stödja responskod, men jag behöver betatestare då jag själv inte har möjlighet att göra denna typ av inlogging. Självfallet finns inget krav på lämna ut varken pin- eller 8-siffriga koder eller bankdosa, utan det handlar om att man testar kod som jag skickar ut. Intresserade svarar helst i denna issue, men det är okej att kontakta mig via en annan kanal.

timtux commented 9 years ago

Kan meddela att det inte hjälper att byta bank eftersom kravet kommer från Datainspektionen. De anser att inloggning med PIN inte är tillräckligt säkert för att kunna se transaktioner.

Jag har fått två olika svar från Swedbank, den ena sa att pin-kods inlogg kommer försvinna under sommaren och den andra i slutet av året.

Edit: Bank-ID på kort går att automatisera inloggning med. Men lösningen vi har just nu kräver en windows burk i princip dedikerad till det. Det är lite krånligt eftersom de har ett "skydd" mot att automatisk input (de hookar keystrokesen tror jag, för att försvåra för keyloggers). Men kom runt de genom att emulera input på drivrutinsnivå. Ska se om jag kan publicera det projektet.

walle89 commented 9 years ago

Intressant idé @timtux med Bank-ID på kort, problemet är bara att API:et stödjer inte det. I så fall får man istället automatisera inloggningarna via internetbanken, vilket är ett stort minus då man får gå tillbaka till köra regex av HTML-kod istället för JSON.

NisseDILLIGAF commented 9 years ago

är inte helt hemma på hur det funkar men det verkar som att quickbalance utan inloggning är ganska enkel...? Har kollat lite med 'Charles Proxy' ... detta skickar jag för att få quickbalance... utan att vara inloggad

h***s://unauth.api.swedbank.se/TDE_DAP_Portal_REST_WEB/api/v2/quickbalance/{quickBalanceSubscriptionId}?dsid={dsid}

hoppas det kanske hjälper :)

walle89 commented 9 years ago

@NisseDILLIGAF Ja, det stämmer. Men som jag tidigare skrev är det en fråga om att hinna implementera det i wrappen. Jag har nu skapat en ny todo-issue (#19) och jag vill helst se att du använder denna issue för vidare frågor eller diskussion angående om quickbalance eftersom denna issue är till för frågan om inloggingsmetoder.

walle89 commented 9 years ago

I Swedbanks nyhetsbrev för mars 2015 står det följande:

Personlig kod tas bort som inloggningsmetod Under 2015 kommer banken ta bort personlig kod som inloggningsmetod till internet- och mobilbanken. Som alternativ finns både säkerhetsdosan och Mobilt BankID som dessutom ger dig tillgång till fler tjänster eftersom du med personlig kod endast kan använda en begränsad del av internet- och mobilbanken.

Med andra ord, ännu finns det inget exakt datum, men att den försvinner under mars månad är rätt osannolikt. Hur som helst så finns det ett skriftligt uttalande från banken, och @hedqvist ska ha en eloge för att ha snappat upp detta långt innan jag hann upptäkte det. Tack!

I övrigt har jag jobbat på att stödja säkerhetsdosa med kontrollnummer och svarskod samt Bankid som inloggingsmetoder. Säkerhetsdosa med kontrollnummer och svarskod tror jag har löst nu, men jag behöver någon som har denna typ av inloggning som kan bekräfta att det fungerar innan jag släpper lösningen. Kontakta mig på valfri kanal för mer info.

Angående om BankID jobbar jag fortfarande på det och har beställt hem en Android-platta för att göra vissa typer av undersökningar som normalt inte kan göra på Ios eller svårt att återskapa i en Andorid emulator.

lasdjfk commented 9 years ago

Några framsteg med detta? Är i programmeringsfaggorna här. Testar gärna "Säkerhetsdosa (Kontrollnummer och svarskod)" om du behöver testare. Men ännu hellre att mobilt bank-id skulle fungera!

walle89 commented 9 years ago

Angående om BankID så har det inte varit helt enkelt att få fram en fungerande lösning. Det jag hittills har gjort är följande: https://github.com/walle89/SwedbankJson/blob/BankID/src/Auth/MobileBankID.php Testas med följande kod:

<?php
session_start();
require_once '../vendor/autoload.php';

define('USERNAME', 198903060000);   // Personnummer
define('BANK_APP', 'swedbank');
try
{
    if (isset($_SESSION['auth']))
    {
        $auth = unserialize($_SESSION['auth']);

        if(!$auth->verify())
        {
            echo "Ej inloggad, uppdatera!";
            exit;
        }
        $bankConn = new SwedbankJson\SwedbankJson($auth);

        echo "<pre>";
        print_r($bankConn->accountList());
        $bankConn->terminate();
        unset($_SESSION['auth']);
        exit;
    }
    echo '<pre>';
    $auth = new SwedbankJson\Auth\MobileBankID(BANK_APP, USERNAME);
    $_SESSION['auth'] = serialize($auth);
    $auth->initAuth();
}
catch (UserException $e)
{
    echo $e->getMessage();
    unset($_SESSION['auth']);
    exit;
}
catch (GuzzleHttp\Exception\ClientException $e)
{
    echo '<pre>';
    echo 'Swedbank-fel: ' . $e->getResponse();
    unset($_SESSION['auth']);
    exit;
}
// Systemfel och övriga fel
catch (Exception $e)
{
    echo 'Swedbank-fel övrigt: ' . $e->getMessage() . ' (Err #' . $e->getCode() . ")\r\n" . $e->getTraceAsString();
    unset($_SESSION['auth']);
    exit;
}
?>
<!doctype html>
<html lang="sv">
    <head>
        <meta charset="UTF-8">
        <title>Test Auth</title>
    </head>
    <body>
        Öppna BankID-appen!
    </body>
</html>

Problemet som jag har nu är att efter jag har signerat med Bankid och försöker hämta banktransaktioner så får jag "Inloggningen med Mobilt BankID påbörjades inte på rätt sätt. Vänligen försök igen.". Jag har ännu inte kommit på vad som jag gör för fel.

Angående om Säkerhetsdosan så prova med följande kod och rapportera hur det har gått:

<?php
session_start();
require_once '../vendor/autoload.php';

define('USERNAME', 198903060000);   // Personnummer
define('BANK_APP', 'swedbank');
try
{
    if (count($_POST))
    {
        $auth = unserialize($_SESSION['auth']);
        $auth->setchallengeResponse((int)$_POST['response']);
        $bankConn = new SwedbankJson\SwedbankJson($auth);

        echo "<pre>";
        print_r($bankConn->accountList());
        $bankConn->terminate();
        exit;
    }
    $auth = new SwedbankJson\Auth\SecurityToken(BANK_APP, USERNAME);
    $_SESSION['auth'] = serialize($auth);
}
// Fel av användare
catch
(UserException $e)
{
    echo $e->getMessage();
    exit;
}
catch (GuzzleHttp\Exception\ClientException $e)
{
    echo 'Swedbank-fel: ' . $e->getResponse();
}
catch (Exception $e)
{
    echo 'Swedbank-fel: ' . $e->getMessage() . ' (Err #' . $e->getCode() . ")\r\n" . $e->getTraceAsString();
}
?>

<!doctype html>
<html lang="sv">
    <head>
        <meta charset="UTF-8">
        <title>Test Auth</title>
    </head>
    <body>
        <form action="" method="post">
            <p><?php var_dump($auth->getchallenge()); ?></p>
            <input name="response" type="text" />
            <button>Send</button>
        </form>
    </body>
</html>

Om koden inte fungerar eller stöter på hinder så kontakta mig på http://wallmander.net/kontakta-mig/.

steenstn commented 8 years ago

Update: Från Swedbanks sida: Personlig kod upphör som inloggningsmetod till internet-och mobilbanken februari 2016

walle89 commented 8 years ago

Goda nyheter!

Jag har äntligen fått tid över under nyårshelgen att få BankID att fungera. Jag har lagt upp mitt jobb under trädet wip-BankID_Guzzle6. Som namnet antyder så använder den sig av Guzzle 6, till skillnad den nuvarande wrappern som använder sig av Guzzle 5.

Vad som är nytt med version 6 och som är relaterat till detta projekt innebär det bättre stöd för att spara kakor mellan sessioner, som är avgörande för att BankID samt "säkerhetsdosa med kontrollnummer och svarskod" ska kunna fungera. Men med Guzzle 6 innebär också högre systemkrav, i detta fall krävs minst PHP 5.5 till skillnad mot Guzzle 5 kräver 5.4. Att kunna få det fungera i Guzzle 5 kanske kan fungera, men det innebär en hel del jobb och det är inte alls helt säkert att det kommer att fungera. Det är inte möjligt att göra med Guzzle 5, såvida inte man gör en fork av den. Dock det är inget jag vill göra för en PHP-version som idag saknar all form av support från skaparna.

Hur som helst, så behöver jag hjälp med att testa koden och få feedback på lösningen. Om någon är villig att testa, gör då följande:

Steg 1: Skapa en ny tom mapp med följande composer.json innehåll:

{
    "require": {
        "walle89/swedbank-json": "dev-wip-BankID_Guzzle6"
    }
}

Steg 2: Följ instruktionerna i övrigt enligt README.ME.

Steg 3: För testning använd följande kod (ändra USERNAME och eventuellt BANK_APP till egna uppgifter) _Uppdaterad 11:54, Nu har jag städat koden så att den blir lättare att följa, samt lagt delar av sessions-hanteringen till auth-klassen. Det förenklar och förkortar exemplet._:

<?php
session_start();
require_once '../vendor/autoload.php';

define('USERNAME', 198903060000);   // Personnummer
define('BANK_APP', 'swedbank');
$auth = null;
try {
    // Steg 1 - Inled inloggning
    if (!isset($_SESSION['swedbankjson_auth'])) {
        $auth = new SwedbankJson\Auth\MobileBankID(BANK_APP, USERNAME);
        $auth->initAuth();
        exit('Öppna BankID-appen och godkänn inloggingen. Därefter uppdatera sidan.');
    }

    // Steg 2 - Verifiera inlogging
    $auth = unserialize($_SESSION['swedbankjson_auth']);
    if (!$auth->verify())
        exit("Du uppdaterade sidan, men inloggningen är inte godkänd i BankID-appen. Försök igen.");

}
catch (Exception $e) {
    echo '<pre>Fel: ' . $e->getMessage() . ' (Err #' . $e->getCode() . ")\r\n" . $e->getTraceAsString() . '</pre>';
}

// Steg 3 - Genomförande
$bankConn = new SwedbankJson\SwedbankJson($auth);
?>
<!doctype html>
<html lang="sv">
    <head>
        <meta charset="UTF-8">
        <title>Test Auth</title>
    </head>
    <body>
        <pre>
        <?php
        print_r($bankConn->accountDetails());

        // Utloggning - Kör denna rad kod och ladda om sidan för att logga ut.
        //$bankConn->terminate();
        ?>
        </pre>
    </body>
</html>

Steg 4: Surfa nu till sidan med koden ovan och följ instruktionerna.

Om den listar transaktioner så fungerar det. I så fall meddela det, annars ge felmeddelande osv så att jag kan felsöka.

lasdjfk commented 8 years ago

Grymt jobbat! Fungerar strålande för mig, php 5.5.9 :).

walle89 commented 8 years ago

Strålande! Tack för hjälpen @lasdjfk.

Om ett par till kan testa så kommer jag släppa det i nästa version.

lasdjfk commented 8 years ago

Föresten när sidan varit inaktiv ett tag kommer detta upp när jag uppdaterar

Fatal error:  Uncaught exception 'GuzzleHttp\Exception\ClientException' with message 'Client error: `GET https://auth.api.swedbank.se/TDE_DAP_Portal_REST_WEB/api/v3/profile/?dsid=a404A740` resulted in a `401 Unauthorized` response:
{"errorMessages":{"general":[{"code":"STRONGER_AUTHENTICATION_NEEDED","message":"This service requires an other ID-metho
' in /var/www/testing/www/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php:107
Stack trace:
#0 /var/www/testing/www/vendor/guzzlehttp/guzzle/src/Middleware.php(65): GuzzleHttp\Exception\RequestException::create(Object(GuzzleHttp\Psr7\Request), Object(GuzzleHttp\Psr7\Response))
#1 /var/www/testing/www/vendor/guzzlehttp/promises/src/Promise.php(199): GuzzleHttp\Middleware::GuzzleHttp\{closure}(Object(GuzzleHttp\Psr7\Response))
#2 /var/www/testing/www/vendor/guzzlehttp/promises/src/Promise.php(152): GuzzleHttp\Promise\Promise::callHandler(1, Object(GuzzleHttp\Psr7\Response), Array)
#3 /var/www/testing/www/vendor/guzzlehttp/promises/sr in /var/www/testing/www/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php on line 107

Går inte att komma vidare verkar det som.

walle89 commented 8 years ago

Du måste se till att $bankConn->terminate(); körs så att sessionen försvinner. Jag vet ännu inte hur det ska hanteras på ett smidigt sätt. Innan loggades man alltid ut efter avslutad körning, men det är något som man praktiskt inte är tillämpbart i och med personlig kod försvinner. Men hur som helst, just nu får man själv implementera ett sätt när terminate(); ska köras, exempelvis när man vill logga ut och när man avslutar session för inaktiva användare.

Förslag är välkommna.

lasdjfk commented 8 years ago

Lägga till

$options['http_errors'] = FALSE;

på rad 257 i AbstractAuth.php?

Samt:

        if (!isset($output->hasSwedbankProfile))
        {
            unset($_SESSION);
                    throw new Exception('Något med profilsidan är fel.', 20);
        }

På i public function profileList() (rad 54) i SwedbankJson.php.

Eller nåt sånt?

walle89 commented 8 years ago

Jag har skickat ut en uppdatering till dev-wip-BankID_Guzzle6 som har bättre felhantering. Kör bara en composer update och testa.

Det jag har gjort är att så fort ett svar resulterar i HTTP status 4xx eller 5xx så kommer en ApiException skapas och ser samtidigt till att man blir utloggad och rensar sessionen. Man får fortfarande "STRONGER_AUTHENTICATION_NEEDED" vid timeout, men skillnaden nu är att man inte hamnar i en evig loop som @lasdjfk råkade ut för.

Vill man ersätta "STRONGER_AUTHENTICATION_NEEDED" felet med ett timeout-meddelande, så får man förmodligen sätta en egen timeout gräns och sedan se till att man loggas ut när tiden gått ut. Här är jag osäker på om det är något som wrappern ska göra eller om ansvaret ligger på utvecklaren för att implementera. Jag vill lämna mycket frihet för utvecklaren att göra sina egna lösningar än att försöka anpassa sig efter hur wrappern vill hur API:et ska bete sig.

lasdjfk commented 8 years ago

Härligt! Fungerar finfint!

walle89 commented 8 years ago

Gött!

Angående om säkerhetsdosa med kontrollnummer och svarskod så tror jag att jag har fått det att fungera, dock har jag ännu inte kunnat testa det efter som jag inte tillgång till en sådan dosa. För den som vill testa kan följa instruktionerna nedan. Beroende på utfallet så kommer den kanske med i den kommande versionen tillsammans med BankID.

Steg 1: Skapa en ny tom mapp med följande composer.json innehåll:

{
    "require": {
        "walle89/swedbank-json": "dev-wip-SecurityToken_Guzzle6"
    }
}

Steg 2: Följ instruktionerna i övrigt enligt README.ME.

Steg 3: För testning använd följande kod (ändra USERNAME och eventuellt BANK_APP till egna uppgifter):

<?php
session_start();
require_once '../vendor/autoload.php';

define('USERNAME', 19890306000);   // Personnummer
define('BANK_APP', 'swedbank');
try
{
    if (count($_POST))
    {
        $auth = unserialize($_SESSION['swedbankjson_auth']);
        $auth->setchallengeResponse((int)$_POST['response']);
        $bankConn = new SwedbankJson\SwedbankJson($auth);

        echo "<pre>";
        print_r($bankConn->accountList());
        $bankConn->terminate();
        exit;
    }

    $auth = new SwedbankJson\Auth\SecurityToken(BANK_APP, USERNAME);
    $_SESSION['swedbankjson_auth'] = serialize($auth);
}

// Systemfel och övriga fel
catch (Exception $e)
{
    echo 'Swedbank-fel: ' . $e->getMessage() . ' (Err #' . $e->getCode() . ")\r\n" . $e->getTraceAsString();
    exit;
}
?>
<!doctype html>
<html lang="sv">
    <head>
        <meta charset="UTF-8">
        <title>Test Auth</title>
    </head>
    <body>
        <form action="" method="post">
            <p><?php echo (!$auth->getchallenge()) ? 'Engångskod:'  : 'Kontrollnummer: '. $auth->getchallenge(); ?></p>
            <input name="response" type="text" />
            <button>Logga in</button>
        </form>
    </body>
</html>

Steg 4: Surfa nu till sidan och logga in.

För rapport om det fungerar, berätta om det var med engångskod eller kontrollnummer. Om det inte fungerar, posta även felmeddelande.

lasdjfk commented 8 years ago

För dosa med kontrollkod får jag följande fel:

Swedbank-fel: fields (1): Du behöver fylla i Personnummer. (Err #0)
#0 /var/www/testing/www/vendor/walle89/swedbank-json/src/Auth/AbstractAuth.php(178): SwedbankJson\Auth\AbstractAuth->sendRequest(Object(GuzzleHttp\Psr7\Request))
#1 /var/www/testing/www/vendor/walle89/swedbank-json/src/Auth/SecurityToken.php(69): SwedbankJson\Auth\AbstractAuth->postRequest('identification/...', '{"useEasyLogin"...')
#2 /var/www/testing/www/vendor/walle89/swedbank-json/src/Auth/SecurityToken.php(95): SwedbankJson\Auth\SecurityToken->getchallenge()
#3 /var/www/testing/www/vendor/walle89/swedbank-json/src/SwedbankJson.php(50): SwedbankJson\Auth\SecurityToken->login()
#4 /var/www/testing/www/vendor/walle89/swedbank-json/src/SwedbankJson.php(87): SwedbankJson\SwedbankJson->profileList()
#5 /var/www/testing/www/vendor/walle89/swedbank-json/src/SwedbankJson.php(134): SwedbankJson\SwedbankJson->selectProfile('')
#6 /var/www/testing/www/dosa/index.php(16): SwedbankJson\SwedbankJson->accountList()
#7 {main}

Personligen ser jag dock inte riktigt nyttan med att använda dosa, när bank-id är mycket smidigare :).

walle89 commented 8 years ago

Är du helt 100% säker på du har fyllt i rätt personnummer och i formatet ååååmmddnnnn? Annars försök sätta igång debug-läget och om du kan få ut mer information. Du kan också dumpa all data som finns med $e.

Anledningar till stöd för bankdosa:

  1. Bankdosa kan göra allt som BankID kan, och mer därtill.
  2. Om BankID skulle strula, då funkar bankdosan som backup
  3. Alla använder inte BankID, bland annat för att BankID är mindre säkert än bankdosa (mobilen kan bli hackad och få modifierad kod).
lasdjfk commented 8 years ago

Jepp, har nu dubbelkollat - samma pers.nr. som jag använder för bank-id (som då fungerar). Samma felmeddelande.

Ja, definitivt bra att ha dosa som backup.

Edit: se bifogad dump av $e. debug.txt

Vilket debug läge menar du?

walle89 commented 8 years ago

Nu är det fixat, gör en composer update och försök igen.

Varje inloggningsmetods __construct har en parameter som heter debug. För SecurityToken skulle det se ut så här:

$auth = new SwedbankJson\Auth\SecurityToken(BANK_APP, USERNAME, null, true);