Я использую API-интерфейс веб-служб Netsuite (SuiteTalk), но получаю сообщение об ошибке «Неправильная попытка входа в систему» при использовании tokenPassport. Поскольку аутентификация токена кажется довольно сложной, я включу все шаги, которые я предпринял.
Я получил идентификатор учетной записи в меню «Настройка»> «Интеграция»> «Настройки веб-службы»
Я установил новую роль со всеми флажками Аутентификации.
В разрешениях> Настройка я добавил следующие разрешения
Я добавил новую роль в мои права доступа пользователя
Я создал новое приложение в меню «Настройка»> «Интеграция»> «Интеграция с менеджерами».
На вкладке Аутентификация я выбрал аутентификацию на основе TOKEN
Я создал новый токен доступа в меню «Настройка»> «Пользователи / роли»> «Токены доступа» со следующими настройками
Мой запрос xml выглядит как
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:msg="urn:messages_2016_2.platform.webservices.netsuite.com"
xmlns:core="urn:core_2016_2.platform.webservices.netsuite.com">
<env:Header>
<msg:tokenPassport>
<core:account>123XXXX_SB1</core:account>
<core:consumerKey>MY_CONSUMER_KEY</cre:consumerKey>
<core:token>MY_TOKEN_ID</core:token>
<core:nonce>ZcVszy7ySJ3Ji8PIgwlW</core:nonce>
<core:timestamp>1530692570</core:timestamp>
<core:signature algorithm="HMAC-SHA256">nN7V4PH9qWNT9BocMQzKcFetqZ3QxpxutDJ8iZjSmH8=</core:signature>
</msg:tokenPassport>
</env:Header>
<env:Body>
<msg:get>
<msg:baseRef xsi:type="core:RecordRef" internalId="1234567" type="customer"/>
</msg:get>
</env:Body>
</env:Envelope>
Я использую следующий класс ruby для генерации одноразового номера и подписи
class NetSuiteToken
attr_reader :account, :consumer_key, :consumer_secret, :token_id, :token_secret
def initialize(account, consumer_key, consumer_secret, token_id, token_secret)
@account = account.to_s
@consumer_key = consumer_key
@consumer_secret = consumer_secret
@token_id = token_id
@token_secret = token_secret
end
def passport
{
'msg:tokenPassport' => {
'core:account' => account,
'core:consumerKey' => consumer_key,
'core:token' => token_id,
'core:nonce' => nonce,
'core:timestamp' => timestamp,
'core:signature' => signature,
:attributes! => { 'core:signature' => { 'algorithm' => 'HMAC-SHA256' } }
}
}
end
private
def signature
Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'), signature_key, signature_data))
end
def signature_key
"#{consumer_secret}&#{token_secret}"
end
def signature_data
"#{account}&#{consumer_key}&#{token_id}&#{nonce}&#{timestamp}"
end
def nonce
@nonce ||= Array.new(20) { alphanumerics.sample }.join
end
def alphanumerics
[*'0'..'9',*'A'..'Z',*'a'..'z']
end
def timestamp
@timestamp ||= Time.now.to_i
end
end
Если кто-нибудь может предложить какую-либо помощь, она будет очень признательна.