walle89 / SwedbankJson

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

AUTHORIZATION_FAILED - Tjänsten anropades på ett felaktigt sätt. #14

Closed ghost closed 10 years ago

ghost commented 10 years ago

Hej,

Vill börja med att tacka för att du delar med dig av ditt API.

Tänkte testa att göra en inloggning i C#. Baserat på din PHP kod testade jag följande:

  1. Sätta samtliga headers. "Authorization" headern genererade jag genom att base64-encoda appId:random GUID, typ:

Base64encode("HithYAGrzi8fu73j:0EA86D2F-1A60-4E52-B2C3-6ED84F3C179F")

Resulterar i något som ser ut ungefär såhär:

SGl0aFlBR3J6aThmdTczajozOTI2NTk5OC05REJBLTQ0RkQtODk0RS0zNDU2Q0Y2NjE0RkE=

  1. Skicka en POST till (med slumpad dsid parameter):

https://auth.api.swedbank.se/TDE_DAP_Portal_REST_WEB/api/v1/identification/personalcode?dsid=EAd2031D

Post body: useEasyLogin: false, generateEasyLoginId: false, userId: 19XXXXXXXXXX, password: pass

Detta resulterar i en 401, Unauthorized: AUTHORIZATION_FAILED - Tjänsten anropades på ett felaktigt sätt..

Ser du något uppenbart som jag missat?

Tack på förhand!

walle89 commented 10 years ago

Härligt att se en C# implementation av Swedbanks API! Om du lägger upp koden så säg till så länkar jag gärna till den.

Angånde ditt problem, utan att se den råa HTTP-anropet så är det svårt för mig att säga exakt vad som är fel. 401 är ett generellt meddelande för Swedbanks API som säger något i stil med "Det är något i ditt anrop jag inte gillar, så därför får du inte komma in!".

Men lite generella tips:

  1. Se till att du skickar med alla headers i alla requests (se https://github.com/walle89/SwedbankJson/blob/master/src/SwedbankJson.php#L387).
  2. Alla post-request måste ha content-type "application/json; charset=UTF-8'"
  3. dsid måste sättas även som en cookie

Är inte alla dessa delar på plats så blir det tvärstopp.

ghost commented 10 years ago

Kan lägga upp den så fort jag fått det att fungera :-)

Aah, hade missat att sätta dsid-cookien. Nu får jag dock en 400 istället. Såhär ser mina headers ut. Antar att det är något fel där?

Lyckades inte sätta proxy-connection, kan det vara den som spökar?

POST /TDE_DAP_Portal_REST_WEB/api/v1/identification/personalcode?dsid=f00B3F52 HTTP/1.1

Accept-Language: sv-se Accept-Encoding: gzip, deflate Authorization: SGl0aFlBR3J6aThmdTczajo3M0M0N0QwMC0yNkEzLTRCMEUtODYxNy1FOTZEOTE1NTE4M0Q= Cookie: dsid=f00B3F52 Accept: / User-Agent: SwedbankMOBPrivateIOS/3.9.0_(iOS;_8.0.2)_Apple/iPhone5,2 Content-Type: application/json; charset=UTF-8 Host: auth.api.swedbank.se Content-Length: 78 Expect: 100-continue Connection: Keep-Alive

walle89 commented 10 years ago

Det är mycket möjligt att proxy-connection måste finnas för att fungera. Som sagt, API:et är extremt känsligt och är det något som avviker från det sätt som mobilappen kommunicerar med API:et så avbryts inloggingsprocessen. Skulle det inte hjälpa så skicka med HTTP-förfrågan med den datan som skickas (censurerad från personnummer och lösenord förstås).

Se även till att sätta upp en cookie jar så att du kan spara de cookies som API:et svarar med.

ghost commented 10 years ago

Hej igen, testade att sätta proxy-connection med ett Fiddler anrop, men det ger samma resultat (400 - bad request), så tror inte det är där felet ligger.

Såhär ser requesten ut enligt Fiddler:

POST https://auth.api.swedbank.se/TDE_DAP_Portal_REST_WEB/api/v1/identification/personalcode?dsid=7Ce10117 HTTP/1.1 Accept-Language: sv-se Accept-Encoding: gzip, deflate Authorization: SGl0aFlBR3J6aThmdTczajozMUNGNEYzOS0xMzkxLTRFQ0MtQTgxRi0wRjM1RDFDM0YxQzU= Cookie: dsid=7Ce10117 Accept: / User-Agent: SwedbankMOBPrivateIOS/3.9.0_(iOS;_8.0.2)_Apple/iPhone5,2 Content-Type: application/json; charset=UTF-8 Host: auth.api.swedbank.se Content-Length: 68 Expect: 100-continue Connection: Keep-Alive proxy-connection: keep-alive

useEasyLogin=false&password=foo&generateEasyLoginId=false&userId=bar

Ser du något fel? Skulle du kunna posta ett exempel på en valid request?

walle89 commented 10 years ago

Swedbanks API fungerar så att du skickar inte vanlig POST-data, utan en POST-request med JSON-encodad data. Så här ska det se ut utifrån ditt exempel:

{
  "password" : "foo",
  "useEasyLogin" : false,
  "userId" : "bar",
  "generateEasyLoginId" : false
}

Skulle den fortsätta bråka så kan du bara att jämföra med HTTP anropet nedan och försöka anpassa din kod så att den gör princip samma anrop. Den är från när jag senast avlyssnade Swedbank-appen. Det enda som jag har ändrat är inloggingsuppgifter samt Authorization-strängen.

POST /TDE_DAP_Portal_REST_WEB/api/v1/identification/personalcode?dsid=bDltb1dD HTTP/1.1
Host: auth.api.swedbank.se
Authorization: SGl0aFlBR3J6aThmdTczajozMUNGNEYzOS0xMzkxLTRFQ0MtQTgxRi0wRjM1RDFDM0YxQzU=
Accept: */*
Content-Type: application/json; charset=UTF-8
Accept-Language: en-us
Cookie: dsid=bDltb1dD
Accept-Encoding: gzip, deflate
Content-Length: 112
Connection: keep-alive
Proxy-Connection: keep-alive
User-Agent: SwedbankMOBPrivateIOS/3.9.0_(iOS;_8.0.2)_Apple/iPhone5,2

{
  "password" : "foo",
  "useEasyLogin" : false,
  "userId" : "bar",
  "generateEasyLoginId" : false
}
ghost commented 10 years ago

En JSON-sträng som POST body alltså. Det var något nytt :-)

Fortsätter att labba. Ett jättetack för all hjälp!

walle89 commented 10 years ago

Okej, lycka till! Om det är något du undrar så är det bara att fråga!

faejr commented 9 years ago

Tog mig tiden att göra en C# wrapper igårkväll/idag. Tog lite fipplande här och var, men nu var den uppe! Även den under MIT licens. https://github.com/DarkTwisterr/SwedbankSharp

walle89 commented 9 years ago

Det där ser fantastik ut! Lägger upp en länk i readme-filen samt tipsa åtminstone en person som jag tror skulle uppskatta det.