Allegro WebAPI

Interfejs programistyczny platformy Allegro

doLoginEnc

Tematyka: Logowanie
Ostatnia zmiana: 04.09.2012 r.
Dostępność:
Metoda pozwala na uwierzytelnienie i autoryzację użytkownika za pomocą danych dostępowych do konta (loginu lub adresu e-mail i hasła w postaci zakodowanej). Po pomyślnym uwierzytelnieniu, użytkownik otrzymuje identyfikator sesji, którym następnie może posłużyć się przy wywoływaniu metod wymagających autoryzacji. Identyfikator sesji zachowuje ważność przez jedną godzinę od momentu jego utworzenia.

  1. user-login | string | wymagany
    Nazwa (1-16 znaków) lub e-mail użytkownika.
  2. user-hash-password | string | wymagany
    Hasło użytkownika w postaci zakodowanej (najpierw potraktowane SHA-256, następnie zakodowane z użyciem base64).
  3. country-code | int | wymagany
    Identyfikator kraju (listę identyfikatorów krajów uzyskać można za pomocą metody doGetCountries).
  4. webapi-key | string | wymagany
    Klucz WebAPI użytkownika.
  5. local-version | long | wymagany
    Klucz wersji, odpowiedni dla wybranego kraju i przekazanego klucza WebAPI.



Orientacyjna struktura wywołania metody

