2015-10-15 111 views
9

目標是能夠從我的Java應用程序中使用OAuth標題而不是NLAuth標題調用RESTlets。爲了實現它,我採取了以下措施:通過OAuth訪問NetSuite RESTlet

  1. 我創建NetSuite的開發者社區的帳戶,並獲得擁有管理員權限(域system.na1.netsuite.com)測試環境。

  2. 我打開設置 - >公司 - >啓用功能。然後打開「SuiteCloud」選項卡並在此處檢查「Client SuiteScript」,「Server SuiteScript」和「基於令牌的身份驗證」。

  3. 我打開了其中一個角色(這裏稱爲「08:檢查」)的編輯頁面。在「權限」選項卡上,我打開「設置」選項卡,併爲該角色添加了以下權限:「訪問令牌管理」,「使用訪問令牌登錄」和「用戶訪問令牌」。

  4. 我編輯了我的帳戶以擁有該角色:在編輯用戶和「角色」選項卡時打開「Access」選項卡我添加了該角色(「08:Inspection」)。

  5. 我打開安裝程序 - >集成 - >管理集成 - >新建並創建新的應用程序(「TestIntegr」)。最後一頁有兩個字符串:消費者密鑰和消費者密碼。我將它們保存在單獨的文件中。

  6. 我打開了設置 - >用戶/角色 - >訪問令牌 - >新建併爲我的應用程序+用戶+角色創建了新的令牌。最後一頁有兩個字符串:Token ID和Token Secret。我將它們保存在單獨的文件中。

  7. 我用我的測試程序來生成授權頭字符串,然後在rest-client(我用「Insomnia」)中使用這個字符串來到達我的dummy-restlet。有「INVALID_LOGIN_ATTEMPT」 - 錯誤。

  8. 在NetSuite audit-logs中,我可以代表我的用戶看到失敗,但沒有角色。

更多關於第7步的技術信息,下面的例子。

我用來達到我僞的Restlet是https://rest.na1.netsuite.com/app/site/hosting/restlet.nl?script=546&deploy=1

於是我產生了 「簽名字符串」 的URL(從第5步 「CONSUMER_KEY」,並從第6步 「令牌」):

GET&https%3A%2F%2Frest.na1.netsuite.com%2Fapp%2Fsite%2Fhosting%2Frestlet.nl&deploy%3D1%26oauth_consumer_key%3D17840f699409f5031c22a6e4af15961e9627c168cd0ae71f9c14f71b4097a0b6%26oauth_nonce%3D1444927941574%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1444927941%26oauth_token%3Df3c29a8b2c7988e00947d8c5836ef0ff1883556d96b8beac5bbbdda001ba0292%26realm%3DTSTDRV1403065%26script%3D546 

然後我使用這個字符串和「consumer_secret & token_secret」生成「簽名」。頭部則有如下的樣子:

OAuth oauth_signature="7doRJOJyV36Av4e4BBUgoOPn7Vk%3D", oauth_nonce="1444927941574", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="17840f699409f5031c22a6e4af15961e9627c168cd0ae71f9c14f71b4097a0b6", oauth_token="f3c29a8b2c7988e00947d8c5836ef0ff1883556d96b8beac5bbbdda001ba0292", oauth_timestamp="1444927941", realm="TSTDRV1403065" 

然後我用我的休息,這個客戶端頭和拿到「INVALID_LOGIN_ATTEMPT」誤差(同時NLAuth頭與此休息的客戶端完美的作品,這個用戶和這個假-restlet)。

我使用這個在線工具檢查了我的簽名算法:http://nouncer.com/oauth/authentication.html它使用相同的標記/時間戳/隨機數/等顯示相同的結果。我想我在設置NetSuite環境(用戶/角色/其他)時漏掉了一些東西。另一方面,NetSuite幫助中心說:「當OAuth標頭中的隨機數,消費者密鑰,令牌或簽名無效時,將返回INVALID_LOGIN_ATTEMPT錯誤。」

請告訴我什麼是錯的。

回答

9

這些步驟似乎是正確的,因爲您可以獲取消費者和用戶密鑰。

可能的錯誤可能在您的java代碼中。我能夠使用Java代碼從RESTLet獲得成功的響應。我使用Scribe-Java作爲OAuth 1a客戶端庫。

下面是我的主要方法

OAuthConfig authConfig = new OAuthConfig("CONSUMER_KEY", "CONSUMER_SECRET", null, SignatureType.Header, null, null); 
    Token token = new Token("TOKEN_ID", "TOKEN_SECRET"); 
    OAuth10aServiceImpl auth10aServiceImpl = new OAuth10aServiceImpl(new NetSuiteApi(), authConfig); 
    OAuthRequest request = new OAuthRequest(Verb.GET, "RESTLET_URL"); 
    request.setRealm("NS_ACCOUNT_ID"); 
    auth10aServiceImpl.signRequest(token, request); 
    Response response = request.send(); 

您還需要編寫NetSuiteApi類,因爲它是由抄寫要求。只是,一個框架開銷

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

public class NetSuiteApi 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; 
} 

} 

另外,請確保用戶或用戶的有權在其部署中執行RESTlet。

+1

謝謝你,prasun! Scribe的例子就像一個魅力。感覺像你對我的Java代碼是正確的。 :( – Logrus