Saiba Mais sobre Autenticação entre Aplicativos Java e o Oracle Identity Cloud Service

Você está pronto para aprender sobre a autenticação entre os aplicativos Java Web e o Oracle Identity Cloud Service. Isso inclui compreender o seguinte:

  • O fluxo de autenticação três trechos suportado pelo Oracle Identity Cloud Service para o Java SDK

  • Use casos para usar um SDK com um aplicativo Java para autenticar-se com o Oracle Identity Cloud Service

  • Métodos e funções do Java SDK

Saiba Mais sobre Fluxos de Autenticação com Trecho

O Oracle Identity Cloud Service suporta o fluxo de autenticação com três partes para o Java SDK. Neste fluxo, os usuários interagem diretamente com o Oracle Identity Cloud Service. Depois que um usuário acessa, o Oracle Identity Cloud Service emite um código de autorização que o SDK troque para um token de acesso do usuário. O aplicativo Web Java usa esse token de acesso para conceder aos usuários acesso aos recursos protegidos no aplicativo. O fluxo três trechos usa o tipo de concessão de código de autorização.

Para aumentar a segurança, a Oracle recomenda que você use o fluxo três partes para integrar seus aplicativos Java Web com o Oracle Identity Cloud Service para autenticação. Usando o tipo de concessão de código de autorização, você também pode acessar outras aplicações protegidas pelo Oracle Identity Cloud Service sem precisar reautenticar.

Saiba Mais Sobre os Casos de Uso Principais para Usar um SDK com um Aplicativo do Java

O aplicativo Java Web implementa dois casos de uso: um para autenticar usuários e o outro para acessar informações detalhadas sobre o usuário conectado.

Os diagramas de fluxo de dados a seguir ilustram o fluxo de eventos, chamadas e respostas entre o navegador da Web, o aplicativo da Web e o Oracle Identity Cloud Service para cada caso de uso.

Caso de Uso Nº1: Autenticar um Usuário

O fluxo de dados acontece desta forma:

  1. O usuário solicita um recurso protegido.

  2. O módulo de autenticação usa o SDK para gerar um URL de código de atributos da solicitação para o Oracle Identity Cloud Service e enviar este URL como uma resposta de redirecionamento ao web browser.

  3. O Web browser chama o URL.

  4. A página de Sign-In do Oracle Identity Cloud Service é exibida.

  5. O usuário submete suas credenciais de sign-in no Oracle Identity Cloud Service.

  6. Depois que o usuário acessa, o Oracle Identity Cloud Service cria uma sessão para o usuário e emite um código de autorização.

  7. O aplicativo Web faz uma chamada de back-end (ou servidor para servidor) para trocar o código de autorização de um token de acesso.

  8. O Oracle Identity Cloud Service emite um token de acesso e um token de id.

  9. Uma sessão é estabelecida e o usuário é redirecionado para a Home page .

  10. A Home page da aplicação Web será exibida.

Caso de Uso nº2: Obter Detalhes sobre o Usuário

O fluxo de dados acontece desta forma:

  1. O usuário solicita o recurso /myProfile.

  2. O aplicativo Web usa o SDK do Oracle Identity Cloud Service para validar o token do id.

  3. Os dados que são retornados da validação do token de id contêm detalhes do usuário no formato de um objeto JSON.

  4. A página Meu Perfil converte o objeto JSON como conteúdo HTML.

Saiba Mais sobre Métodos e Funções

O Java SDK é um arquivo JAR que você carrega como uma biblioteca de aplicações Web. Este arquivo JAR requer as seguintes bibliotecas de terceiros que você também deve carregar para a biblioteca:

O arquivo zip Java SDK contém as seguintes bibliotecas de terceiros necessárias para o SDK. Você pode carregá-las no aplicativo.

  • Minidev 1.0.2 do Auxiliar do ASM

  • Apache Commons Collections 4.1

  • Apache Commons Lang 3.7

  • JSON Small e Fast Parser 2.3

  • Nimbus LangTag 1.4.3

  • Nimbus JOSE+JWT 5.14

  • OAuth 2.0 SDK com OpenID Connect Extensions 5.30

O Oracle fornece uma amostra da aplicação Java Web para demonstrar como usar o Java SDK. Este aplicativo foi desenvolvido com a tecnologia Servlet para simplificar a experiência de aprendizagem e entender como o Java SDK funciona. A aplicação usa o Maven para obter todas as bibliotecas e gerar um arquivo WAR (Web Application Resource).

