【问题标题】:How to call API (Oauth 1.0)?如何调用 API(Oauth 1.0)?
【发布时间】:2014-10-14 15:21:44
【问题描述】:

我正在尝试调用此 API(Oauth1.0 标准):

https://appcenter.intuit.com/api/v1/Connection/Reconnect

而我正在做的是:(它正在使用 java)

Base64Encoder baseEncoder = Base64Encoder.getInstance();
            CloseableHttpClient httpclient = HttpClients.createDefault();
            HttpGet httpGet = new HttpGet("https://appcenter.intuit.com/api/v1/connection/reconnect");
            StringBuilder headerReq = new StringBuilder();
            headerReq.append("OAuth ");
            headerReq.append("oauth_token=\"").append(OAUTHTOKEN).append("\"");
            headerReq.append(", oauth_consumer_key=\"").append(CUNSUMER_KEY).append("\"");
            headerReq.append(", oauth_signature_method=\"base64\"");
            headerReq.append(", oauth_signature=\"")          .append(baseEncoder.encode(PropsUtil.get(OAUTH_CONSUMER_SECRET).getBytes()))
                    .append(baseEncoder.encode("&".getBytes()))            .append(baseEncoder.encode(symmetricEncrypter.decryptData(OAUTH_TOKEN_SECRET).getBytes())).append("\"");
            headerReq.append(", oauth_version=\"1.0\"");
            httpGet.addHeader("Authorization", headerReq.toString());
            CloseableHttpResponse response = httpclient.execute(httpGet);
            try {
                System.out.println("Responsee::"+ response.getStatusLine());
}

而且,我得到的回应是:

<?xml version="1.0" encoding="utf-8"?>
<PlatformResponse xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://platform.intuit.com/api/v1">
  <ErrorMessage>This API requires Authorization.</ErrorMessage>
  <ErrorCode>22</ErrorCode>

您能否建议我在为 Oauth1.0 标准创建请求时缺少什么 或者请任何人都可以向我提供 Oauth1.0 请求示例的示例代码在那个标准上。

非常感谢。

