如何使用OAuth 1.0在java中获取访问令牌?

如何使用OAuth 1.0在java中获取访问令牌?,java,rest,oauth,Java,Rest,Oauth,要求:我想访问驻留在云应用程序中的资源 public static String getAccessToken(){ final String baseURI = "http://bmh1060149:8080"; final String consumerKey = "hardcoded-consumer"; final String consumerPrivatekey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgE

要求:我想访问驻留在云应用程序中的资源

public static String getAccessToken(){  

    final String baseURI = "http://bmh1060149:8080";
    final String consumerKey = "hardcoded-consumer";
    final String consumerPrivatekey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDFkPMZQaTqsSXI+bSI65rSVaDzic6WFA3WCZMVMi7lYXJAUdkXo4DgdfvEBO21Bno3bXIoxqS411G8S53I39yhSp7z2vcB76uQQifi0LEaklZfbTnFUXcKCyfwgKPp0tQVA+JZei6hnscbSw8qEItdc69ReZ6SK+3LHhvFUUP1nLhJDsgdPHRXSllgZzqvWAXQupGYZVANpBJuK+KAfiaVXCgA71N9xx/5XTSFi5K+e1T4HVnKAzDasAUt7Mmad+1PE+56Gpa73FLk1Ww+xaAEvss6LehjyWHM5iNswoNYzrNS2k6ZYkDnZxUlbrPDELETbz/n3YgBHGUlyrXi2PBjAgMBAAECggEAAtMctqq6meRofuQbEa4Uq5cv0uuQeZLV086VPMNX6k2nXYYODYl36T2mmNndMC5khvBYpn6Ykk/5yjBmlB2nQOMZPLFPwMZVdJ2Nhm+naJLZC0o7fje49PrN2mFsdoZeI+LHVLIrgoILpLdBAz/zTiW+RvLvMnXQU4wdp4eO6i8J/Jwh0AY8rWsAGkk1mdZDwklPZZiwR3z+DDsDwPxFs8z6cE5rWJd2c/fhAQrHwOXyrQPsGyLHTOqS3BkjtEZrKRUlfdgV76VlThwrE5pAWuO0GPyfK/XCklwcNS1a5XxCOq3uUogWRhCsqUX6pYfAVS6xzX56MGDndQVlp7U5uQKBgQDyTDwhsNTWlmr++FyYrc6liSF9NEMBNDubrfLJH1kaOp590bE8fu3BG0UlkVcueUr05e33Kx1DMSFW72lR4dht1jruWsbFp6LlT3SUtyW2kcSet3fC8gySs2r6NncsZ2XFPoxTkalKpQ1atGoBe3XIKeT8RDZtgoLztQy7/7yANQKBgQDQvSHEKS5SttoFFf4YkUh2QmNX5m7XaDlTLB/3xjnlz8NWOweK1aVysb4t2Tct/SR4ZZ/qZDBlaaj4X9h9nlxxIMoXEyX6Ilc4tyCWBXxn6HFMSa/Rrq662Vzz228cPvW2XGOQWdj7IqwKO9cXgJkI5W84YtMtYrTPLDSjhfpxNwKBgGVCoPq/iSOpN0wZhbE1KiCaP8mwlrQhHSxBtS6CkF1a1DPm97g9n6VNfUdnB1Vf0YipsxrSBOe416MaaRyUUzwMBRLqExo1pelJnIIuTG+RWeeu6zkoqUKCAxpQuttu1uRo8IJYZLTSZ9NZhNfbveyKPa2D4G9B1PJ+3rSO+ztlAoGAZNRHQEMILkpHLBfAgsuC7iUJacdUmVauAiAZXQ1yoDDo0Xl4HjcvUSTMkccQIXXbLREh2w4EVqhgR4G8yIk7bCYDmHvWZ2o5KZtD8VO7EVI1kD0z4Zx4qKcggGbp2AINnMYqDetopX7NDbB0KNUklyiEvf72tUCtyDk5QBgSrqcCgYEAnlg3ByRd/qTFz/darZi9ehT68Cq0CS7/B9YvfnF7YKTAv6J2Hd/i9jGKcc27x6IMi0vf7zrqCyTMq56omiLdu941oWfsOnwffWRBInvrUWTj6yGHOYUtg2z4xESUoFYDeWwe/vX6TugL3oXSX3Sy3KWGlJhn/OmsN2fgajHRip0=";

    AtlassianOAuthClient jiraoAuthClient = new AtlassianOAuthClient(consumerKey, consumerPrivatekey, baseURI, "");
    TokenSecretVerifierHolder requestToken = jiraoAuthClient.getRequestToken();
    String authorizeUrl = jiraoAuthClient.getAuthorizeUrlForToken(requestToken.token);
    String token = requestToken.token;
    String tokenSecret = requestToken.secret;
    System.out.println("Token is " + requestToken.token);
    System.out.println("Token secret is " + requestToken.secret);
    System.out.println("Retrieved request token. go to " + authorizeUrl);
此云应用程序为我提供了以下详细信息,以便通过OAuth 1.0身份验证访问资源

OAuth凭据

1. Request Token URL
2. Authorise URL
3. Access Token URL
4. API Endpoint URL
  • 用户密钥
  • 消费者秘密
  • OAuth请求URL

    1. Request Token URL
    2. Authorise URL
    3. Access Token URL
    4. API Endpoint URL
    
    我编写了以下java代码来获取请求令牌请求令牌机密。我将请求令牌和密码存储在属性文件中,用于检索访问令牌

    OAuthAccessor accessor = createOAuthAccessor();
                OAuthClient client = new OAuthClient(new HttpClient4());
                    client.getRequestToken(accessor);
    
     props.setProperty("requestToken", accessor.requestToken);
                    props.setProperty("tokenSecret", accessor.tokenSecret);
    
    
     private OAuthAccessor createOAuthAccessor(){
            String consumerKey = props.getProperty("consumerKey");
            String callbackUrl = null;
            String consumerSecret = props.getProperty("consumerSecret");
    
            String reqUrl = props.getProperty("requestUrl");
            String authzUrl = props.getProperty("authorizationUrl");
            String accessUrl = props.getProperty("accessUrl");
    
            OAuthServiceProvider provider
                    = new OAuthServiceProvider(reqUrl, authzUrl, accessUrl);
            OAuthConsumer consumer
                    = new OAuthConsumer(callbackUrl, consumerKey,
                    consumerSecret, provider);
            return new OAuthAccessor(consumer);
        }
    
    属性文件详细信息:

    requestToken= generated by service provider
    authorizationUrl= Authorise URL provided by cloud application
    consumerSecret= Consumer Secret provided by cloud application
    accessUrl=Access Token URL provided by cloud application
    tokenSecret= generated by service provider
    requestUrl= Request Token URL provided by cloud application
    consumerKey= Consumer Secret provided by cloud application
    appName= API Endpoint URL provided by cloud application
    
    我能够使用云应用提供的请求令牌URL从服务提供商处检索请求令牌请求令牌机密

    public static String getAccessToken(){  
    
        final String baseURI = "http://bmh1060149:8080";
        final String consumerKey = "hardcoded-consumer";
        final String consumerPrivatekey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDFkPMZQaTqsSXI+bSI65rSVaDzic6WFA3WCZMVMi7lYXJAUdkXo4DgdfvEBO21Bno3bXIoxqS411G8S53I39yhSp7z2vcB76uQQifi0LEaklZfbTnFUXcKCyfwgKPp0tQVA+JZei6hnscbSw8qEItdc69ReZ6SK+3LHhvFUUP1nLhJDsgdPHRXSllgZzqvWAXQupGYZVANpBJuK+KAfiaVXCgA71N9xx/5XTSFi5K+e1T4HVnKAzDasAUt7Mmad+1PE+56Gpa73FLk1Ww+xaAEvss6LehjyWHM5iNswoNYzrNS2k6ZYkDnZxUlbrPDELETbz/n3YgBHGUlyrXi2PBjAgMBAAECggEAAtMctqq6meRofuQbEa4Uq5cv0uuQeZLV086VPMNX6k2nXYYODYl36T2mmNndMC5khvBYpn6Ykk/5yjBmlB2nQOMZPLFPwMZVdJ2Nhm+naJLZC0o7fje49PrN2mFsdoZeI+LHVLIrgoILpLdBAz/zTiW+RvLvMnXQU4wdp4eO6i8J/Jwh0AY8rWsAGkk1mdZDwklPZZiwR3z+DDsDwPxFs8z6cE5rWJd2c/fhAQrHwOXyrQPsGyLHTOqS3BkjtEZrKRUlfdgV76VlThwrE5pAWuO0GPyfK/XCklwcNS1a5XxCOq3uUogWRhCsqUX6pYfAVS6xzX56MGDndQVlp7U5uQKBgQDyTDwhsNTWlmr++FyYrc6liSF9NEMBNDubrfLJH1kaOp590bE8fu3BG0UlkVcueUr05e33Kx1DMSFW72lR4dht1jruWsbFp6LlT3SUtyW2kcSet3fC8gySs2r6NncsZ2XFPoxTkalKpQ1atGoBe3XIKeT8RDZtgoLztQy7/7yANQKBgQDQvSHEKS5SttoFFf4YkUh2QmNX5m7XaDlTLB/3xjnlz8NWOweK1aVysb4t2Tct/SR4ZZ/qZDBlaaj4X9h9nlxxIMoXEyX6Ilc4tyCWBXxn6HFMSa/Rrq662Vzz228cPvW2XGOQWdj7IqwKO9cXgJkI5W84YtMtYrTPLDSjhfpxNwKBgGVCoPq/iSOpN0wZhbE1KiCaP8mwlrQhHSxBtS6CkF1a1DPm97g9n6VNfUdnB1Vf0YipsxrSBOe416MaaRyUUzwMBRLqExo1pelJnIIuTG+RWeeu6zkoqUKCAxpQuttu1uRo8IJYZLTSZ9NZhNfbveyKPa2D4G9B1PJ+3rSO+ztlAoGAZNRHQEMILkpHLBfAgsuC7iUJacdUmVauAiAZXQ1yoDDo0Xl4HjcvUSTMkccQIXXbLREh2w4EVqhgR4G8yIk7bCYDmHvWZ2o5KZtD8VO7EVI1kD0z4Zx4qKcggGbp2AINnMYqDetopX7NDbB0KNUklyiEvf72tUCtyDk5QBgSrqcCgYEAnlg3ByRd/qTFz/darZi9ehT68Cq0CS7/B9YvfnF7YKTAv6J2Hd/i9jGKcc27x6IMi0vf7zrqCyTMq56omiLdu941oWfsOnwffWRBInvrUWTj6yGHOYUtg2z4xESUoFYDeWwe/vX6TugL3oXSX3Sy3KWGlJhn/OmsN2fgajHRip0=";
    
        AtlassianOAuthClient jiraoAuthClient = new AtlassianOAuthClient(consumerKey, consumerPrivatekey, baseURI, "");
        TokenSecretVerifierHolder requestToken = jiraoAuthClient.getRequestToken();
        String authorizeUrl = jiraoAuthClient.getAuthorizeUrlForToken(requestToken.token);
        String token = requestToken.token;
        String tokenSecret = requestToken.secret;
        System.out.println("Token is " + requestToken.token);
        System.out.println("Token secret is " + requestToken.secret);
        System.out.println("Retrieved request token. go to " + authorizeUrl);
    
    然后,我使用生成的请求令牌和请求令牌secret通过以下代码获得访问令牌

    OAuthAccessor accessor = createOAuthAccessor();
    accessor.tokenSecret = props.getProperty("tokenSecret");
    OAuthClient client = new OAuthClient(new HttpClient4());
    return client.invoke(accessor, "GET",  url, params);
    
    执行上述检索访问令牌的代码后,我得到了以下异常

    如果我在上面的代码中将API端点URL/Resource作为URL参数的值传递给client.invoke(),那么我将得到以下异常

    > <<<<<<<< HTTP response: HTTP/1.1 401 Unauthorized Cache-Control:
    > private Content-Type: text/html; charset=utf-8 WWW-Authenticate: OAuth
    > Realm="115.248.52.162" X-S: 445759-O1VMAP02 Strict-Transport-Security:
    > max-age=31536000 Date: Tue, 18 Jun 2013 06:59:28 GMT Content-Length:
    > 142
    > 
    > Exception in thread "main" net.oauth.OAuthProblemException:
    > token_rejected oauth_problem_advice: Token RZXHZYCCUMNMZA88032WJFB
    > does not match an expected ACCESS token
    
    > <<<<<<<< HTTP response: HTTP/1.1 401 Unauthorized Cache-Control:
    > private Content-Type: text/html; charset=utf-8 WWW-Authenticate: OAuth
    > Realm="49.248.38.202" X-S: 445758-O1VMAP01 Strict-Transport-Security:
    > max-age=31536000 Date: Tue, 18 Jun 2013 05:47:30 GMT Content-Length:
    > 115
    > 
    > oauth_problem=permission_denied&oauth_problem_advice=The%20consumer%20was%20denied%20access%20to%20this%20resource.
    
    >令牌\u拒绝oauth\u问题\u建议:令牌RZXHZYCCUMMZA88032WJFB
    >与预期的访问令牌不匹配
    
    如果我在client.invoke()中将访问令牌URL作为URL参数的值传递,那么我将得到以下异常

    > <<<<<<<< HTTP response: HTTP/1.1 401 Unauthorized Cache-Control:
    > private Content-Type: text/html; charset=utf-8 WWW-Authenticate: OAuth
    > Realm="115.248.52.162" X-S: 445759-O1VMAP02 Strict-Transport-Security:
    > max-age=31536000 Date: Tue, 18 Jun 2013 06:59:28 GMT Content-Length:
    > 142
    > 
    > Exception in thread "main" net.oauth.OAuthProblemException:
    > token_rejected oauth_problem_advice: Token RZXHZYCCUMNMZA88032WJFB
    > does not match an expected ACCESS token
    
    > <<<<<<<< HTTP response: HTTP/1.1 401 Unauthorized Cache-Control:
    > private Content-Type: text/html; charset=utf-8 WWW-Authenticate: OAuth
    > Realm="49.248.38.202" X-S: 445758-O1VMAP01 Strict-Transport-Security:
    > max-age=31536000 Date: Tue, 18 Jun 2013 05:47:30 GMT Content-Length:
    > 115
    > 
    > oauth_problem=permission_denied&oauth_problem_advice=The%20consumer%20was%20denied%20access%20to%20this%20resource.
    

    在没有看到您的云api文档的情况下,我只能假设它们遵循典型的oauth身份验证舞蹈,即:

  • 您从提供程序获取请求令牌(请求令牌url)
  • 使用请求令牌,形成一个身份验证url(通常指向提供者)
  • 将用户重定向到身份验证url(授权url)
  • 用户验证/授权
  • 提供程序使用验证器返回给您
  • 使用验证器和请求令牌交换访问令牌(访问令牌url)
  • 现在,您可以使用访问令牌访问api
  • 所以,除非您遗漏了这些步骤中的某些步骤,否则需要注意的其他事项是:正确地对请求进行签名,为每个步骤使用正确的URL,在每个步骤传递正确的令牌


    此外,请求令牌/密码通常很短,而访问令牌“通常”更长,并且在大多数情况下/系统可以用于多个api请求。

    以下是生成访问令牌的java代码。我已经使用OAuth身份验证将我的通用应用程序集成到Jira中。下面是使用OAuth身份验证访问的java代码。请在应用程序中包括rest-oauth-client-1.0.one-jar

    public static String getAccessToken(){  
    
        final String baseURI = "http://bmh1060149:8080";
        final String consumerKey = "hardcoded-consumer";
        final String consumerPrivatekey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDFkPMZQaTqsSXI+bSI65rSVaDzic6WFA3WCZMVMi7lYXJAUdkXo4DgdfvEBO21Bno3bXIoxqS411G8S53I39yhSp7z2vcB76uQQifi0LEaklZfbTnFUXcKCyfwgKPp0tQVA+JZei6hnscbSw8qEItdc69ReZ6SK+3LHhvFUUP1nLhJDsgdPHRXSllgZzqvWAXQupGYZVANpBJuK+KAfiaVXCgA71N9xx/5XTSFi5K+e1T4HVnKAzDasAUt7Mmad+1PE+56Gpa73FLk1Ww+xaAEvss6LehjyWHM5iNswoNYzrNS2k6ZYkDnZxUlbrPDELETbz/n3YgBHGUlyrXi2PBjAgMBAAECggEAAtMctqq6meRofuQbEa4Uq5cv0uuQeZLV086VPMNX6k2nXYYODYl36T2mmNndMC5khvBYpn6Ykk/5yjBmlB2nQOMZPLFPwMZVdJ2Nhm+naJLZC0o7fje49PrN2mFsdoZeI+LHVLIrgoILpLdBAz/zTiW+RvLvMnXQU4wdp4eO6i8J/Jwh0AY8rWsAGkk1mdZDwklPZZiwR3z+DDsDwPxFs8z6cE5rWJd2c/fhAQrHwOXyrQPsGyLHTOqS3BkjtEZrKRUlfdgV76VlThwrE5pAWuO0GPyfK/XCklwcNS1a5XxCOq3uUogWRhCsqUX6pYfAVS6xzX56MGDndQVlp7U5uQKBgQDyTDwhsNTWlmr++FyYrc6liSF9NEMBNDubrfLJH1kaOp590bE8fu3BG0UlkVcueUr05e33Kx1DMSFW72lR4dht1jruWsbFp6LlT3SUtyW2kcSet3fC8gySs2r6NncsZ2XFPoxTkalKpQ1atGoBe3XIKeT8RDZtgoLztQy7/7yANQKBgQDQvSHEKS5SttoFFf4YkUh2QmNX5m7XaDlTLB/3xjnlz8NWOweK1aVysb4t2Tct/SR4ZZ/qZDBlaaj4X9h9nlxxIMoXEyX6Ilc4tyCWBXxn6HFMSa/Rrq662Vzz228cPvW2XGOQWdj7IqwKO9cXgJkI5W84YtMtYrTPLDSjhfpxNwKBgGVCoPq/iSOpN0wZhbE1KiCaP8mwlrQhHSxBtS6CkF1a1DPm97g9n6VNfUdnB1Vf0YipsxrSBOe416MaaRyUUzwMBRLqExo1pelJnIIuTG+RWeeu6zkoqUKCAxpQuttu1uRo8IJYZLTSZ9NZhNfbveyKPa2D4G9B1PJ+3rSO+ztlAoGAZNRHQEMILkpHLBfAgsuC7iUJacdUmVauAiAZXQ1yoDDo0Xl4HjcvUSTMkccQIXXbLREh2w4EVqhgR4G8yIk7bCYDmHvWZ2o5KZtD8VO7EVI1kD0z4Zx4qKcggGbp2AINnMYqDetopX7NDbB0KNUklyiEvf72tUCtyDk5QBgSrqcCgYEAnlg3ByRd/qTFz/darZi9ehT68Cq0CS7/B9YvfnF7YKTAv6J2Hd/i9jGKcc27x6IMi0vf7zrqCyTMq56omiLdu941oWfsOnwffWRBInvrUWTj6yGHOYUtg2z4xESUoFYDeWwe/vX6TugL3oXSX3Sy3KWGlJhn/OmsN2fgajHRip0=";
    
        AtlassianOAuthClient jiraoAuthClient = new AtlassianOAuthClient(consumerKey, consumerPrivatekey, baseURI, "");
        TokenSecretVerifierHolder requestToken = jiraoAuthClient.getRequestToken();
        String authorizeUrl = jiraoAuthClient.getAuthorizeUrlForToken(requestToken.token);
        String token = requestToken.token;
        String tokenSecret = requestToken.secret;
        System.out.println("Token is " + requestToken.token);
        System.out.println("Token secret is " + requestToken.secret);
        System.out.println("Retrieved request token. go to " + authorizeUrl);
    
    上面的代码将为您提供token、tokenSecret和authorizeUrl。获取授权URL后,将URL粘贴到浏览器中,它将请求允许和拒绝选项。允许它生成验证代码。url被授权后,可以从下面的代码生成访问令牌

        URI uri=null;
        try {
            uri = new URI(authorizeUrl);
        } catch (URISyntaxException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if(Desktop.isDesktopSupported()){
            Desktop desktop = Desktop.getDesktop();
            try {
                desktop.browse(uri);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        String verifier = requestToken.verifier;
    
        String accessToken = jiraoAuthClient.swapRequestTokenForAccessToken(token, tokenSecret, verifier);
        System.out.println("Access token is : " + accessToken);
        return accessToken;
    }
    
    如果您还对通过命令提示符访问OAuth感兴趣,您也可以通过命令提示符访问OAuth。以下是通过命令提示符访问它的步骤

    首先创建一个应用程序链接。关于这一点,你可以参考

    下载rest-oauth-client-1.0.one-jar.jar和rest-oauth-client-1.0-sources.jar并粘贴到本地驱动器中。从那里访问以下命令

    D:\OAuth Jars>java -jar rest-oauth-client-1.0.one-jar.jar requestToken "Your Jira base url"
    
    执行上述命令后,您将获得令牌、令牌机密和检索到的请求令牌

    Token is iJKs7Sq4nI3tK0bTqBYSNNOt9rkwrKK9
    Token secret is qimK5FibcAKD5ACbF2aKEPpiBWltgwET
    Retrieved request token. go to http://bmh1060149:8080/plugins/servlet/oauth/authorize?oauth_token=iJKs7Sq4nI3tK0bTqBYSNNOt9rkwrKK9
    
    然后,您必须通过浏览器调用检索到的请求令牌url以获取验证代码。它会要求你允许或拒绝。如果你点击allow,它会给你验证码

    D:\OAuth Jars>java -jar rest-oauth-client-1.0.one-jar.jar accessToken "Your Jira base url" "iJKs7Sq4nI3tK0bTqBYSNNOt9rkwrKK9" "qimK5FibcAKD5ACbF2aKEPpiBWltgwET" "toYvZB"
    
    这将为您提供访问令牌

    Access token is : zGBqUzmwobyS0GFXrJMIs18lsAUd51Wb
    
    一旦您获得了访问令牌,您就可以从您将传递给它的任何url获取数据

    D:\OAuth Jars>java -jar rest-oauth-client-1.0.one-jar.jar request "zGBqUzmwobyS0GFXrJMIs18lsAUd51Wb" "Your Jira base url/rest/api/2/issue/NWFM-4"
    

    希望这有帮助

    您能提供指向云api的链接吗