O Java SDK exige uma instância de objeto do HashMap carregada com informações de conexão do Oracle Identity Cloud Service. A aplicação Web Java implementa esta instância HashMap como um atributo de classe na classe ConnectionOptions.java.

//Instance of a HashMap.
    private Map<String,Object> options = new HashMap<>();
  
public ConnectionOptions(){
        this.options = new HashMap<>();
}
  
public Map<String,Object> getOptions(){
        //Adding Oracle Identity Cloud Service connection parameters to the HashMap instance.
        this.options.put(IDCSTokenAssertionConfiguration.IDCS_HOST, "identity.oraclecloud.com");
        this.options.put(IDCSTokenAssertionConfiguration.IDCS_PORT, "443");
        this.options.put(IDCSTokenAssertionConfiguration.IDCS_CLIENT_ID, "123456789abcdefghij");
        this.options.put(IDCSTokenAssertionConfiguration.IDCS_CLIENT_SECRET, "abcde-12345-zyxvu-98765-qwerty");
        this.options.put(IDCSTokenAssertionConfiguration.IDCS_CLIENT_TENANT, "idcs-abcd1234");
        this.options.put(Constants.AUDIENCE_SERVICE_URL, "https://idcs-abcd1234.identity.oraclecloud.com");
        this.options.put(Constants.TOKEN_ISSUER, "https://identity.oraclecloud.com/");
        this.options.put(Constants.TOKEN_CLAIM_SCOPE, "urn:opc:idm:t.user.me openid");
        this.options.put("SSLEnabled", "true");
        this.options.put("redirectURL", "http://localhost:8080/callback");
        this.options.put("logoutSufix", "/oauth2/v1/userlogout");
        this.options.put(Constants.CONSOLE_LOG, "True");
        this.options.put(Constants.LOG_LEVEL, "DEBUG");
        return this.options;
    }

Veja abaixo uma breve explicação de cada atributo necessário para este SDK:

Nome Descrição
IDCSTokenAssertionConfiguration.IDCS_HOST O sufixo de domínio da instância do Oracle Identity Cloud Service.
IDCSTokenAssertionConfiguration.IDCS_PORT O número da porta HTTPS que está reservado para sua instância do Oracle Identity Cloud Service (geralmente, 443).
IDCSTokenAssertionConfiguration.IDCS_CLIENT_ID O valor do ID do Cliente que é gerado após você registrar o aplicativo Java Web na console do Identity Cloud Service.
IDCSTokenAssertionConfiguration.IDCS_CLIENT_SECRET O valor do Segredo do Cliente gerado após você registrar o aplicativo Java Web na console do Identity Cloud Service.
IDCSTokenAssertionConfiguration.IDCS_CLIENT_TENANT O prefixo do domínio da instância do Oracle Identity Cloud Service. Esse prefixo geralmente é um valor semelhante a idcs-abcd1234.
Constants.AUDIENCE_SERVICE_URL O URL do nome de domínio totalmente qualificado da sua instância do Oracle Identity Cloud Service.
Constants.TOKEN_ISSUER Para esse atributo, a Oracle recomenda que você mantenha o valor https://identity.oraclecloud.com.
Constants.TOKEN_CLAIM_SCOPE

O escopo controla os dados que o aplicativo pode acessar ou processar em nome do usuário do Oracle Identity Cloud Service.

Se o aplicativo usar o SDK para autenticar um usuário, o escopo será openid. Se a aplicação também usar o SDK para obter detalhes sobre o usuário, o escopo será urn:opc:idm:t.user.me openid.

SSLEnabled Indica se o Oracle Identity Cloud Service responde a solicitações HTTPS ou HTTP. Para esse atributo, a Oracle recomenda que você mantenha o valor true.
Constants.CONSOLE_LOG Ativa o log do SDK.
Constants.LOG_LEVEL Indica o nível de log do SDK.

O aplicativo usa os atributos logoutSufix e redirectURL para evitar código fixo desses valores. O SDK não os exige.

A aplicação Web Java implementa a classe AuthServlet, que mapeia o URL /auth. Quando um usuário decide se autenticar no Oracle Identity Cloud Service, o Web browser faz uma solicitação a esse URL. A classe AuthServlet inicializa o objeto Authentication Manager, usa o Java SDK para gerar o URL do código de autorização do Oracle Identity Cloud Service e redireciona o Web browser para esse URL.

