How to get Access Token using client_credentials using java code?
The best way to get access token using JAVA 11 java.net.http
.
Here is the sample code:
//Cliend id and client secret
var keys = "clientid goes here:Client secret goes here";
var URL = "http://localhost:8080/api/token"
HashMap<String, String> parameters = new HashMap<>();
parameters.put("grant_type", "client_credentials");
String form = parameters.keySet().stream()
.map(key -> key + "=" + URLEncoder.encode(parameters.get(key), StandardCharsets.UTF_8))
.collect(Collectors.joining("&"));
String encoding = Base64.getEncoder().encodeToString(keys.getBytes());
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().uri(URI.create(url))
.headers("Content-Type", "application/x-www-form-urlencoded", "Authorization", "Basic "+encoding)
.POST(BodyPublishers.ofString(form)).build();
HttpResponse<?> response = client.send(request, BodyHandlers.ofString());
System.out.println(response.statusCode() + response.body().toString());
avidCoder
Passionate coder, Always ready to learn new things and a debugger.
Updated on July 22, 2022Comments
-
avidCoder almost 2 years
I have some API which requires access token to get the response. In
postman
we useOAuth 2.0
to get the access token by providing client username and password. In a similar way, I want to fetch the new access token.Here is the sample code which I have tried so far.
import java.io.*; import java.net.URL; import java.net.URLEncoder; import java.util.Map; import java.lang.reflect.Type; import javax.net.ssl.HttpsURLConnection; // Google Gson Libraries used for Json Parsing import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; public class AuthGoogle { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { // TODO Auto-generated method stub String grantType = "client_credentials"; String applicationID = "application"; String username = "username"; String password = "password"; String url = "url_link"; HttpsURLConnection httpConn = null; BufferedReader in = null; try { // Create the data to send StringBuilder data = new StringBuilder(); data.append("grant_type=" + URLEncoder.encode(grantType, "UTF-8")); data.append("&client_id=" + URLEncoder.encode(applicationID, "UTF-8")); data.append("&username=" + URLEncoder.encode(username, "UTF-8")); data.append("&password=" + URLEncoder.encode(password, "UTF-8")); // Create a byte array of the data to be sent byte[] byteArray = data.toString().getBytes("UTF-8"); // Setup the Request URL request = new URL(null, url, new sun.net.www.protocol.https.Handler()); httpConn = (HttpsURLConnection)request.openConnection(); httpConn.setRequestMethod("POST"); httpConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); httpConn.setRequestProperty("Content-Length", "" + byteArray.length); httpConn.setDoOutput(true); // Write data OutputStream postStream = httpConn.getOutputStream(); postStream.write(byteArray, 0, byteArray.length); postStream.close(); // Send Request & Get Response InputStreamReader reader = new InputStreamReader(httpConn.getInputStream()); in = new BufferedReader(reader); // Get the Json reponse containing the Access Token String json = in.readLine(); System.out.println("Json String = " + json); // Parse the Json response and retrieve the Access Token Gson gson = new Gson(); Type mapType = new TypeToken<Map<String,String>>(){}.getType(); Map<String,String> ser = gson.fromJson(json, mapType); String accessToken = ser.get("access_token"); System.out.println("Access Token = " + accessToken); } catch (java.io.IOException e) { // This exception will be raised if the server didn't return 200 - OK // Retrieve more information about the error System.out.println(e.getMessage()); } finally { // Be sure to close out any resources or connections if (in != null) in.close(); if (httpConn != null) httpConn.disconnect(); } } }
I am getting output as
Connection refused: connect.
Another code I have tried is:-
import org.apache.oltu.oauth2.client.OAuthClient; import org.apache.oltu.oauth2.client.URLConnectionClient; import org.apache.oltu.oauth2.client.request.OAuthClientRequest; import org.apache.oltu.oauth2.client.response.OAuthJSONAccessTokenResponse; import org.apache.oltu.oauth2.common.OAuth; import org.apache.oltu.oauth2.common.message.types.GrantType; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import org.apache.commons.codec.binary.Base64; public class OltuJavaClient { public static final String TOKEN_REQUEST_URL = "url_link"; public static final String CLIENT_ID = "client_id"; public static final String CLIENT_SECRET = "client_pass"; public static void main(String[] args) { try { OAuthClient client = new OAuthClient(new URLConnectionClient()); OAuthClientRequest request = OAuthClientRequest.tokenLocation(TOKEN_REQUEST_URL) .setGrantType(GrantType.CLIENT_CREDENTIALS) .setClientId(CLIENT_ID) .setClientSecret(CLIENT_SECRET) // .setScope() here if you want to set the token scope .buildQueryMessage(); request.addHeader("Accept", "application/json"); request.addHeader("Content-Type", "application/json"); request.addHeader("Authorization", base64EncodedBasicAuthentication()); String token = client.accessToken(request, OAuth.HttpMethod.POST, OAuthJSONAccessTokenResponse.class).getAccessToken(); System.out.println(token.toString()); } catch (Exception exn) { exn.printStackTrace(); } } private static String base64EncodedBasicAuthentication() { // TODO Auto-generated method stub return null; } }
Here I am getting this error:-
OAuthProblemException{error='unsupported_response_type', description='Invalid response! Response body is not application/json encoded', uri='null', state='null', scope='null', redirectUri='null', responseStatus=0, parameters={}}
Can we do this way? Any leads would be appreciated.
-
avidCoder almost 6 yearsI did the changes but still I can see the same error like before.