仅使用客户端ID和密钥获取承载令牌。可能吗

时间:2016-07-22 10:48:01

标签: java oauth-2.0 wso2-am

我在独立计算机上安装了WSO2 API Manager。我有一个Java客户端(假设PSVM),其中包含APIM上已注册应用程序的必要客户端ID和秘密。我们是否可以仅使用Java中的客户端ID和密钥获取承载令牌。

请帮助表示感谢。

我有以下代码,但它需要用户名和密码。

public Token getToken(String username,String password,String scopes){

    String submitUrl = GenarateAccessTokenConfiguration.getInstance().getLoginURL();
    String consumerKey = GenarateAccessTokenConfiguration.getInstance().getConsumerKey();
    String consumerSecret = GenarateAccessTokenConfiguration.getInstance().getConsumerSecret();

    try {
        String applicationToken = consumerKey + ":" + consumerSecret;
        BASE64Encoder base64Encoder = new BASE64Encoder();
        applicationToken = "Basic " + base64Encoder.encode(applicationToken.getBytes()).trim();

        String payload = "grant_type=password&username="+username+"&password="+password+"&scope="+scopes;
        HttpResponse httpResponse = httpClient.doPost(submitUrl,applicationToken,
                payload,"application/x-www-form-urlencoded");
        if (httpResponse.getStatusLine().getStatusCode() != 200) {
            return null;
        }
        String response = httpClient.getResponsePayload(httpResponse);


        System.out.println("JSON Response : "+response);


        return JSONClient.getAccessToken(response);
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

public Token getTokenWithScopes(String username, String password, String scopes){
    String submitUrl = GenarateAccessTokenConfiguration.getInstance().getLoginURL();
    String consumerKey = GenarateAccessTokenConfiguration.getInstance().getConsumerKey();
    String consumerSecret = GenarateAccessTokenConfiguration.getInstance().getConsumerSecret();
    try {
        String applicationToken = consumerKey + ":" + consumerSecret;
        BASE64Encoder base64Encoder = new BASE64Encoder();
        applicationToken = "Basic " + base64Encoder.encode(applicationToken.getBytes()).trim();

        String payload = "grant_type=password&username="+username+"&password="+password+"&scope="+scopes;
        HttpResponse httpResponse = httpClient.doPost(submitUrl,applicationToken,
                payload,"application/x-www-form-urlencoded");
        if (httpResponse.getStatusLine().getStatusCode() != 200) {
            return null;
        }
        String response = httpClient.getResponsePayload(httpResponse);
        return JSONClient.getAccessToken(response);
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

2 个答案:

答案 0 :(得分:0)

您可以查看其token API

用户需要访问令牌来调用在应用程序下订阅的API。调用API时,访问令牌在HTTP头中传递。 API Manager提供令牌API,您可以使用该API生成和续订用户和应用程序访问令牌。令牌API的响应是JSON消息。您从JSON中提取令牌并使用HTTP Authorization标头传递它以访问API。

以下主题说明如何生成/续订访问令牌并对其进行授权。 WSO2 API Manager支持四种最常见的授权授权类型,您还可以定义其他类型。

  • 使用OAuth2交换SAML2承载令牌 - SAML扩展授权类型
  • 使用授权码生成访问令牌 - 授权码授予类型
  • 使用NT LAN Manager生成访问令牌 - NTLM授权类型
  • 使用用户凭据生成访问令牌 - 密码授予类型

答案 1 :(得分:0)

如果您检查Oauth2授权类型,您可以找到答案。 WSO2 API管理器支持所有授权类型(授权代码,隐式,资源所有者密码凭据,OAuth 2.0 spec中提到的客户端凭据)。每种授权类型都有不同的流程来生成访问令牌。

您现在使用的资源所有者密码凭据授予类型(或密码授予类型)需要用户名和密码来生成令牌。如果要使用客户端密钥和客户端ID,则可以使用客户端凭据授予类型。见client credential grant type section

相关问题