2016-10-18 3 views
0

SSO 통합을 TBA (사용자 이름과 암호)로 변환하는 과정이 진행 중입니다. 최근 2016.2 업그레이드 이후 java 코드는 완전히 작동하지 않았습니다 (참고로, 업그레이드 전에는 작동했습니다). 현재 문제는 403 또는 잘못된 타임 스탬프 오류가 발생한다는 것입니다. NetSutie로 작업하면서 이러한 변화가 발생했을 때 어떤 상관 관계도 보이지 않습니다.문제 TBA를 통해 NetSuite에 연결

저는 Java 전문가와는 거리가 멀기 때문에 여기있는 사람이이 코드를 잘못 해석했는지 알 수 있기를 바랍니다. (NetSuite PHP 툴킷을 사용하여 작동시킬 수있었습니다.)

다음은 NetSuite의 아이디어를 사용하여 약간 수정 한 Java 개발자가 가장 많이 얻은 기본 코드입니다.

public class Main{ 
public static void main(String[]args){ 
    String compID="compID"; 
    String consumerKey="consumerKey"; 
    String consumerSecret="consumerSecret"; 
    String tokenId="tokenId"; 
    String tokenSecret="tokenSecret"; 
    String restletURL="https://rest.sandbox.netsuite.com/app/site/hosting/restlet.nl?script=123&deploy=2"; 

    Token token=new Token(tokenId,tokenSecret); 
    String nonce=RandomStringUtils.randomNumeric(9); 
    long ms=new java.util.Date().getTime(); 
    ms=(long)Math.floor(ms/1000); 
    String time=ms+""; 

    String baseString=compID+"&"+consumerKey+"&"+tokenId+"&"+nonce+"&"+time; 
    String key=consumerSecret+"&"+tokenSecret; 
    byte[] bytes=key.getBytes(); 
    SecretKeySpec secretkey=new SecretKeySpec(bytes,"HmacSHA1"); 
    Mac keymac=null; 
    try{ 
     keymac=Mac.getInstance("HmacSHA1"); 
     keymac.init(secretkey); 
    }catch(NoSuchAlgorithmException e){ 
     e.printStackTrace(); 
    }catch(InvalidKeyException e){ 
     e.printStackTrace(); 
    } 
    byte[] hash=keymac.doFinal(baseString.getBytes()); 
    String result=new String(Base64.encodeBase64(hash,false)); 
    String oauth_timestamp = Instant.now().toEpochMilli()+""; 

    String headerAuthorization="OAuth realm=\""+compID+"\", oauth_consumer_key=\""+consumerKey+"\", oauth_token=\""+token+"\", oauth_nonce=\""+nonce+"\", oauth_timestamp=\""+oauth_timestamp+"\", oauth_signature_method=\"HMAC-SHA1\", oauth_version=\"1.0\", oauth_signature=\""+result+"\""; 

    System.out.println(headerAuthorization); 

    HttpClient httpclient=HttpClientBuilder.create().build(); 

    HttpGet request=new HttpGet(restletURL); 
    request.setHeader(HttpHeaders.AUTHORIZATION,headerAuthorization); 

    String response=""; 
    try{ 
     //Handle the response from NetSuite 
     ResponseHandler<String> responseHandler=new ResponseHandler<String>(){ 
      @Override 
      public String handleResponse(final HttpResponse response)throws ClientProtocolException,IOException{ 
       int status=response.getStatusLine().getStatusCode(); 

       //If the call is successful 
       if(status>=200 && status<300){ 
        HttpEntity entity=response.getEntity(); 
        return entity!=null?EntityUtils.toString(entity):null; 
       }else{ 
        throw new ClientProtocolException("Unexpected response status: "+status); 
       } 
      } 
     }; 
     response=httpclient.execute(request,responseHandler); 
     System.out.println(response); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    } 
} 

답변

0

우리는 마침내이 작업을 수행했습니다. NetSuite에서 API가 작동하는 방식이 바뀌 었습니다 (최소한 나에게 말한대로). 이 프로그램을 실행하려면 스크라이브 1.3.7 (Maven Repo)이 필요합니다.

DummyService.java

import org.scribe.builder.api.DefaultApi10a; 
import org.scribe.model.Token; 

public class DummyService extends DefaultApi10a{ 
    @Override 
    public String getAccessTokenEndpoint() { 
    // TODO Auto-generated method stub 
    return null; 
    } 
    @Override 
    public String getAuthorizationUrl(Token arg0) { 
    // TODO Auto-generated method stub 
    return null; 
    } 
    @Override 
    public String getRequestTokenEndpoint() { 
    // TODO Auto-generated method stub 
    return null; 
    } 
} 

TokenAuth.java

import org.scribe.builder.ServiceBuilder; 
import org.scribe.model.OAuthRequest; 
import org.scribe.model.Response; 
import org.scribe.model.SignatureType; 
import org.scribe.model.Token; 
import org.scribe.model.Verb; 
import org.scribe.oauth.OAuthService; 

public class TokenAuth{ 
    private static final String TOKEN_ID="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 
    private static final String TOKEN_SECRET="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 
    private static final String CONSUMER_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 
    private static final String CONSUMER_SECRET="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 
    private static final String REALM="123456"; 
    private static final String CONTENT_TYPE="content-type"; 
    private static final String APP_JSON="application/json"; 

    private static final String REST_URL="https://rest.sandbox.netsuite.com/app/site/hosting/restlet.nl?script=xxx&deploy=x"; 
    private static final String JSON_PAYLOD="{}"; 

    private static OAuthService service=getService(); 
    private static Token accessToken=getToken(); 
    public static void main(String[]args){ 
    Response responseGet=callWithHttpGet(); 
    System.out.println(responseGet.getBody()); 
    Response responsePost=callWithHttpPost(); 
    System.out.println(responsePost.getBody()); 
    } 
    private static Response callWithHttpGet(){ 
    OAuthRequest request=new OAuthRequest(Verb.GET,REST_URL); 
    request.setRealm(REALM); 
    service.signRequest(accessToken,request); 
    return request.send(); 
    } 
    private static Response callWithHttpPost(){ 
    OAuthRequest request=new OAuthRequest(Verb.POST,REST_URL); 
    request.setRealm(REALM); 
    request.addHeader(CONTENT_TYPE,APP_JSON); 
    request.addPayload(JSON_PAYLOD); 
    service.signRequest(accessToken,request); 
    return request.send(); 
    } 
    private static Token getToken(){ 
    return new Token(TOKEN_ID, TOKEN_SECRET); 
    } 
    private static OAuthService getService(){ 
    return new ServiceBuilder().provider(DummyService.class).apiKey(CONSUMER_KEY).apiSecret(CONSUMER_SECRET).signatureType(SignatureType.Header).build(); 
    } 
} 

* 참고 :이 데이터는 이제 업데이트되었습니다 (제외를 다음 두 개의 자바 파일은 아래에 설명 필요 SuiteAnswers 기사의 Scribe 1.3.7 요구 사항)도 마찬가지입니다 (42167 - Java > RESTlet Authentication using Token (Token-Based Authentication))

+0

WebServices (vs RESTlet)에 연결하려면 어떻게 사용할 수 있습니까? – MTranchant