Login, python

Added by Anders over 8 years ago

Goddag..

Skulle undra om det finns ett sätt att analysera skäl för att, som det verkar, vad jag än försöker, får jag vid login alltid {'message': 'Failed to decrypt authorization blob'}

Kod i python för att skapa hashet:

def loginHash(self, login, password, public_key_file):
timestamp = int(round(time.time()*1000))
timestamp = str(timestamp)
login = base64.b64encode(login)
password = base64.b64encode(password)
phrase = base64.b64encode(timestamp)
buf = login+':'+password+':'+phrase
rsa = RSA.load_pub_key(public_key_file)
encrypted_hash = rsa.public_encrypt(buf, RSA.pkcs1_oaep_padding)
hash = base64.b64encode(encrypted_hash)
return hash

Hmm, indenteringen på kod biten vill inte synas på forumet..

-Anders


Replies (13)

RE: Login, python - Added by Andreas over 8 years ago

Hej, utan att ha provat i Python tror jag att det är följande som är problemet:

När du base64-kodar en sträng får du visserligen bara ascii-tecken tillbaka, men den den kodade strängen kan fortfarande innehålla några tecken (+, / och =, om jag inte missminner mig) som inte är lämpliga att skicka i ett POST-anrop. För att bli av med dessa måste du avsluta din kod med att URL-koda strängen (så att + översätts till %2B, / till %2F och = till %3D).

Kortversionen: Lägg till hash = urllib.quote(hash) sist i din kod. Du behöver nog också import urllib på lämplig plats.

Fotnot: Jag är lite osäker på om det verkligen är nödvändigt att koda + och /, men det skadar ju aldrig, och = måste alltid kodas. För övrigt tror jag aldrig att + och / dyker upp i praktiken eftersom de bara används av base64-kodningen för icke-skrivbara tecken.

RE: Login, python - Added by Nordnet Tommi over 8 years ago

Anders, fungerade tipsen och fick du ordning på det? Vi lägger gärna till ditt exempel bland kodexmpelen.

För att formatera koden i forumet skriver du enligt följande
<pre>
<code class="python">..</code>
</pre>

RE: Login, python - Added by Anders about 8 years ago

Tackar för svaret. Haft det ganska så brottom på senaste, så det tog en tid att svara.

Tipset du gav var bra och jag trodde först att det kasnke var det, men det visa sig att jag hade redan gjort urllib.urlencode

Slutliga delen som gör kallelsen ser ut så

    print params

        headers = {"Content-type": "application/x-www-form-urlencoded",
                    "Accept": "application/json",
                    "Accept-Language": self.language}
        conn = httplib.HTTPSConnection(self.API_HOST)
        conn.request("POST", self.BASE_URL+'/'+self.API_VERSION+url, params, headers)

och print params get ungefär (förkortat):
auth=KpWOojCqKsIMJC5u.....S1aoDx9WQ%3D%3D&service=NEXTAPI
Language har jag som "en". URLet blir till slut /next/1/login

Dvs. i mina ögon ser den "post acceptabel" ut.

RE: Login, python - Added by Anders about 8 years ago

Här är blobben före base64 enkodningen i olika steg:

login: abc
password: 123
timestamp: 1309275464906

Efter separata bas64 + satt ihop före crypteringen:
YWJj:MTIz:MTMwOTI3NTQ2NDkwNg==

Slutliga:
nv3vJn5DYE4BGAn0upxX3MwH91mHpQ0yFT0QJjEmbb1JtrQwYTav5WnJ5y1JfVgPI9CSGtnQtNmV35GlvroO0UIHfAZUQDwoDu5n/FwjtysfdcpQeRK3AaXMWf0NxyWY8zPXfWl6J86blI3+Bw/pGbjuuIafdbqDlEQsQszZqiH/uElIGDYk8BjdQmVbZwI/XnvRZfOsBx9JzdYdeyvtUY2jsF1fiT4toxezY/CjL/qmlX24YBSQmndTYg8WOXXN8ARd2+W8EkL36X9H8ltuREU/5c46O3h7JuYezLOL2HKYPip+8nR83ek3WtsF6olUdL7+yMrCObwXIsLTUQzwDA==

Login och pass är så klart inte de jag har, men ifall att nån har lust att köra en test och berätta vad de får med samma värden..

RE: Login, python - Added by Anders about 8 years ago

Beklagar.. ändrade en sak och kom så klart inte att tänka på timestampen, så föregående är fel..
Här samma på nytt från en körning:

login: abc
password: 123
timestamp: 1309275464906

Efter separata bas64 + satt ihop före crypteringen:
YWJj:MTIz:MTMwOTI3NTQ2NDkwNg==

Slutliga:
Ptfh5VfE806a7P9LHBNIgCNRSFi65d4bZOR1qlUNfrlHO+b4qh29MEgqjlMxY2bgJ8WDsEn/buH23JlAdeQCyuLeRS3XpDdoljiXt0i38wHdkv wkIImCimhMH+qnH07jaIzDEA+qIW88hLOCylKncDVn+FZT7SmvGF6SOmrthr62q9BIr+5VUGXDchTo7ZdWiY8MTKa0IMTdOKKteUU7AoA9je8lzhCx 5Uw6bfAXvYzib5xI02Ew2GZGEXa85rCM6nV4OCDbqVbxvGuPEdgDODgv75SxNNVGPqdIOrq7ROzypPYxkchVhA0OrWF1XdUeohwQ4amhtVEBn9PTpprbbA==

Dvs., slutliga var fel i förra exemplet.
Slutliga har par radbyten för att inte spränga forumet sidvis..

RE: Login, python - Added by Nordnet Tommi about 8 years ago

Anders wrote:

login: abc
password: 123
timestamp: 1309275464906

Efter separata bas64 + satt ihop före crypteringen:
YWJj:MTIz:MTMwOTI3NTQ2NDkwNg==

Det verkar stämma.

Slutliga:
Ptfh5VfE806a7P9LHBNIgCNRSFi65d4bZOR1qlUNfrlHO+b4qh29MEgqjlMxY2bgJ8WDsEn/buH23JlAdeQCyuLeRS3XpDdoljiXt0i38wHdkv > wkIImCimhMH+qnH07jaIzDEA+qIW88hLOCylKncDVn+FZT7SmvGF6SOmrthr62q9BIr+5VUGXDchTo7ZdWiY8MTKa0IMTdOKKteUU7AoA9je8lzhCx > 5Uw6bfAXvYzib5xI02Ew2GZGEXa85rCM6nV4OCDbqVbxvGuPEdgDODgv75SxNNVGPqdIOrq7ROzypPYxkchVhA0OrWF1XdUeohwQ4amhtVEBn9PTpprbbA==

Jag provade de inparametrarna med något som liknar kodexmplet och får inte samma resultat. Dessvärre är jag inte tillräckligt bekant med python för att kunna komma med något konstruktivt.

RE: Login, python - Added by Anders about 8 years ago

OK, tror jag hittade problemet.

M2Crypto gör det klart att normala RSA paddingen är RSA.pkcs1_oaep_padding, medan här verkar det vara RSA.pkcs1_padding

Vad det kommer sig till "tror att jag hittade problemet".. Svaret jag får är:

500
Internal Server Error
....html markup etc. .....
Sequel::DatabaseDisconnectError

in LoginController#create
Mysql::Error: MySQL server has gone away

samt en mängd Ruby trace och mer html markup.

Min tur att apiservern inte är i skick just för stunden?

-Anders

RE: Login, python - Added by Anders about 8 years ago

Prova på nytt utan ändringar så tycks det gå igenom.. hicka hos apiservern kanske.

RE: Login, python - Added by Nordnet Tommi about 8 years ago

Anders wrote:

Min tur att apiservern inte är i skick just för stunden?

Verkar ha varit ett tillfälligt problem som inte går att återskapa nu. Vi undersöker varför MySQL inte ville vara med just då...

RE: Login, python - Added by mika over 7 years ago

Hello

I also tried above example code. My full code end of the message.
Regardless of RSA padding type:
SA.pkcs1_oaep_padding or RSA.pkcs1_padding I get "Failed to decrypt authorization blob" on login.

Any suggestions what is wrong?

import time
import base64
from M2Crypto import RSA
import httplib, urllib
from BeautifulSoup import BeautifulSoup

timestamp = int(round(time.time()*1000))
timestamp = str(timestamp)
login = base64.b64encode('login')
password = base64.b64encode('password')
phrase = base64.b64encode(timestamp)
buf = login+':'+password+':'+phrase
rsa=RSA.load_pub_key('NEXTAPI_TEST_public.pem')
#encrypted_hash = rsa.public_encrypt(buf, RSA.pkcs1_oaep_padding)
encrypted_hash = rsa.public_encrypt(buf, RSA.pkcs1_padding)
hash = base64.b64encode(encrypted_hash)
hash=urllib.quote(hash)

URL='api.test.nordnet.se'
BASE_URL='api.test.nordnet.se/next'
API_VERSION='1'

headers = {"Content-type": "application/x-www-form-urlencoded","Accept": "application/xml",'Accept-Language':'en'}
conn = httplib.HTTPSConnection(URL)
conn.request('GET','https://'+BASE_URL+'/'+API_VERSION)
r=conn.getresponse()
xml = r.read()
soup=BeautifulSoup(xml)
print 'get'
#print 'xml',xml
print 'valid version:',soup.status.find('valid-version').string
print 'system running:',soup.status.find('system-running').string
print 'skip phrase:',soup.status.find('skip-phrase').string
print 'timestamp:',soup.status.timestamp.string
params = r.msg.dict

params = urllib.urlencode({'service': 'MY_APP', 'auth': hash})
conn.request('POST','https://'+BASE_URL+'/'+API_VERSION+'/login',params,headers)
r=conn.getresponse()

xml = r.read()
params = r.msg.dict
print 'post login'
print 'xml',xml
#print 'params',params

RE: Login, python - Added by Nordnet Simon over 7 years ago

Hi Mika, sorry for the late reply. We are a bit short on Python expertise. 2 small changes and it will work.

Remove row 17: hash=urllib.quote(hash)

Row 37: 'MY_APP' should be 'NEXTAPI'

Then it worked for me.

RE: Login, python - Added by mika over 7 years ago

Hi Simon,

Thanks for help. Now it the code works for me also. From my behalf it is OK to use it as example, even tough I mostly copied from previous posts.

I found out also that python's json library is easier to use than XML and BeautifulSoup. Json will provide the data as python dictionary.

I'm now doing following:

import json
def print_json(j,prefix=''):
    for key, value in j.items():
        if isinstance (value,dict):
            print '%s%s' % (prefix,key)
            print_json(value, prefix+'  ')
        else:
            print '%s%s:%s' % (prefix,key,value)

# some code

headers = {"Content-type": "application/x-www-form-urlencoded","Accept": "application/json",'Accept-Language':'en'}

# some more code

resp = r.read()
j = json.loads(resp)
print_json(j)


RE: Login, python - Added by Nordnet Simon over 7 years ago

Hi, glad that it works. I added a Python code example https://api.test.nordnet.se/projects/api/wiki/Code_examples#Login-example-in-Python based on the code in this thread.

I am not a Python master so if you see anything strange please let me know.

(1-13/13)