public class AuthServlet extends HttpServlet {
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //Loading the configurations
        Map<String, Object> options = new ConnectionOptions().getOptions();
        //Configuration object instance with the parameters loaded.
        IDCSTokenAssertionConfiguration config = new IDCSTokenAssertionConfiguration(options);
	String redirectUrl = (String)options.get("redirectURL");
        String scope = (String)options.get(Constants.TOKEN_CLAIM_SCOPE);
        //Authentication Manager loaded with the configurations.
        AuthenticationManager am = AuthenticationManagerFactory.getInstance(config);
        //Using Authentication Manager to generate the Authorization Code URL, passing the
        //application's callback URL as parameter, along with code value and code parameter.
        String authzURL = am.getAuthorizationCodeUrl(redirectUrl, scope, "1234", "code");
        //Redirecting the browser to the Oracle Identity Cloud Service Authorization URL.
        response.sendRedirect(authzURL);
    }
}

Os parâmetros a seguir são usados para gerar o URL do código de autorização:

Nome Descrição
redirectUrl Depois que um usuário acessa, o Oracle Identity Cloud Service redireciona o navegador da Web do usuário para este URL. Esse URL deverá corresponder ao que você irá configurar para a aplicação confiável na console do Identity Cloud Service. Consulte Registrar o Aplicativo Java para obter mais informações sobre como especificar um URL de redirecionamento para o aplicativo Java Web.
scope O escopo do OAuth ou OpenID Connect da autenticação. Este aplicativo requer somente autenticação openid.
state O protocolo OAuth define esse parâmetro. O aplicativo Java Web de amostra usa esse código para verificar se a comunicação pode ser estabelecida com o Oracle Identity Cloud Service. Para este exemplo, o valor deste parâmetro é 1234.
response_type O parâmetro necessário pelo tipo de concessão de código de autorização. Para este exemplo, o valor deste parâmetro é code.

Após o usuário acessar o, o Oracle Identity Cloud Service redireciona o web browser do usuário para um URL de callback, que o desenvolvedor deve implementar. A aplicação Java Web usa o CallbackServlet para tratar essa solicitação.

public class CallbackServlet extends HttpServlet {
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //Loading the configurations
        Map<String, Object> options = new ConnectionOptions().getOptions();
        //After Oracle Identity Cloud Service authenticates the user, the browser is redirected to the
        //callback URL, implemented as a Servlet.
        IDCSTokenAssertionConfiguration config = new IDCSTokenAssertionConfiguration(options);
        //Authentication Manager loaded with the configurations.
        AuthenticationManager am = AuthenticationManagerFactory.getInstance(config);
        //Getting the authorization code from the "code" parameter
        String authzCode = request.getParameter("code");
        //Using the Authentication Manager to exchange the Authorization Code to an Access Token.
        AuthenticationResult ar = am.authorizationCode(authzCode);
        //Getting the Access Token object and its String value.
        AccessToken access_token = ar.getToken(OAuthToken.TokenType.ACCESS_TOKEN);
        String access_token_string = access_token.getToken();
        //Getting the ID Token object and its String value.
        IdToken id_token = ar.getToken(OAuthToken.TokenType.ID_TOKEN);
        String id_token_string = id_token.getToken();
        //Validating both Tokens to acquire information for User such as UserID, 
        //DisplayName, list of groups and AppRoles assigned to the user.
        IdToken id_token_validated = am.validateIdToken(id_token_string);
        //Storing information into the HTTP Session.
        HttpSession session=request.getSession();
        session.setAttribute("access_token", access_token_string);
        session.setAttribute("id_token", id_token_string);
        session.setAttribute("userId", id_token_validated.getUserId());
        session.setAttribute("displayName", id_token_validated.getDisplayName());
	//Forwarding the request to the Home page.
        request.getRequestDispatcher("private/home.jsp").forward(request, response);
    }
}	

O aplicativo solicita o parâmetro do código de autorização e o usa para chamar o método AuthenticationManager.authorizationCode() do Java SDK para solicitar um token de acesso e um token do id. O servlet usará a instância AuthenticationManager para validar o token do id. Os métodos AuthenticationManager.validateIdToken() retornam uma instância do objeto IdToken que contém informações do usuário, como nome para exibição, id do usuário e a lista de grupos e atribuições da aplicação designados ao usuário. Os valores do token de acesso e do token de id e algumas informações do usuário são armazenadas no objeto de sessão HTTP para que a solicitação possa ser encaminhada para um URL protegido no aplicativo chamado /private/home.jsp. Além do /private/home.jsp, o aplicativo Web Java tem outro URLs protegido: /private/myProfile.jsp.