【问题讨论】:

    标签: java api oauth intuit-partner-platform reconnect


    【解决方案1】:

    PFB 工作代码。希望对你有用。

    import java.io.InputStream;
    import java.io.StringWriter;
    import java.net.URI;
    import java.net.URISyntaxException;
    
    import oauth.signpost.OAuthConsumer;
    import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
    import oauth.signpost.exception.OAuthCommunicationException;
    import oauth.signpost.exception.OAuthExpectationFailedException;
    import oauth.signpost.exception.OAuthMessageSignerException;
    import oauth.signpost.signature.AuthorizationHeaderSigningStrategy;
    
    import org.apache.commons.io.IOUtils;
    import org.apache.http.HttpHost;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpRequestBase;
    import org.apache.http.impl.client.DefaultHttpClient;
    
    import com.intuit.ipp.data.Account;
    import com.intuit.ipp.exception.FMSException;
    import com.intuit.ipp.net.MethodType;
    import com.intuit.ipp.services.DataService;
    
    public class POCWithoutDevkitTest {
    
        private DataService service;
        private OAuthConsumer oAuthConsumer;
        private static String realmID = null;
    
        public POCWithoutDevkitTest() {
            realmID = "122294642099";
            String consumerKey = "AAAAA";
            String consumerSecret = "BBBBB";
            String accessToken = "CCCCC";
            String accessTokenSecret = "DDDDD";
    
            setupContext(consumerKey, consumerSecret, accessToken, accessTokenSecret);
        }
    
        public void setupContext(String consumerKey, String consumerSecret, String accessToken, String accessTokenSecret) {
                this.oAuthConsumer = new CommonsHttpOAuthConsumer(consumerKey, consumerSecret);
                oAuthConsumer.setTokenWithSecret(accessToken, accessTokenSecret);
                oAuthConsumer.setSigningStrategy(new AuthorizationHeaderSigningStrategy());
        }
    
        public void authorize(HttpRequestBase httpRequest) throws FMSException {
            try {
                oAuthConsumer.sign(httpRequest);
            } catch (OAuthMessageSignerException e) {
                throw new FMSException(e);
            } catch (OAuthExpectationFailedException e) {
                throw new FMSException(e);
            } catch (OAuthCommunicationException e) {
                throw new FMSException(e);
            }
        }
    
        public void executeGetRequest(String customURIString){
            DefaultHttpClient client = new DefaultHttpClient();
            client.getParams().setParameter("http.protocol.content-charset", "UTF-8");
    
            HttpRequestBase httpRequest = null;
            URI uri = null;
    
            try {
                uri = new URI(customURIString);
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }
    
            String methodtype = "GET";
    
            if (methodtype.equals(MethodType.GET.toString())) {
                httpRequest = new HttpGet(uri);
            }
    
            httpRequest.addHeader("content-type", "application/xml");
            httpRequest.addHeader("Accept","application/xml");
    
            try {
                authorize(httpRequest);
            } catch (FMSException e) {
                e.printStackTrace();
            }
    
    
            HttpResponse httpResponse = null;
            try {
                HttpHost target = new HttpHost(uri.getHost(), -1, uri.getScheme());
                httpResponse = client.execute(target, httpRequest);
                System.out.println("Connection status : " + httpResponse.getStatusLine());
    
                InputStream inputStraem = httpResponse.getEntity().getContent();
    
                StringWriter writer = new StringWriter();
                IOUtils.copy(inputStraem, writer, "UTF-8");
                String output = writer.toString();
    
                System.out.println(output);
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    
        public static void main(String args[]) {
            POCWithoutDevkitTest withoutDevkitClient = new POCWithoutDevkitTest();
            withoutDevkitClient.executeGetRequest("https://appcenter.intuit.com/api/v1/connection/reconnect");
        }
    
    }
    

    依赖关系

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpcore</artifactId>
            <version>4.3.1</version>
        </dependency>
        <dependency>
            <groupId>oauth.signpost</groupId>
            <artifactId>signpost-core</artifactId>
            <version>1.2.1.1</version>
        </dependency>
        <dependency>
            <groupId>oauth.signpost</groupId>
            <artifactId>signpost-commonshttp4</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-io</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
            <version>4.3.1</version>
        </dependency>
    

    谢谢

    【讨论】:

    • 我只有消费者密钥和消费者秘密是否可以仅使用这两个来实现?
    • 嗨@Alekya,不,这是不可能的。使用开发者令牌(consumerKey、consumerSecret),您需要生成特定于最终用户资源/领域的 AccessToken 和 AccessToken。您需要这 4 个令牌才能使用 OAuth1 调用 API。
    【解决方案2】:

    当所有密钥都在手时,这是 java 中有效的 HTTP GET 请求代码。希望它能做你的工作。

    import java.io.IOException;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import oauth.signpost.OAuthConsumer;
    import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
    import oauth.signpost.exception.OAuthCommunicationException;
    import oauth.signpost.exception.OAuthExpectationFailedException;
    import oauth.signpost.exception.OAuthMessageSignerException;
    import org.apache.http.*;
    import org.apache.http.client.*;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.client.methods.*;  //HttpHead, HttpPut, HttpGet, etc...
    import org.apache.http.util.EntityUtils;
    
    public class HttpGetRequest {
    
    public static void demo() throws IOException {           
        String consumer_key = "bcd";
        String consumer_secret = "efg";
        String access_token = "rst";
        String access_secret= "xzy";
    
        OAuthConsumer consumer = new CommonsHttpOAuthConsumer(consumer_key,
    consumer_secret);
        consumer.setTokenWithSecret(access_token, access_secret);
    
    
        String uri = "your url here";
        HttpClient httpclient = new DefaultHttpClient();
        HttpGet httpget = new HttpGet(uri);
        try {
            consumer.sign(httpget);
        } catch (OAuthMessageSignerException ex) {
            Logger.getLogger(HttpRequest.class.getName()).log(Level.SEVERE,       null, ex);
        } catch (OAuthExpectationFailedException ex) {
            Logger.getLogger(HttpRequest.class.getName()).log(Level.SEVERE, null, ex);
        } catch (OAuthCommunicationException ex) {
            Logger.getLogger(HttpRequest.class.getName()).log(Level.SEVERE, null, ex);
        }
        HttpResponse response = httpclient.execute(httpget);
        System.out.println(response.getStatusLine().toString());
        HttpEntity entity = response.getEntity();
        System.out.println();
        System.out.println(EntityUtils.toString(entity));       
    }
    public static void main(String[] args) {
        try {
            demo();
        }
        catch(IOException ioe) {
            System.out.println(ioe);
        }
    }
    }
    

    【讨论】:

    • 我只有消费者密钥和消费者秘密是否可以仅使用这两个来实现?
    【解决方案3】:

    这是我为构建 OAuth v1 授权标头而创建的构建器。您可能会发现它很有用。

    https://gist.github.com/robotdan/33f5834399b6b30fea2ae59e87823e1d

    调用 Twitter 的示例用法:

    String authorizationHeader = new OAuth1AuthorizationHeaderBuilder()
             .withMethod("POST")
             .withURL("https://api.twitter.com/oauth/access_token")
             .withConsumerSecret("twitterConsumerSecret")
             .withTokenSecret("your_oauth_token_secret")
             .withParameter("oauth_consumer_key", "your_consumer_key")
             .withParameter("oauth_token", "your_oauth_token")
             .build()
    

    【讨论】:

      【解决方案4】:

      这是使用 Oauth-1 并仅使用消费者密钥和消费者秘密调用 Rest API 的代码-

      import java.io.InputStream;
      import java.io.StringWriter;
      import java.net.URI;
      import java.net.URISyntaxException;
      
      import oauth.signpost.OAuthConsumer;
      import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
      import oauth.signpost.exception.OAuthCommunicationException;
      import oauth.signpost.exception.OAuthExpectationFailedException;
      import oauth.signpost.exception.OAuthMessageSignerException;
      import oauth.signpost.signature.AuthorizationHeaderSigningStrategy;
      
      import org.apache.commons.io.IOUtils;
      import org.apache.http.HttpHost;
      import org.apache.http.HttpResponse;
      import org.apache.http.client.methods.HttpGet;
      import org.apache.http.client.methods.HttpRequestBase;
      import org.apache.http.impl.client.DefaultHttpClient;
      import javax.swing.text.html.FormSubmitEvent;
      
      public class Oauth1RestCallWithOutToken {
          private OAuthConsumer oAuthConsumer;
      
          public Oauth1RestCallWithOutToken() {
              String consumerKey = "my consumer key";
              String consumerSecret = "my consumer secret";
              setupContext(consumerKey, consumerSecret);
          }
      
          public void setupContext(String consumerKey, String consumerSecret) {
              this.oAuthConsumer = new CommonsHttpOAuthConsumer(consumerKey, consumerSecret);
              //oAuthConsumer.setTokenWithSecret("", "");
              oAuthConsumer.setSigningStrategy(new AuthorizationHeaderSigningStrategy());
          }
      
          public void authorize(HttpRequestBase httpRequest)  {
              try {
                  oAuthConsumer.sign(httpRequest);
              } catch (OAuthMessageSignerException e) {
                  //throw new FMSException(e);
              } catch (OAuthExpectationFailedException e) {
                  //throw new FMSException(e);
              } catch (OAuthCommunicationException e) {
                  //throw new FMSException(e);
              }
          }
      
          public void executeGetRequest(String customURIString){
              DefaultHttpClient client = new DefaultHttpClient();
              client.getParams().setParameter("http.protocol.content-charset", "UTF-8");
      
              HttpRequestBase httpRequest = null;
              URI uri = null;
      
              try {
                  uri = new URI(customURIString);
              } catch (URISyntaxException e) {
                  e.printStackTrace();
              }
      
              String methodtype = "GET";
      
              if (methodtype.equals(FormSubmitEvent.MethodType.GET.toString())) {
                  httpRequest = new HttpGet(uri);
              }
      
              httpRequest.addHeader("content-type", "application/json");
              httpRequest.addHeader("Accept","application/json");
      
              try {
                  authorize(httpRequest);
              } catch (Exception e) {
                  e.printStackTrace();
              }
      
      
              HttpResponse httpResponse = null;
              try {
                  HttpHost target = new HttpHost(uri.getHost(), -1, uri.getScheme());
                  httpResponse = client.execute(target, httpRequest);
                  System.out.println("Connection status : " + httpResponse.getStatusLine());
      
                  InputStream inputStraem = httpResponse.getEntity().getContent();
      
                  StringWriter writer = new StringWriter();
                  IOUtils.copy(inputStraem, writer, "UTF-8");
                  String output = writer.toString();
      
                  System.out.println(output);
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
      
          public static void main(String args[]) {
              String url="my url";
              
              Oauth1RestCallWithOutToken withoutDevkitClient = new Oauth1RestCallWithOutToken();
              withoutDevkitClient.executeGetRequest(url);
          }
      
      }
      

      依赖关系-

      <dependencies>
              <dependency>
                  <groupId>org.apache.httpcomponents</groupId>
                  <artifactId>httpcore</artifactId>
                  <version>4.3.1</version>
              </dependency>
              <dependency>
                  <groupId>oauth.signpost</groupId>
                  <artifactId>signpost-core</artifactId>
                  <version>1.2.1.1</version>
              </dependency>
              <dependency>
                  <groupId>oauth.signpost</groupId>
                  <artifactId>signpost-commonshttp4</artifactId>
                  <version>1.2</version>
              </dependency>
              <dependency>
                  <groupId>org.apache.commons</groupId>
                  <artifactId>commons-io</artifactId>
                  <version>1.3.2</version>
              </dependency>
              <dependency>
                  <groupId>org.apache.httpcomponents</groupId>
                  <artifactId>httpmime</artifactId>
                  <version>4.3.1</version>
              </dependency>
          </dependencies>
      

      【讨论】:

        猜你喜欢
        • 2015-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-18
        • 1970-01-01
        • 1970-01-01
        • 2014-01-26
        • 2016-05-19
        相关资源
        最近更新 更多