Appel de service OAuth 2.0
Un client OAuth enregistré peut appeler le noeud final d'autorisation du service OAuth WebSphere Application Server pour demander un jeton d'accès. Un client OAuth enregistré peut également appeler le noeud final du jeton du service OAuth WebSphere Application Server pour demander un jeton d'accès. Le client peut alors utiliser ce jeton d'accès pour demander des ressources Web protégées depuis WebSphere Application Server.
Le service WebSphere Application Server OAuth 2.0 prend en charge les flux suivants :
Flux de code d'autorisation
Appelez le noeud final d'autorisation pour demander
un code d'autorisation.
Le client OAuth réachemine le propriétaire ou l'utilisateur de la ressource vers
le service d'autorisation WebSphere Application Server OAuth 2.0
en ajoutant son ID client, sa valeur confidentielle client, son état, l'URI de réacheminement et les portées
facultatives.
https://host_name:port_number/oauth2/endpoint/provider_name/authorize
ouhttps://host_name:port_number/oauth2/declarativeEndpoint/provider_name/authorize
Appelez le noeud final de jeton OAuth pour demander un jeton d'accès.
Le
client OAuth demande un jeton d'accès depuis le noeud final de jeton
WebSphere Application Server OAuth 2.0 en ajoutant
le type d'accord authorization_code, authorization code,
redirect_url et client_id comme paramètres de demande.
https://host_name:port_number/oauth2/endpoint/provider_name/token
L'exemple
ci-dessous illustre les constructions des URI lors de l'utilisation du code d'autorisation, et
l'utilisation du jeton d'accès aux ressources Web :
String charset = "UTF-8";
String param1 = "code";
if (isAuthorizationCode){
String query = String.format("response_type=%s&
client_id=%s&
client_secret=%s&
state=%s&
redirect_uri=%s&
scope=%s",
URLEncoder.encode(param1, charset),
URLEncoder.encode(clientId, charset),
URLEncoder.encode(clientSecret, charset),
URLEncoder.encode(state, charset),
URLEncoder.encode(redirectURI, charset),
URLEncoder.encode(scope, charset));
String s = authorizationEndPoint + "?" + query;
System.out.println("Visit: " + s + "\nand grant permission");
System.out.print("Now enter the OAuth code you have received in redirect uri :");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String code = br.readLine();
param1 = "authorization_code";
query = String.format("grant_type=%s&
code=%s&
client_id=%s&
client_secret=%s&
state=%s&
redirect_uri=%s&
scope=%s",
URLEncoder.encode(param1, charset),
URLEncoder.encode(code, charset),
URLEncoder.encode(clientId, charset),
URLEncoder.encode(clientSecret, charset),
URLEncoder.encode(state, charset),
URLEncoder.encode(redirectURI, charset),
URLEncoder.encode(scope, charset));
URL url = new URL(tokenEndPoint);
HttpsURLConnection con = (HttpsURLConnection)url. openConnection();
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + charset);
con.setDoOutput(true);
con.setRequestMethod("POST");
OutputStream output = null;
try {
output = con.getOutputStream();
output.write(query.getBytes(charset));
output.flush();
} finally {
if (output != null) try {
output.close();
} catch (IOException logOrIgnore) {}
}
con.connect();
System.out.println("response message is = " + con.getResponseMessage());
// read the output from the server
BufferedReader reader = null;
StringBuilder stringBuilder;
reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
stringBuilder = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
stringBuilder.append(line + "\n");
}
} finally {
if (reader != null) try {
reader.close();
} catch (IOException logOrIgnore) {}
}
String tokenResponse = stringBuilder.toString();
System.out.println ("response is = " + tokenResponse);
JSONObject json = JSONObject.parse(tokenResponse);
if (json.containsKey("access_token")) {
accessToken = (String)json.get("access_token");
this.accessToken = accessToken;
}
if (json.containsKey("refresh_token")) {
refreshToken = (String)json.get("refresh_token");
}
//sendRequestForAccessToken(query);
if (accessToken != null) {
String query = String.format("access_token=%s",
URLEncoder.encode(accessToken, charset));
URL urlResource = new URL(resourceEndPoint);
HttpsURLConnection conn = (HttpsURLConnection) urlResource.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-type", "application/x-www-form-urlencoded");
conn.setDoOutput(true);
output = null;
try {
output = conn.getOutputStream();
output.write(query.getBytes(charset));
output.flush();
} finally {
if (output != null) try {
output.close();
} catch (IOException logOrIgnore) {}
}
conn.connect();
System.out.println("response to the resource request is = " + conn.getResponseMessage ());
reader = null;
if(conn.getResponseCode()>=200 && conn.getResponseCode() < 400) {
reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
stringBuilder = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
stringBuilder.append(line + "\n");
}
} finally {
if (reader != null) try {
reader.close();
} catch (IOException logOrIgnore) {}
}
System.out.println ("response message to the request resource is = " + stringBuilder.toString());
} else {
isValidResponse = false;
}
}
}
Flux d'accord implicite
Le client OAuth demande un jeton d'accès depuis le noeud final d'autorisation WebSphere Application Server OAuth 2.0 en ajoutant un jeton response_type, redirect_url, client_id, scope et state comme paramètre de demande.https://host_name:port_number/oauth2/endpoint/provider_name/authorize
ouhttps://host_name:port_number/oauth2/declarativeEndpoint/provider_name/authorize
L'exemple suivant illustre la construction de l'URI en cas d'utilisation d'un accord implicite :if (isImplicit) {
param1 = "token";
String query = String.format("response_type=%s&
client_id=%s&
state=%s&
redirect_uri=%s&
scope=%s",
URLEncoder.encode(param1, charset),
URLEncoder.encode(clientId, charset),
URLEncoder.encode(state, charset),
URLEncoder.encode(redirectURI, charset),
URLEncoder.encode(scope, charset));
String s = authorizationEndPoint + "?" + query;
System.out.println("Visit: " + s + "\nand grant permission");
System.out.print("Now enter the access token you have received in redirect uri :");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
accessToken = br.readLine();
if (accessToken != null) {
// send Resource Request using the access token
}
}
Flux de données d'identification client
Le client OAuth accède au noeud final de jeton avec l'ID client et la valeur confidentielle du client, puis échange un jeton d'accès pour des demandes de ressources ultérieures. Dans ce flux, le client accède au noeud final de jeton en ajoutant le type d'accord client_credentials, client_id et client_secret comme paramètres de demande.https://host_name:port_number/oauth2/endpoint/provider_name/token
L'exemple ci-dessous illustre la construction de l'URI en cas d'utilisation des données
d'identification :if (isClientCredentials){
param1 = "client_credentials";
String query = String.format("grant_type=%s&
scope=%s&
client_id=%s&
client_secret=%s",
URLEncoder.encode(param1, charset),
URLEncoder.encode(scope, charset),
URLEncoder.encode(clientId, charset),
URLEncoder.encode(clientSecret, charset));
accessToken = sendRequestForAccessToken(query);
if (accessToken != null) {
//send Resource Request using (accessToken);
}
}
Flux de données d'identification par mot de passe du propriétaire de la ressource
Le flux de mots de passe du propriétaire de la ressource transmet directement l'ID utilisateur et le mot de passe du propriétaire de la ressource au noeud final de jeton. Dans ce flux, le client OAuth accède au noeud final de jeton en ajoutant le type d'accord password, client_id, client_secret, username, password, scope et state comme paramètres de demande.https://host_name:port_number/oauth2/endpoint/provider_name/token
L'exemple
ci-dessous illustre la construction de l'URI en cas d'utilisation du mot de passe du propriétaire de la
ressource :if (isResourceOwnerCredentials) {
param1 = "password";
String query = String.format("grant_type=%s&
username=%s&
password=%s&
scope=%s&
client_id=%s&
client_secret=%s",
URLEncoder.encode(param1, charset),
URLEncoder.encode(resOwnerName, charset),
URLEncoder.encode(resOwnerPassword, charset),
URLEncoder.encode(scope, charset),
URLEncoder.encode(clientId, charset),
URLEncoder.encode(clientSecret, charset));
accessToken = sendRequestForAccessToken(query);
if (accessToken != null) {
//send Resource Request using (accessToken);
}
}
Si le jeton d'accès est arrivé à expiration, le jeton de régénération peut être envoyé
pour obtenir un jeton d'accès valide. L'exemple suivant illustre l'envoi d'un jeton de régénération :if(isAccessToken) {
if (this.accessToken != null) {
if (!sendResourceRequest(this.accessToken)) {
// resource request failed...
//get refresh token
param1 = "refresh_token";
String query = String.format("grant_type=%s&
client_id=%s&
client_secret=%s&
refresh_token=%s&
scope=%s",
URLEncoder.encode(param1, charset),
URLEncoder.encode(clientId, charset),
URLEncoder.encode(clientSecret, charset),
URLEncoder.encode(this.refreshToken, charset),
URLEncoder.encode(scope, charset));
accessToken = sendRequestForAccessToken(query);
if (accessToken != null) {
sendResourceRequest(accessToken);
}
}
}
}