Autentimise märkmed: mobiil-ID

Allikas: Lambda

Ametlik dokumentatsioon ID-teenuste arendajale: http://id.ee/index.php?id=30388

DigiDocService spetsifikatsioon

PHP näidisrakendus. Sellelt lehelt leiad ka enamuse vajalikke linke testimiseks.

Reaalseks kasutuseks on vaja teha SK-ga leping ja saada pääsutõend, ilma selleta on ligipääsetav ainult testteenus (kus on võimalik reaalseid telefone kasutada, esmaseks testimiseks piisab testnumbritest)

Arhitektuur

Mobiil-ID on realiseeritud SOAP teenusena. Seetõttu pole mingit ametlikku teeki selle kasutamiseks vaja, piisab SOAP kliendist. Koosneb kahest päringust:

  • MobileAuthenticate - saadab teenusele numbri, saab tagasi sessiooni id ja PIN koodi. Kliendi telefonis küsitakse PIN-i.
  • GetMobileAuthenticateStatus - annab autentimise tulemuse (või "OUTSTANDING_TRANSACTION", mis tähendab, et kasutaja pole PIN-i sisestamisega veel valmis). Tulemust küsitakse eelmisest päringust saadud sessiooni id-ga.

Realiseerimine Pythonis

 sudo apt-get install python-suds

Tekitame SOAP kliendi

 >>> import suds
 >>> client = suds.client.Client("https://tsp.demo.sk.ee/?wsdl")

Järgnevad käsud on ka kõik Pythonis.

Alustame autentimist. MobileAuthenticate spekki vaata ametlikust dokumentatsiooonist.

  request = client.service.MobileAuthenticate(
           "", # isikukood
           "", # riigi kood
           '+37200000766', # telefoninumber (siin testnumber)
           'EST',  # või RUS, ENG
           'Testimine',  # testteenuses see, lives oma rakenduse nimi
           "",
           "",
           'asynchClientServer',  # staatus saadakse teada pollides
           0,
           False,
           False)

Saame teada kas õnnestus

 print request.Status

Isikukood ja muud isikuandmed on õnnestumise korral vastuses, aga kasutaja pole veel autenditud! Need andmed on seotud sisse toksitud telefoninumbriga, aga kasutaja peab veel tõestama, et tegu on ta enda telefoniga.

 print request.UserIDCode

PIN-koodi tuleb nüüd kasutajale näidata

 print request.ChallengeID

Ja tulemuse küsimiseks kood

 sessid = str(request.Sesscode)

Järgmist päringut tuleb vajadusel pollida mitu korda, esimene päring on mõistlik umbes 15 sekundi pärast.

 request2 = client.service.GetMobileAuthenticateStatus(
           sessid, # MobileAuthenticate vastusest
           False # teenus vastab kohe, ei oota valmis saamist
          )

Kõiki võimalikke staatuseid vt jällegi ametlikust dokumentatsioonist. "OUTSTANDING_TRANSACTION" tähendab, et oota natuke ja polli uuesti.

 print request2.Status