Je suis nouveau dans ce domaine de l'utilisation de SOAP pour les appels NetSuite. Par conséquent, je pense peut-être complètement incorrectement sur la façon de résoudre le problème. Voici ce que j'essaye de résoudre: - Langage: Python + Zeep - Je souhaite déplacer mon application de l'authentification par e-mail vers l'authentification par jeton.
En Python, je suis capable de générer tous les paramètres pour TokenPassport. Voici où je suis confus: j'ai cherché du code sur la pile et j'ai remarqué que les gens utilisaient la méthode client.service.login () pour se connecter. Cette méthode prend le passeport et non l'obj tokenpassport. Existe-t-il une méthode distincte qui prend tokenpassport obj pour la connexion? Ou dois-je générer (code en dur) un XML avec les paramètres et est-ce passé dans l'en-tête en tant que données?
Merci T
3 Réponses :
J'espère que le code ci-dessous aidera quelqu'un qui commence.
base = '&'.join([nsAccountID, consumerKey, token, Nonce, currentTime]) key = '&'.join([consumerSecret, tokenSecret]) digest = hmac.new(str.encode(key), msg=str.encode(base), digestmod=hashlib.sha256).digest() signature = base64.b64encode(digest).decode() tokenPassport = client.get_type('ns0:TokenPassport') PassportSignature = client.get_type('ns0:TokenPassportSignature') tokenPassportSignature = PassportSignature(signature, "HMAC-SHA256" ) clientPass = tokenPassport(account=nsAccountId, consumerKey = consumerKey, token= token, nonce= Nonce, timestamp=currentTime, signature=tokenPassportSignature) search = client.get_type('ns5:ItemSearchBasic') searchCriteriaComplex = client.get_type('ns0:SearchStringField') searchCriteria = searchCriteriaComplex(searchValue= "Test Display Name - tax", operator="is") searchItem = search(displayName = searchCriteria) testRes = client.service.search(searchRecord= searchItem, _soapheaders={"tokenPassport": clientPass})
Pourriez-vous expliquer ce que sont «secret» et «chose à avoir»? ont-ils une valeur aléatoire? Merci,
secretToJoin = (consumerSecret, tokenSecret) secret = connectionJoiner.join (secretToJoin) msgToJoin = (nsAccountId, consumerKey, token, nonce, str (currentTime)) connectionJoiner = "&" msgToJoin = connectionJoiner.join (msgToJoin = connectionJoiner.join (msgToJoin)
Voici comment je génère le TokenPassport.
def _generateTimestamp(self): return str(int(time())) def _generateNonce(self, length=20): """Generate pseudorandom number """ return ''.join([str(random.randint(0, 9)) for i in range(length)]) def _getSignatureMessage(self, nonce, timestamp): return '&'.join( ( self._setting['ACCOUNT'], self._setting['CONSUMER_KEY'], self._setting['TOKEN_ID'], nonce, timestamp, ) ) def _getSignatureKey(self): return '&'.join((self._setting['CONSUMER_SECRET'], self._setting['TOKEN_SECRET'])) def _getSignatureValue(self, nonce, timestamp): key = self._getSignatureKey() message = self._getSignatureMessage(nonce, timestamp) hashed = hmac.new( key=key.encode('utf-8'), msg=message.encode('utf-8'), digestmod=hashlib.sha256 ).digest() return base64.b64encode(hashed).decode() @property def tokenPassport(self): TokenPassport = self.getDataType("ns0:TokenPassport") TokenPassportSignature = self.getDataType("ns0:TokenPassportSignature") nonce = self._generateNonce() timestamp = self._generateTimestamp() tokenPassportSignature = TokenPassportSignature( self._getSignatureValue(nonce, timestamp), algorithm='HMAC-SHA256' ) return TokenPassport( account=self._setting['ACCOUNT'], consumerKey=self._setting['CONSUMER_KEY'], token=self._setting['TOKEN_ID'], nonce=nonce, timestamp=timestamp, signature=tokenPassportSignature )