$dologinenc_request = array(
   'user-login' => 'm010ch',
   'user-password' => [hasło potraktowane SHA-256 oraz zakodowane z użyciem base64],
   'country-code' => 1,
   'webapi-key' => 'g2fe408289',
   'local-version' => 16551276
);

  1. session-handle-part |  string
    Identyfikator sesji.
  2. user-id | long
    Identyfikator zalogowanego użytkownika.
  3. server-time |  long
    Aktualny czas na serwerze (w formacie Unix time).



    Orientacyjna struktura odpowiedzi serwera

    $dologinenc_response = array(
       'session-handle-part' => '22eb99326c6be29aa16d07d622bcfbcbee94ad54846f2f4e03_1',
       'user-id' =>
    4109848,
       'server-time' => 1269814134
    );


    • ERR_AUTHORIZATION_ERROR
      Wskazane konto zostało zamknięte i nie ma możliwości zalogowania się na nie.
    • ERR_CAPTCHA_REQUIRED
      Dostęp przez WebAPI dla użytkownika został zablokowany z powodu zbyt dużej liczby błędnych logowań na konto. Odblokowanie dostępu nastąpi dopiero po poprawnym zalogowaniu się wskazanego użytkownika z poziomu serwisu WWW: https://ssl.allegro.pl/enter_login.php?captcha=1.
    • ERR_INPUT_COUNTRY_ERROR
      Niepoprawny identyfikator kraju (wskazany kraj nie jest obsługiwany lub w parametrze przekazano zerową/pustą wartość).
    • ERR_INVALID_VERSION_CAT_SELL_FIELDS
      Niepoprawna wartość klucza wersji (więcej).
    • ERR_JUNIOR_CANT_LOGIN_IN_THIS_COUNTRY
      Użytkownik konta Junior nie może się logować do wskazanego kraju.
    • ERR_LICENCE_EXPIRED_OR_CLOSED
      Dla podanego klucza API włączony został mechanizm licencjonowania, a użytkownik wywołujący metodę nie jest na liście użytkowników dopuszczonych do korzystania z niego.
    • ERR_NO_DATABASE
      Problemy z bazą danych Allegro.
    • ERR_NO_SESSION
      Problemy z mechanizmem autoryzacji lub użytkownik rozwiązał umowę z serwisem.
    • ERR_PASSWORD_TOO_EASY
      Ze względów bezpieczeństwa prosimy o stworzenie nowego hasła, które zabezpieczać będzie dostęp do Twojego konta w Allegro. W celu dokonania niezbędnych zmian zaloguj się w serwisie, a następnie postępuj według wyświetlanych instrukcji.
    • ERR_SM_MIGRATION_IN_PROGRESS
      W trakcie migracji konta do Menedżera Sprzedaży nie ma możliwości zalogowania się na nie.
    • ERR_USER_PASSWD
      Niepoprawne hasło.
    • ERR_WEBAPI_EXPIRED
      Data ważności klucza WebAPI została przekroczona.
    • ERR_WEBAPI_KEY
      Niepoprawna wartość klucza WebAPI lub klucz został zablokowany.
    • ERR_WEBAPI_KEY_INACTIVE
      Klucz WebAPI został zdezaktywowany (nie zaakceptowano warunków Regulaminu WebAPI).
    • ERR_WEBAPI_NOT_AVAIL
      Problemy z usługą Allegro WebAPI.

    Allegro nie bierze odpowiedzialności za skutki wykorzystania zamieszczonych przykładów kodu, nie daje także gwarancji ich poprawnego działania. Widoczny kod ma charakter wyłącznie poglądowy i może zawierać błędy.

    #1 (01.04.2010 r.) / php (Autor: danielnowacki)
    1. /**
    2. * Klient Soap - komunikacja z serwerem allegro
    3. *
    4. * @package Allegro/Client
    5. * @author Daniel Nowacki
    6. * @version 1.0
    7. */
    8.  
    9. class Allegro_Client_Soap extends Allegro_Client_Abstract
    10. {
    11. ...
    12. protected $_config = array(
    13. 'wsdl' => '',
    14. 'login' => '',
    15. 'login' => 'password',
    16. );
    17. ...
    18. public function __construct($config, $sessionHandle, $subjectObservable = null)
    19. {
    20.  
    21. ...
    22. }
    23.  
    24. /**
    25. * Logowanie do serwisu Allegro
    26. *
    27. * Logowanie domyslnie wykrywa czy jest dostepny moduł kryptografii
    28. * jezeli tak to uzywa funkcji logowania doLoginEnc, w przeciwnym razie
    29. * loguje sie czystym tekstem. Za pomoca parametru wejsciowego mozna
    30. * wymusic logowanie plaintekst
    31. *
    32. * @param boolean $forcePlainLogin wymuszaj logowanie czystym tekstem
    33. *
    34. * @return array
    35. */
    36. public function login($forcePlainLogin = false)
    37. {
    38. if ($this->sessionHandle == null ) throw new Allegro_Exception('Session handler not found');
    39.  
    40. // jak sesja jest juz aktywna to nie loguj ponownie, dla drugiej sesji trzeba stworzyc
    41. // oodzielna instancje handlera
    42. if ($this->sessionHandle->isActive()) return $this->sessionHandle->getAllegroFormatSessionInfo();
    43.  
    44. $password = $this->config['password'];
    45.  
    46. $isCrypo = false;
    47.  
    48. // wykrywam czy sa dostepne funkcje kryptograficzne
    49. if (function_exists('hash') && in_array('sha256', hash_algos()) )
    50. {
    51. $isCrypo = true;
    52. $password = hash('sha256', $this->config['password'], true); // ostatni parametr musi byc na true, chce otrzymac odcisk w postaci bajtowej a nie hexadecymalnej
    53.  
    54. } // starszy mhash
    55. else if (function_exists('mhash') && is_int(MHASH_SHA256))
    56. {
    57. $isCrypo = true;
    58. $password = mhash(MHASH_SHA256, $this->config['password']);
    59. }
    60.  
    61.  
    62. if ($isCrypo && !$forcePlainLogin) // jak nie wymusono logowania plaintekstem
    63. {
    64. // Allegro WebAPI wymaga by hasło zakodowane było dodatkowo w base64Binary
    65. $password = base64_encode($password);
    66.  
    67. $this->loginResponse = $this->doLoginEnc($this->config['login'], $password, $this->config['country'], $this->config['webapikey'], $this->getApiVersion());
    68. }
    69. else
    70. {
    71. $this->loginResponse = $this->doLogin($this->config['login'], $this->config['password'], $this->config['country'], $this->config['webapikey'], $this->getApiVersion());
    72. }
    73.  
    74. $this->sessionHandle->setAllegroFormatSessionInfo($this->loginResponse);
    75.  
    76.  
    77. $sessionInfo = $this->config;
    78. unset($sessionInfo['password']);
    79.  
    80. $this->sessionHandle->setIdentity($sessionInfo);
    81.  
    82. return $this->loginResponse;
    83. }
    84.  
    85. $sessionHandle obiekt przechowujący sesję
    #2 (21.12.2010 r.) / c# (Autor: allegro2006go2)
    1. string username = "nazwa_uzytk";
    2. string password = "haslo";
    3. string webApiKey = "klucz_WebAPI";
    4. int versionKey = 29321656;
    5. int countryCode = 228;
    6.  
    7. string sessionHandle = null;
    8. long userId = 0;
    9. long serverTime = 0;
    10.  
    11. AllegroWebApiService allegroService = new AllegroWebApiService();
    12.  
    13. using (SHA256 sha256 = new SHA256Managed())
    14. {
    15. byte[] passwordHash = sha256.ComputeHash(StrToByteArray(password));
    16. string encodedPassword = Convert.ToBase64String(passwordHash);
    17.  
    18. try
    19. {
    20. sessionHandle = allegroService.doLoginEnc(username, encodedPassword, countryCode, webApiKey, versionKey, out userId, out serverTime);
    21. }
    22. catch (Exception e)
    23. {
    24. //obsługa wyjątku w przypadku niepowodzenia
    25. }
    26. }
    27.  
    28.  
    29. private static byte[] StrToByteArray(string str)
    30. {
    31. System.Text.UTF8Encoding encoding=new System.Text.UTF8Encoding();
    32. return encoding.GetBytes(str);
    33. }
    #3 (23.01.2014 r.) / python (Autor: 01miru)
    1. # coding: utf-8
    2. import hashlib
    3. import logging
    4. from suds.client import Client, WebFault
    5.  
    6. class Allegro:
    7.  
    8. def __init__(self, api_key, debug_mode=False):
    9. API_URL = 'https://webapi.allegro.pl/service.php?wsdl'
    10. self.api_key = api_key
    11. self.service = Client(API_URL).service
    12. self.auth = None
    13. self.version_key = None
    14. if debug_mode:
    15. logging.basicConfig(level=logging.INFO)
    16. logging.getLogger('suds.client').setLevel(logging.DEBUG)
    17.  
    18. def _get_version_by_country_code(self, country_code):
    19. systems = self.service.doQueryAllSysStatus(**{
    20. 'countryId': country_code,
    21. 'webapiKey':self.api_key
    22. })[0]
    23.  
    24. for sys in systems:
    25. if sys['countryId'] == country_code:
    26. return sys['verKey']
    27.  
    28. def loginEnc(self, login, password, country_code):
    29. try:
    30. self.version_key = self._get_version_by_country_code(country_code)
    31. self.auth = self.service.doLoginEnc(**{
    32. 'userLogin': login,
    33. 'userHashPassword': hashlib.sha256(password).digest().encode('base64'),
    34. 'countryCode': country_code,
    35. 'webapiKey' : self.api_key,
    36. 'localVersion' : self.version_key
    37. })
    38. except WebFault as ex:
    39. print ex
    #4 (26.09.2014 r.) / java (Autor: Grzegorz_B)
    1. import java.io.IOException;
    2. import java.security.MessageDigest;
    3. import java.security.NoSuchAlgorithmException;
    4.  
    5. import org.kobjects.base64.Base64;
    6. import org.ksoap2.SoapEnvelope;
    7. import org.ksoap2.SoapFault;
    8. import org.ksoap2.serialization.PropertyInfo;
    9. import org.ksoap2.serialization.SoapObject;
    10. import org.ksoap2.serialization.SoapSerializationEnvelope;
    11. import org.ksoap2.transport.HttpTransportSE;
    12. import org.ksoap2.transport.Transport;
    13. import org.xmlpull.v1.XmlPullParserException;
    14.  
    15. /**
    16. * Przykład wywołań metod doQuerySysStatus i doLoginEnc za pomocą frameworka ksoap2-android.
    17. *
    18. * @author Grzegorz Byczyński
    19. */
    20. public class AllegroTest {
    21.  
    22. private final int soapVersion = SoapEnvelope.VER11;
    23. private final String endpointUri = "https://webapi.allegro.pl/service.php";
    24. private final String namespace = "https://webapi.allegro.pl/service.php";
    25.  
    26. public static void main(String[] args) throws SoapFault, NoSuchAlgorithmException {
    27. AllegroTest allegro = new AllegroTest();
    28. String apiKey = "12345678";
    29. long versionKey = allegro.doQuerySysStatus(3, 1, apiKey);
    30. String sessionHandlePart = allegro.doLogin("login", Base64.encode(MessageDigest.getInstance("SHA-256").digest("password".getBytes())), 1, versionKey, apiKey);
    31. System.out.println("Version key: " + versionKey + ", sessionHandlePart: " + sessionHandlePart);
    32. }
    33.  
    34. public long doQuerySysStatus(int service, int country, String apiKey) throws SoapFault {
    35. PropertyInfo sysvar = createPropertyInfo("sysvar", service);
    36. PropertyInfo countryId = createPropertyInfo("countryId", country);
    37. PropertyInfo webapiKey = createPropertyInfo("webapiKey", apiKey);
    38.  
    39. SoapObject response = this.sendSoap("DoQuerySysStatusRequest", "#doQuerySysStatus", sysvar, countryId, webapiKey);
    40. return Long.parseLong(response.getPropertyAsString("verKey"));
    41. }
    42.  
    43. public String doLogin(String login, String passwordHash, int country, long versionKey, String apiKey) throws SoapFault {
    44. PropertyInfo userLogin = createPropertyInfo("userLogin", login);
    45. PropertyInfo userHashPassword = createPropertyInfo("userHashPassword", passwordHash);
    46. PropertyInfo countryCode = createPropertyInfo("countryCode", country);
    47. PropertyInfo webapiKey = createPropertyInfo("webapiKey", apiKey);
    48. PropertyInfo localVersion = createPropertyInfo("localVersion", versionKey);
    49.  
    50. SoapObject response = this.sendSoap("DoLoginEncRequest", "#doLoginEnc", userLogin, userHashPassword, countryCode, webapiKey, localVersion);
    51. return response.getPropertyAsString("sessionHandlePart");
    52. }
    53.  
    54. protected SoapObject sendSoap(String methodName, String soapAction, PropertyInfo... properties) throws SoapFault {
    55. SoapObject request = new SoapObject(this.namespace, methodName);
    56. for (PropertyInfo property : properties) {
    57. request.addPropertyIfValue(property);
    58. }
    59.  
    60. SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(this.soapVersion);
    61. envelope.implicitTypes = true; // removes i:type attribute for SimpleTypes
    62. envelope.setAddAdornments(false); // removes id & c:root attributes
    63. envelope.setOutputSoapObject(request);
    64.  
    65. Transport transport = new HttpTransportSE(this.endpointUri);
    66. try {
    67. transport.call(soapAction, envelope);
    68. } catch (XmlPullParserException | IOException e) {
    69. throw new IllegalStateException(e.getMessage(), e);
    70. }
    71.  
    72. if (envelope.bodyIn instanceof SoapFault) {
    73. throw (SoapFault) envelope.bodyIn;
    74. }
    75.  
    76. return (SoapObject) envelope.bodyIn;
    77. }
    78.  
    79. protected PropertyInfo createPropertyInfo(String key, Object value) {
    80. PropertyInfo property = new PropertyInfo();
    81. property.setName(key);
    82. property.setValue(value);
    83. property.setNamespace(this.namespace);
    84. return property;
    85. }
    86. }