4

我正在使用 Netsuite Web 服务 (SuiteTalk) api,但在使用 tokenPassport 时不断收到无效登录尝试错误。由于令牌身份验证看起来相当复杂,我将包括我已采取的所有步骤。

我已从 Setup > Integration > Web Service Preferences 中检索了帐户 ID

我设置了一个未选中所有身份验证框的新角色。在权限 > 设置中,我添加了以下权限

  • 访问令牌管理 = 完整

  • 用户访问令牌 = 完整

  • 网络服务 = 完整

我已将新角色添加到我的用户访问权限

我在设置 > 集成 > 管理器集成中创建了一个新应用程序 在身份验证选项卡下我选择了基于令牌的身份验证

我在设置 > 用户/角色 > 访问令牌中创建了一个新的访问令牌,并具有以下设置

  • 应用程序名称 = 新应用程序

  • 用户 = 我

  • 角色 = 新角色

  • 令牌名称=重命名为有意义的东西

我的请求 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

如果有人可以提供任何帮助,将不胜感激。

4

3 回答 3

4

您需要添加名为“使用访问令牌登录”的角色权限

于 2018-07-05T15:17:13.220 回答
3

刚刚遇到了一种新的味道,这是一个巨大的浪费时间。

场景如下 - 在 SANDBOX 刷新后,为用户、角色和集成生成了新的令牌。请注意,用户、角色和集成是从 PROD 刷新的。

不管做了什么,尝试将令牌与 SuiteTalk 一起使用会在 Login Audit Trail 中生成“permission_denied”错误。

每个 NS 支持 - 我添加了一个新角色、一个新集成和生成的新令牌,但仍然收到用户的“permission_denied”。

解决方案是添加并删除每个受影响用户的全局权限。

一旦我从每个受影响的用户添加和删除任何全局权限,这个问题就解决了。我强调“任何”权限(任何全局权限,甚至是与正在使用的功能完全无关的全局权限)

于 2019-01-03T03:02:04.273 回答
2

我最近遇到了同样的问题。

尝试登录您的 Netsuite 并检查登录审计特征(确保您使用的是高级搜索,并添加了详细信息列)。

因此,在详细信息列中,您可以找出登录的真正问题所在。

至于我,首先是 InvalidTimestamp,原因是我为我的肥皂请求重用了相同的时间戳。

第二个错误是permission_denied,这个有点棘手,浪费了我几个小时,最后发现我的大学设置了错误的token。

希望这会有所帮助。

于 2018-09-21T06:02:06.600 回答