【问题标题】:netsuite Token based Authentication基于 netsuite 令牌的身份验证
【发布时间】:2019-09-08 23:25:12
【问题描述】:

我正在尝试通过基于令牌的方式对 netsuite 进行身份验证 我在这里尝试过,但它给出错误

{“错误”:{“代码”:“INVALID_LOGIN_ATTEMPT”,“消息”:“无效 登录尝试。"}}

我参考了stack solution中给出的代码

我现在将数据字符串作为'' 传递,因为我只想进行身份验证。 代码中可能缺少什么,是否可以在没有 Script id 和 deploy id 的情况下运行此代码?

【问题讨论】:

    标签: netsuite


    【解决方案1】:

    不,您无法在没有脚本和部署的情况下运行代码。并且数据字符串应该是一个对象,即使它只是像'{“test”:true}'这样的样本数据。

    另外,您提到的 PHP 在技术上是不完整的。由于并发限制,要正确地将数据发送到 NetSuite 的 RESTLets,您需要实现自动重试。也就是说,它不能帮助您解决仅连接的问题。

    您还应该调用 NetSuite 数据中心以获取正确的 URL。

     * NetSuite SuiteAnser for datacenter calls
     * https://netsuite.custhelp.com/app/answers/detail/a_id/65684
     * 
     * Sample production response:
     * {"webservicesDomain":"https://webservices.na1.netsuite.com","restDomain":"https://rest.na1.netsuite.com","systemDomain":"https://system.na1.netsuite.com"}
    

    【讨论】:

    • 您可以使用帐户特定的 url 而不是每次都查询它,例如https://XXXXXXX.restlets.api.netsuite.com/app/site/hosting/restlet.nl。见system.na2.netsuite.com/app/help/…
    • 我的 url 为 6XXXXX.suitetalk.api.netsuite.com/services/NetSuitePort_2016_1 但它现在给出的错误为 ns1:Client.NoSOAPAction no SOAPAction 标头! partner016.prod.sea.netledger.com 我正在以 application/json @michoel 的形式发送数据
    • 您是在尝试使用 Web 服务还是 Restlets?它们是两种不同的集成方法。
    【解决方案2】:

    我遇到了同样的错误。这发生在我身上是因为我用于身份验证的签名生成方法不正确。您可以从 Netsuite 登录审计跟踪中看到特定的登录尝试错误。以下是我编写的用于生成正确身份验证标头的 Java 代码,它对我有用。

    import javax.crypto.Mac;
    import javax.crypto.spec.SecretKeySpec;
    import javax.swing.text.Document;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.UnsupportedEncodingException;
    import java.net.*;
    import java.security.GeneralSecurityException;
    
    public class Main {
    
        private static final String ALPHA_NUMERIC_STRING = "2312312312312sadadadadNKSNSKMSLMXSX";
        static String OAuth ="null";
    
    
        public static void main(String[] args) {
    
            try {
    
                String oauth_val = mediate();
    
                URL url = new URL("https://rest.na1.netsuite.com/app/site/hosting/restlet.nl?script=xxx&deploy=x");
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("GET");
                conn.setRequestProperty("Accept", "application/json");
                conn.setRequestProperty("Authorization",oauth_val);
                conn.setRequestProperty("Content-Type","application/json");
    
                if (conn.getResponseCode() != 200) {
                    throw new RuntimeException("Failed : HTTP error code : "
                            + conn.getResponseCode());
                }
    
                BufferedReader br = new BufferedReader(new InputStreamReader(
                        (conn.getInputStream())));
    
                String output;
                System.out.println("Output from Server .... \n");
                while ((output = br.readLine()) != null) {
                    System.out.println(output);
                }
    
                conn.disconnect();
    
            } catch (MalformedURLException e) {
    
                e.printStackTrace();
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
            }
    
        }
    
    
    
        public static String randomAlphaNumeric(int count) {
            StringBuilder builder = new StringBuilder();
            while (count-- != 0) {
                int character = (int)(Math.random()*ALPHA_NUMERIC_STRING.length());
                builder.append(ALPHA_NUMERIC_STRING.charAt(character));
            }
            return builder.toString();
        }
    
        private static String computeSignature(String baseString, String keyString) throws GeneralSecurityException, UnsupportedEncodingException {
    
            final String EMPTY_STRING = "";
            final String CARRIAGE_RETURN = "\r\n";
            final String UTF8 = "UTF-8";
            String HMAC_SHA1 = "HmacSHA1";
    
            SecretKeySpec key = new SecretKeySpec(keyString.getBytes(UTF8), HMAC_SHA1);
            Mac mac = Mac.getInstance(HMAC_SHA1);
            mac.init(key);
            byte[] bytes = mac.doFinal(baseString.getBytes(UTF8));
            String base= bytesToBase64String(bytes).replace(CARRIAGE_RETURN, EMPTY_STRING);
            return URLEncoder.encode(base, "UTF-8");
    
        }
    
        private static String bytesToBase64String(byte[] bytes) {
            return Base64Encoder.getInstance().encode(bytes);
        }
    
        public static String mediate() {
            try {
                String BASE_URL =  "https://rest.na1.netsuite.com/app/site/hosting/restlet.nl";
                String HTTP_METHOD =  "GET";
                String TOKEN_ID = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
                String TOKEN_SECRET = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
                String CONSUMER_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
                String CONSUMER_SECRET = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
                String SIGNATURE_METHOD = "HMAC-SHA1";
                String OAUTH_NONCE = randomAlphaNumeric(20);
                String TIME_STAMP = String.valueOf(System.currentTimeMillis() / 1000);
                String OAUTH_VERSION = "1.0";
                String SCRIPT_DEPLOYMENT_ID = "xxx";
                String SCRIPT_ID = "xxx";
                String REALM= "xxxxx";
                Document xmldoc = null;
    
    
    
    
                String data = "";
                data = data + "deploy=" + SCRIPT_DEPLOYMENT_ID + "&";
                data = data + "oauth_consumer_key=" + CONSUMER_KEY + "&";
                data = data + "oauth_nonce=" + OAUTH_NONCE + "&";
                data = data + "oauth_signature_method=" + SIGNATURE_METHOD +"&";
                data = data + "oauth_timestamp=" + TIME_STAMP + "&";
                data = data + "oauth_token=" + TOKEN_ID + "&";
                data = data + "oauth_version=" + OAUTH_VERSION + "&";
                data = data + "script=" + SCRIPT_ID;
                String encodedData = encode(data);
    
                System.out.println("This is the Encoded Data.... : "+ encodedData);
    
                String completeData = HTTP_METHOD + "&" + encode(BASE_URL) + "&"+ encodedData;
    
                System.out.println("This is the completeData.... : "+ completeData);
    
                String key ="";
                key = encode(CONSUMER_SECRET) + "&" + encode(TOKEN_SECRET);
    
                System.out.println("This is the constructed key.... : "+ key);
                String signature= computeSignature(completeData,key);
    
    
                OAuth = "OAuth realm=\"" + REALM + "\",";
                OAuth = OAuth + "oauth_consumer_key=\""+ CONSUMER_KEY + "\",";
                OAuth = OAuth + "oauth_token=\"" + TOKEN_ID + "\",";
                OAuth = OAuth + "oauth_signature_method=\"HMAC-SHA1\",";
                OAuth = OAuth + "oauth_timestamp=\"" + TIME_STAMP + "\",";
                OAuth = OAuth + "oauth_nonce=\"" + OAUTH_NONCE + "\",";
                OAuth = OAuth + "oauth_version=\"" + "1.0" + "\",";
                OAuth = OAuth + "oauth_signature=\"" + signature + "\"";
    
    
                return OAuth;
    
            } catch (UnsupportedEncodingException | GeneralSecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return "error";
        }
    
        private static String encode(String value) {
            String encoded = "";
            try {
                encoded = URLEncoder.encode(value, "UTF-8");
            } catch (Exception e) {
                e.printStackTrace();
            }
            String sb = "";
            char focus;
            for (int i = 0; i < encoded.length(); i++) {
                focus = encoded.charAt(i);
                if (focus == '*') {
                    sb += "%2A";
                } else if (focus == '+') {
                    sb += "%20";
                } else if (focus == '%' && i + 1 < encoded.length()
                        && encoded.charAt(i + 1) == '7' && encoded.charAt(i + 2) == 'E') {
                    sb += '~';
                    i += 2;
                } else {
                    sb += focus;
                }
            }
            return sb.toString();
        }
    
       }
    

    【讨论】:

      猜你喜欢
      • 2021-01-25
      • 2016-01-23
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 2017-07-10
      • 2020-03-03
      • 1970-01-01
      相关资源
      最近更新 更多