Web Service Rest Json - Autenticar - Resolvido

Pessoal, criei um web service no modelo REST e Json usando o GET. Preciso autenticar com usuário e senha para que qualquer um não possa acessar os dados. Li várias matérias mas não cheguei em um resultado. Vi algo que deveria passar o usuário e senha no Header mas não entendi como. No cliente quando chamo o web service uso o código abaixo:

    Client c = Client.create();              
    WebResource wr = c.resource("http://XXX.XXX.X.XXX:8080/controlews/webresources/contrato/"+exercicio+"/"+mes);         
    String json = wr.get(String.class);]
    Gson gson = new Gson();
    return gson.fromJson(json, new TypeToken<List<Contrato>>() {
    }.getType());

Bom dia.

Já que você está utilizando o Jersey, pode trabalhar com autenticação OAuth 2.

Para entender como ela funciona veja este tutorial (https://www.youtube.com/watch?v=ty-2eYCUUVI)

Pra te ajudar a implementar tem este projeto: https://github.com/jersey/jersey/tree/master/examples/oauth-client-twitter

EXTRA: https://www.oracle.com/us/assets/lad-2015-ses16211-silva-2604591.pdf

[]'s

Boa tarde edumatias, obrigado por responder. Li o tutorial que me passou, ví o video e olhei o projeto. Aparentemente é bem complexo essa implentação e não consegui identificar uma demonstração pratica de como enviar e capturar o login. Você já fez essa autenticação ? Estava pensando em algo mais simples, apenas passar o parâmetro de usuário e senha para o web service de forma oculta e validar no próprio web service.

OPa.

Claro.

Tem um muito simples aqui.

Esse

Passa um token no header

Pega ele na sua api rest e compara pra ver se é a mesma.

Tenta ae

edumatias, Bom dia. O Parâmetro " wr.header(“chave”,“123”)"; que estou enviando não chega no WS “@HeaderParam(“chave”) String chave”. Tentei usar o método POST aí não chega nem a carregar os dados.Tem alguma sugestão ? Desde já obrigado.

//Cliente--------------------------------------------------

  Client c = Client.create();         
    WebResource wr = c.resource("http://XXX.XXX.X.XXX:8080/controlews/webresources/contrato/"+exercicio+"/"+mes);             
    wr.header("chave","123");        
    String json = wr.get(String.class); 

//Web Service-----------------------------------------------
private List contrato;

/**
 * Creates a new instance of Controle
 */
public ContratoBacking(@PathParam("ano") int ano, @PathParam("mes") int mes, @HeaderParam("chave") String chave) throws Exception {

    //autenticar
    if(!"123".equals(chave)){
       gerarContratos(ano, mes);    
    }        
}

public void gerarContratos(int ano, int mes) throws Exception {
    Connection conexao = ConnectionFactory.getConnection();

    PreparedStatement stmt = conexao.prepareStatement(
            "select .....");
    try {
        gerarLista(stmt);
    } catch (Exception e) {
        throw new Exception("Erro ao executar query. " + e.getMessage());
    } finally {
        ConnectionFactory.closeConnection(conexao, stmt);
    }
}

public void gerarLista(PreparedStatement stmt) throws Exception {

    ResultSet rs = stmt.executeQuery();

    contrato = new ArrayList<Contrato>();
    while (rs.next()) {

        contrato.add(new Contrato(
                rs.getInt("id_contrato"),
                rs.getString("objeto"),
                rs.getInt("nr_contrato"),
                rs.getInt("ano_contrato"),
                rs.getInt("mes"),
                rs.getString("nome_razao"),
                rs.getFloat("vl_contrato")
        ));
    }
}

/**
 * Retrieves representation of an instance of pacote.Controle
 *
 * @param token
 * @return an instance of java.lang.String
 */
@GET
@Produces("application/json")  
public String getJson() {        
    Gson gson = new Gson();
    return gson.toJson(contrato);
}

Opa,

Em seu client, tente desta forma:

Client c = Client.create();         
WebResource wr = c.resource("http://XXX.XXX.X.XXX:8080/controlews/webresources/contrato/"+exercicio+"/"+mes);             

//pode usar para passar parametros. Mas no seu caso já está na URI
MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();


ClientResponse response = null;
response = wr.queryParams(queryParams).header("Content-Type", "application/json;charset=UTF-8")
    .header("chave", "123")
    .get(ClientResponse.class);

String jsonStr = response.getEntity(String.class);

Já no seu resource, cadê as anottations? Algo assim.

@GET
@Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON + "; charset=UTF-8")
@Path("/autores/{exercicio}/{mes}")
public String ContratoBacking(@PathParam("ano") int ano, @PathParam("mes") int mes, @HeaderParam("chave") String chave) throws Exception {

    //autenticar
    if(!"123".equals(chave)){
       gerarContratos(ano, mes);    
    }      
   return "retorna algo";  
}

Neste exemplo que lhe passei (https://gist.github.com/alexandreaquiles/027e1b5ceefb289e25db) tem exemplos de como o seu resource deve ficar.

Tente ajustar.

1 curtida

edumatias, minhas anottations estão em um método que acabei não enviando. Funcionou certinho agora. Muito obrigado.

Show Fabricio.

Marque o comentário que resolveu o caso como Solução.

[]'s

1 curtida

Apenas precisei alterar no Cliente a forma de chamar o WS:
Client c = Client.create();
WebResource wr = c.resource(“http://XXX.XXX.X.XXX:8080/controlews/webresources/contrato/"+exercicio+"/”+mes); //pode usar para passar parametros. Mas no seu caso já está na URI
MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
ClientResponse response = null;
response = wr.queryParams(queryParams).header(“Content-Type”, “application/json;charset=UTF-8”)
.header(“chave”, “123”)
.get(ClientResponse.class);
String jsonStr = response.getEntity(String.class);