A página myProfile.jsp usa o exemplo de código a seguir para obter mais informações sobre o usuário que efetuou sign-in no Oracle Identity Cloud Service:


<%if(session.getAttribute("access_token")==null) response.sendRedirect("/login.html");%>
<!DOCTYPE html>
<%
/**
 * The /private/myProfile.jsp page accesses the user's access token previously set in the session, 
 * calls the getAuthenticatedUser method to retrieve the user's information, and then formats it as HTML.
 * @author felippe.oliveira@oracle.com
 * @Copyright Oracle
*/
  java.util.Map<String, Object> options = new sampleapp.util.ConnectionOptions().getOptions();
  //Configuration object instance with the parameters loaded.
  oracle.security.jps.idcsbinding.shared.IDCSTokenAssertionConfiguration configuration = new oracle.security.jps.idcsbinding.shared.IDCSTokenAssertionConfiguration(options);
  oracle.security.jps.idcsbinding.shared.AuthenticationManager am = oracle.security.jps.idcsbinding.shared.AuthenticationManagerFactory.getInstance(configuration);
  
  //Getting the Access Token and the Id Token from the session object
  String access_token_string = (String)session.getAttribute("access_token");
  String id_token_string = (String)session.getAttribute("id_token");

  //Validating the ID Token to get user information, groups and app roles associated with the user.
  oracle.security.jps.idcsbinding.api.AccessToken access_token_validated = am.validateAccessToken(access_token_string);
  oracle.security.jps.idcsbinding.api.IdToken id_token_validated = am.validateIdToken(id_token_string);
%>

A página /private/myProfile.jsp acessa o valor do token de id que foi definido na sessão, chama o método AuthenticationManager.validateIdToken() para recuperar as informações do usuário e, em seguida, apresenta como conteúdo HTML.


<p><b>Information from the Identity Token:</b></p><p><%
out.println("DisplayName = "+ id_token_validated.getDisplayName() +"<br>");
out.println("IdentityDomain = "+ id_token_validated.getIdentityDomain() +"<br>");
out.println("UserName = "+ id_token_validated.getUserName()+"<br>");
out.println("UserId = "+ id_token_validated.getUserId()+"<br>");
out.println("Issuer = "+ id_token_validated.getIssuer()+"<br>");

java.util.List<oracle.security.jps.idcsbinding.api.IDCSAppRole> appRoles = id_token_validated.getAppRoles();
if(!appRoles.isEmpty()){
   out.println("App Roles:<br>");
   for(oracle.security.jps.idcsbinding.api.IDCSAppRole appRole: appRoles){
      out.println("&nbsp;appRole = "+ appRole.getName() +"<br>");
   }//for
}//if

java.util.List<oracle.security.jps.idcsbinding.api.IDCSGroup> groups = id_token_validated.getGroupMembership();
if(!groups.isEmpty()){
   out.println("Groups:<br>");
   for(oracle.security.jps.idcsbinding.api.IDCSGroup group: groups){
      out.println("&nbsp;group = "+ group.getName() +"<br>");
   }//for
}//if
%>
</p>
<p><b>Access Token:</b></p><p><%=access_token_string%></p>

Para efetuar sign-out do usuário do sign-on único entre a aplicação e o Oracle Identity Cloud Service, a aplicação Web do Java implementa o LogoutServlet, que mapeia o URL do /logout:

public class LogoutServlet extends HttpServlet {
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session=request.getSession();
        String id_token = (String)session.getAttribute("id_token");
        session.invalidate();
        Map options = new ConnectionOptions().getOptions();
        String logoutURL = (String)options.get(Constants.AUDIENCE_SERVICE_URL) + (String)options.get("logoutSufix") +"?post_logout_redirect_uri=http%3A//localhost%3A8080&id_token_hint="+ id_token;
        response.sendRedirect(logoutURL);
    }
}

Este servlet invalida a sessão da aplicação e redireciona o web browser do usuário para o URL de log-out do OAuth da Oracle Identity Cloud Service.