2016-10-18 21 views
0

私たちはSSO統合をTBA(ユーザー名とパスワード)に変換していました。最近の2016.2のアップグレード以来、Javaコードは完全に機能しませんでした(これはアップグレード前に機能しました)。現在の問題は、403または不正なタイムスタンプエラーが発生することです。 NetSutieと協力して、これらの変更が発生したときには何の関係も見られません。問題TBA経由でNetSuiteに接続

私はJavaのエキスパートにはほど遠いので、ここの誰かが助けてこのコードの何が間違っているのかを教えてくれることを願っています(ただし、NetSuite PHPツールキットを使用して動作させることはできました)。

以下は私が試している基本的なコードです(私たちのJava開発者から寄せられたものですが、これを修正しようとしています)、NetSuiteのアイデアを使用して自分自身で少し微調整されました。

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(); 
    } 
} 

*注:このデータは現在更新されている(除くを次に、2つのJavaファイルは、以下の必要SuiteAnswersの記事のScribe 1.3.7の要件)も同様に(42167 - Java > RESTlet Authentication using Token (Token-Based Authentication)

+0

WebServices(vs RESTlet)に接続するには、どうすれば使用できますか? – MTranchant

関連する問題