In SAML2 Bearer Assertion Profile for OAuth 2.0 user can get a SAML token from WSO2
Identity Server by authenticating. After that user can give that SAML
token to WSO2 API Manger to get an OAuth token without going for
authentication.I am giving you a JAVA client to exchange SAML token to OAuth token.
The related token class is this,
import org.example.webUI.Config; import org.opensaml.Configuration; import org.opensaml.DefaultBootstrap; import org.opensaml.saml2.core.Response; import org.opensaml.xml.ConfigurationException; import org.opensaml.xml.XMLObject; import org.opensaml.xml.io.Unmarshaller; import org.opensaml.xml.io.UnmarshallerFactory; import org.opensaml.xml.io.UnmarshallingException; import org.opensaml.xml.util.Base64; import org.opensaml.xml.util.XMLHelper; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.*; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; public class OAuthUtil { public static String exchangeSAMLTokenToOauth(String responseMessage) throws ConfigurationException, ParserConfigurationException, IOException, SAXException, UnmarshallingException { DefaultBootstrap.bootstrap(); byte[] decoded = Base64.decode(responseMessage); ByteArrayInputStream is = new ByteArrayInputStream(decoded); DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); documentBuilderFactory.setNamespaceAware(true); DocumentBuilder docBuilder = documentBuilderFactory.newDocumentBuilder(); Document document = docBuilder.parse(is); Element element = document.getDocumentElement(); UnmarshallerFactory unmarshallerFactory = Configuration.getUnmarshallerFactory(); Unmarshaller unmarshaller = unmarshallerFactory.getUnmarshaller(element); XMLObject responseXmlObj = unmarshaller.unmarshall(element); Response responseObj = (Response) responseXmlObj; // Get the SAML2 Assertion part from the response StringWriter rspWrt = new StringWriter(); XMLHelper.writeNode(responseObj.getAssertions().get(0).getDOM(), rspWrt); String requestMessage = rspWrt.toString(); // Get the Base64 encoded string of the message // Then Get it prepared to send it over HTTP protocol String encodedRequestMessage = Base64.encodeBytes(requestMessage.getBytes(), Base64.DONT_BREAK_LINES); String enc_rslt = URLEncoder.encode(encodedRequestMessage, "UTF-8").trim(); //Create connection to the Token endpoint of API manger URL url = new URL(Config.apiMangerOAuthURL); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); String userCredentials = Config.apiMangerClientID+":"+Config.apiMangerClientSecret; String basicAuth = "Basic " + new String(Base64.encodeBytes(userCredentials.getBytes())); basicAuth = basicAuth.replaceAll("\\r|\\n", ""); // Set the consumer-key and Consumer-secret connection.setRequestProperty("Authorization", basicAuth); connection.setUseCaches(false); connection.setDoInput(true); connection.setDoOutput(true); //Send request DataOutputStream wr = new DataOutputStream(connection.getOutputStream()); wr.writeBytes("grant_type=urn:ietf:params:oauth:grant-type:saml2-bearer&assertion=" + enc_rslt + "&scope=PRODUCTION"); wr.flush(); wr.close(); //Get Response InputStream iss = connection.getInputStream(); BufferedReader rd = new BufferedReader(new InputStreamReader(iss)); String line; StringBuffer responseString = new StringBuffer(); while ((line = rd.readLine()) != null) { responseString.append(line); responseString.append('\r'); } rd.close(); return responseString.toString(); } public static boolean revokeToken(Token token) throws IOException { //Create connection to the Token endpoint of API manger URL url = new URL(Config.apiMangerOAuthRevokeURL); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); String userCredentials = Config.apiMangerClientID+":"+Config.apiMangerClientSecret; String basicAuth = "Basic " + new String(Base64.encodeBytes(userCredentials.getBytes())); basicAuth = basicAuth.replaceAll("\\r|\\n", ""); // Set the consumer-key and Consumer-secret connection.setRequestProperty("Authorization", basicAuth); connection.setUseCaches(false); connection.setDoInput(true); connection.setDoOutput(true); //Send request DataOutputStream wr = new DataOutputStream(connection.getOutputStream()); wr.writeBytes("token="+token.getAccess_token()); wr.flush(); wr.close(); //Get Response InputStream iss = connection.getInputStream(); BufferedReader rd = new BufferedReader(new InputStreamReader(iss)); String line; StringBuffer responseString = new StringBuffer(); while ((line = rd.readLine()) != null) { responseString.append(line); responseString.append('\r'); } rd.close(); System.out.println("Revoking Token -"+token.getAccess_token()); System.out.println("Revoking Response -"+responseString.toString()); return true ; } }
The related token class is this,
public class Token { private String access_token,refresh_token,expires_in,token_type; public Token(String access_token, String refresh_token, String expires_in, String token_type) { this.access_token = access_token; this.refresh_token = refresh_token; this.expires_in = expires_in; this.token_type = token_type; } public String getRefresh_token() { return refresh_token; } public void setRefresh_token(String refresh_token) { this.refresh_token = refresh_token; } public String getAccess_token() { return access_token; } public void setAccess_token(String access_token) { this.access_token = access_token; } public String getExpires_in() { return expires_in; } public void setExpires_in(String expires_in) { this.expires_in = expires_in; } public String getToken_type() { return token_type; } public void setToken_type(String token_type) { this.token_type = token_type; } }
Hope this helped you!
No comments:
Post a Comment