SDK OpenBus Tecgraf PUC-Rio Novembro de 2013 versão 1 - julho/2013 OpenBus • O OpenBus oferece: • • • • Barramento de Integração Controle de Acesso (autenticação e identificação) Serviços de Apoio à Integração SDK • • • • Biblioteca de Acesso Demos Documentação Utilitários versão 1 - julho/2013 Visão de uma Integração versão 1 - julho/2013 Visão de uma Integração versão 1 - julho/2013 Visão de uma Integração versão 1 - julho/2013 Visão de uma Integração versão 1 - julho/2013 Visão de uma Integração versão 1 - julho/2013 Visão da Arquitetura versão 1 - julho/2013 Controle de Acesso • Ponto de entrada no barramento • sua localização (referência) é conhecida por todos • Autentica os componentes que querem fazer parte do barramento • Realiza uma autenticação •Gera um identificador de login •Login possui uma validade versão 1 - julho/2013 LDAP Controle de Acesso Autenticação com usuário / senha login Cliente Controle de Acesso - Autenticação • A autenticação no barramento pode ser feita por: • usuário e senha • certificado digital versão 1 - julho/2013 Autenticação por usuário e senha • Requer a configuração de um servidor LDAP • Normalmente, aplicações cliente (stand-alone) se autenticam no barramento usando usuário e senha versão 1 - julho/2013 Autenticação por certificado • Baseia-se em um par de chaves: pública e privada • Um certificado digital normalmente é usado para ligar uma entidade a uma chave pública • Assinado digitalmente • Emitido e assinado por uma Autoridade Certificadora • O padrão adotado é o X.509 • A validação de certificados digitais é feita usando um modelo desafio-resposta versão 1 - julho/2013 Autenticação por certificado • O OpenBus possui instalado os certificados públicos de todas as entidades que precisam se conectar a ele • Apenas a entidade que se conecta ao barramento guarda a chave privada que é par da chave pública do certificado • Para a autenticação, um desafio é gerado pelo barramento utilizando a chave pública da entidade • A entidade decifra o desafio utilizando a sua chave privada • A chave pública do barramento é usada para gerar a resposta a partir do desafio fornecido versão 1 - julho/2013 Controle de Acesso • Autenticação e Identificação • Login • Identificador único • Nome da entidade proprietária • • Cadeia de chamadas Barramento responsável • Lease de login • • Um login é válido por um tempo determinado É renovado de tempos em tempos versão 1 - julho/2013 Controle de Acesso – Cadeia de chamadas • Representa a identificação de todos os acessos ao barramento que originaram uma chamada recebida • Contém as informações de login dos processos que originaram cada uma das chamadas aninhadas • Útil para aplicações implementarem regras próprias de permissionamento versão 1 - julho/2013 Registro de Ofertas • Permite a oferta e a descoberta de serviços • Observação de ofertas e registros de ofertas • Sua referência é obtida através do barramento • O mecanismo de govenança é usado para garantir que apenas entidades autorizadas possam publicar serviços no barramento versão 1 - julho/2013 Registro de Ofertas • Descrição de oferta de serviço • • Referência para a faceta IComponent do serviço Lista de propriedades descritivas • Especificadas no ato do registro • Automáticas • Referência para a oferta de serviço propriamente dita • Objeto CORBA que permite a alteração da oferta pela entidade que a registrou ou usuários administradores versão 1 - julho/2013 Registro de Ofertas • Propriedades automáticas • Descritas na IDL do registro de ofertas /** * openbus.offer.id: Ident. único da oferta. * openbus.offer.login: Ident. do login com que a oferta foi registrada. * openbus.offer.entity: Ident. da entidade que registrou a oferta. * openbus.offer.timestamp: Número indicando o momento do registro da oferta. * openbus.offer.year: Ano em que a oferta foi registrada. * openbus.offer.month: Número do mês em que a oferta foi registrada. * openbus.offer.day: Dia do mês que a oferta foi registrada. * openbus.offer.hour: Hora do dia em que a oferta foi registrada. * openbus.offer.minute: Minuto do dia em que a oferta foi registrada. * openbus.offer.second: Segundo do dia em que a oferta foi registrada. * openbus.component.name: Nome do componente SCS que implementa o serviço. * openbus.component.version.major: Versão maior do componente SCS que implementa o serviço. * openbus.component.version.minor: Versão menor do componente SCS que implementa o serviço. * openbus.component.version.patch: Versão de correção do componente SCS que implementa o serviço. * openbus.component.facet: Nome de faceta oferecida pelo component SCS que implementa o serviço. * openbus.component.interface: RepID de interface implementada por faceta do component SCS que implementa o serviço. */ versão 1 - julho/2013 Registro de Ofertas versão 1 - julho/2013 Registro de Ofertas versão 1 - julho/2013 Serviços Adicionais • Atuais • Serviço de Colaboração • Serviço de Dados • Não são parte do núcleo do barramento • Ou seja, não é obrigatória a presença desses serviços em uma instância de barramento • Acrescentam funcionalidades para auxiliar a integração entre serviços e aplicações versão 1 - julho/2013 Serviço de Colaboração • Permite criar e compartilhar uma sessão de colaboração entre serviços • Fornece mecanismo de notificação para adição e exclusão de membros • Oferece um canal de comunicação para o envio de eventos versão 1 - julho/2013 SDK OpenBus • Biblioteca que implementa o protocolo • Também dá suporte ao protocolo da versão anterior do barramento, para que seja possível manter a integração com clientes legados • Assistente (utilitário) • Documentação • Demos versão 1 - julho/2013 API da Biblioteca • Os principais conceitos são representados da seguinte forma: • • • • ORBInitializer Connection CallerChain OpenBusContext versão 1 - julho/2013 API - ORBInitializer • Inicializador de ORBs para acesso a barramentos OpenBus – Mas IIOP.NET só permite uma instância de ORB • Limita o ORB ao uso exclusivo para chamadas através do barramento • Chamadas fora do barramento deveriam ser feitas em outro ORB, mas com o IIOP.NET não é possível • Abstrai a operação CORBA::ORB_init • O ORB passa a ter um OpenBusContext associado versão 1 - julho/2013 API - ORBInitializer • Exemplo: // inicialização e configuração do ORB e // obtenção do gerente de contexto de chamadas associado OpenBusContext context = ORBInitializer.Context; versão 1 - julho/2013 API - Connection • Representa um ponto de acesso ao barramento, que é usado tanto para realizar como para receber chamadas através do barramento versão 1 - julho/2013 API - Connection • Exemplo: // criação de conexão (não lança exceções) // o terceiro parâmetro é um conjunto de propriedades // opcionais, como suporte a clientes legados Connection connection = context.createConnection(host, port, null); versão 1 - julho/2013 API - Connection • Utilizada para realizar acessos identificados ao barramento • Deve ter um login associado • Atualmente duas formas de autenticação são possíveis: • Por senha: loginByPassword • Por certificado digital: loginByCertificate • É possível também obter um login através de uma autenticação prévia versão 1 - julho/2013 API - Connection • Exemplo: // autenticação try { // por login e senha connection.LoginByPassword(entity, password); // por certificado connection.LoginByCertificate(entity, privateKey); // logout connection.Logout(); } catch(…) { … } versão 1 - julho/2013 API - Connection • O resultado da autenticação é um login com tempo de validade (Lease) • Cada conexão possui uma thread de renovação automática da validade do login • Caso o login seja invalidado, é necessário reautenticar e, no caso de serviços, reofertar suas ofertas no barramento • Para isso, deve-se implementar uma callback versão 1 - julho/2013 API - Connection • Exemplo: // callback de renovação de login e ofertas connection.OnInvalidLogin = InvalidLogin; ... private void InvalidLogin(Connection conn, LoginInfo login){ //1. autenticar no barramento //2. republicar ofertas se necessário //é necessário o tratamento de concorrência } versão 1 - julho/2013 API - Connection • Multiplexação • Possibilidade de assumir múltiplas identidades através de múltiplas conexões • Utiliza-se o OpenBusContext para criar e definir as conexões que serão utilizadas pelo ORB versão 1 - julho/2013 API - CallerChain • Representa a identificação de todos os acessos ao barramento que originaram uma chamada recebida • Úteis para aplicações implementarem regras próprias de permissionamento • São obtidas através do OpenBusContext versão 1 - julho/2013 API - CallerChain • Exemplo: // obtenção da cadeia da requisição public void MyServantMethod() { CallerChain callerChain = ORBInitializer.Context.CallerChain; LoginInfo caller = callerChain.Caller; System.out.println(caller.entity + “ called me.”); // unindo-se a uma cadeia de chamadas context.JoinChain(callerChain); someService.someMethod(); context.ExitChain(); } versão 1 - julho/2013 API - OpenBusContext • Permite controlar o contexto de chamadas de um ORB para acessar informações que as identificam • O contexto representa a linha de execução atual do programa em relação ao ORB, o que tipicamente é a thread corrente (mais especificamente o CORBA::PICurrent do padrão CORBA) versão 1 - julho/2013 API - OpenBusContext • Que informações identificam as chamadas? • Conexão • Cadeia de chamadas • O contexto: • Cria conexões • Manipula informações de contexto • Qual conexão realiza a chamada • Qual cadeia está associada à chamada • Qual conexão recebe (atende) uma chamada versão 1 - julho/2013 API - OpenBusContext • Exemplo: // configuração da conexão padrão context.SetDefaultConnection(connection); // recuperação da conexão padrão Connection conn = context.GetDefaultConnection(); versão 1 - julho/2013 API - OpenBusContext • O contexto também fornece a referência para serviços-núcleo: • Registro de ofertas OfferRegistry offerRegistry = context.OfferRegistry; versão 1 - julho/2013 API - Publicação de Ofertas try { // registro de um serviço no barramento ServiceProperty[] properties = new[] { new ServiceProperty(“my property”, “my property value”)}; context.OfferRegistry.registerService(iComponent, properties); } catch (…) { … } versão 1 - julho/2013 API - Busca e Utilização de Ofertas ServiceOfferDesc[] offers; try { // busca por serviço ServiceProperty[] properties = new ServiceProperty[1]; properties[0] = new ServiceProperty(“my property”, “my property value”)}; offers = context.OfferRegistry.findServices(properties); } catch (…) { … } versão 1 - julho/2013 API - Busca e Utilização de Ofertas // análise das ofertas encontradas string serviceType = ...; foreach(ServiceOfferDesc offerDesc in offers) { try { MarshalByRefObject serviceObj = offerDesc.service_ref.getFacet(serviceType); if (serviceObj == null) { continue; } Service service = serviceObj as Service; if (service == null) {...} service.someMethod(); } catch (…) { … } } versão 1 - julho/2013 Assistente • Abstração sobre a biblioteca de acesso cujo objetivo é atuar como um utilitário que atende a cenários de uso mais comuns • Auxilia na autenticação com o barramento • Auxilia no registro e busca de ofertas • Permite a configuração de número de tentativas • Permite configurar callbacks de falhas • Limitação de um assistente por ORB versão 1 - julho/2013 Assistente • Cenários recomendados: • Comunicação com um único barramento • Necessidade de apenas uma autenticação • Cenários não recomendados: • Comunicação com mais de um barramento • Necessidade de múltiplas autenticações, com um ou mais barramentos • Esses cenários são impossíveis com a versão atual do IIOP.NET versão 1 - julho/2013 Assistente • Principais vantagens: • Auxílio na autenticação com o barramento • Implementa a callback OnInvalidLogin para o usuário • Ofertas de serviços são mantidas automaticamente caso a autenticação seja refeita versão 1 - julho/2013 Assistente - Login • Exemplo: // Criação de um assistente – tentará realizar o login em uma // nova thread, até conseguir // por login e senha Assistant assistant = new AssistantImpl(host, port, new PasswordProperties(entity, password)); // por certificado Assistant assistant = new AssistantImpl(host, port, new PrivateKeyProperties(entity, privateKey)); versão 1 - julho/2013 Assistente – Publicação de Oferta • Exemplo: // registro de um serviço no barramento - tentará realizar o // registro em uma nova thread, até conseguir ServiceProperty[] properties = new[] { new ServiceProperty(“my property”, “my property value”)}; assistant.RegisterService(iComponent, properties); versão 1 - julho/2013 Assistente – Busca por Oferta • Exemplo: // busca por serviço ServiceProperty[] properties = new[] { new ServiceProperty(“my property”, “my property value”)}; ServiceOfferDesc[] offers = Utils.FilterWorkingOffers( assistant.FindServices(properties, -1)); versão 1 - julho/2013 Boas Práticas • Ambiente distribuído • Sempre pode haver falhas de acesso a objetos remotos • Exceções sempre devem ser tratadas para garantir a robustez versão 1 - julho/2013 Tratamento de Exceções • OpenBus • CORBA::NoPermission • NoLogin – caso alguma operação que dependa de login seja feita e não haja um login no momento • InvalidChain – cadeia inválida enviada • UnknownBus – barramento não conhecido pelo serviço que se está tentando utilizar • UnverifiedLogin – o serviço que se está tentanto utilizar não conseguiu verificar seu login no barramento • InvalidRemote – protocolos de versão incompatíveis • ServiceFailure – falha interna em um serviço versão 1 - julho/2013 Tratamento de Exceções • CORBA • CORBA::TRANSIENT • Ocorreu um erro na comunicação, mas pode ser possível tentar novamente (ex: não foi possível contactar o servidor) • CORBA::COMM_FAILURE • Erro de comunicação durante o atendimento de uma chamada (ex: falta de recursos no servidor) • CORBA::OBJECT_NOT_EXISTS • O objeto requisitado no servidor não existe versão 1 - julho/2013 Detalhes e Outras Funcionalidades • Veremos agora: • Comunicação detalhada • Multiplexação • Compartilhamento de autenticação versão 1 - julho/2013 Comunicação Detalhada versão 1 - julho/2013 Comunicação Detalhada versão 1 - julho/2013 Multiplexação • OpenBusContext • Representa dois contextos diferentes • Contexto de Requisição (realização de chamadas) • Contexto de Despacho (recebimento de chamadas) • Define conexão padrão • A ser utilizada tanto em Requisição como em Despacho, caso não sejam especificadas versão 1 - julho/2013 Multiplexação – Contexto de Request • Exemplo: // configuração da conexão padrão context.SetDefaultConnection(connection); versão 1 - julho/2013 Multiplexação • OpenBusContext • Como Contexto de Requisição • Define conexão corrente • Permite configurar a cadeia de chamadas associada à requisição • Métodos JoinChain, ExitChain • Propriedade JoinedChain versão 1 - julho/2013 Multiplexação – Contexto de Request • Exemplo: // configuração da conexão de requisição (requester) context.SetCurrentConnection(connection); // junta-se a uma cadeia específica context.JoinChain(some_chain); realiza_chamada_remota(); // deixa de usar essa cadeia para as próximas requisições context.ExitChain(); // volta a usar a conexão padrão context.SetCurrentConnection(null); versão 1 - julho/2013 Multiplexação • OpenBusContext • Como Contexto de Despacho • Define conexão de despacho • E callback OnCallDispatch para a escolha dessa conexão • Permite consultar a cadeia de chamadas associada à chamada recebida • Propriedade CallerChain versão 1 - julho/2013 Multiplexação – Contexto de Dispatch • Exemplo: // configuração da conexão de despacho (dispatcher) context.OnCallDispatch = Dispatch; ... public Connection Dispatch(OpenBusContext context, string busid, string caller, string uri, string operation){ // cabe ao código da aplicação escolher a conexão return some_connection; } } ); versão 1 - julho/2013 Multiplexação • OpenBusContext • Método context.GetCurrentConnection() • Contexto de Requisição: • Obtém a conexão corrente do contexto ou a padrão • Contexto de Despacho • Obtém a conexão que atende à requisição versão 1 - julho/2013 Compartilhamento de Autenticação • Serviço autenticado (API padrão): try { // compartilhamento de autenticação byte[] secret; LoginProcess login = connection.StartSharedAuth(out secret); // passa login e secret para outra aplicação de alguma forma // segura … } catch (…) { … } versão 1 - julho/2013 Compartilhamento de Autenticação • Serviço se autenticando (API padrão): try { // Recebe informações de login e segredo de alguma forma // segura LoginProcess login = …; byte[] secret = …; // Utiliza dados recebidos para realizar login Connection connection = context.CreateConnection(host, port, null); connection.LoginBySharedAuth(login, secret.value); … } catch (…) { … } versão 1 - julho/2013 Compartilhamento de Autenticação • Serviço se autenticando (Assistente): Assistant assistant = new AssistantImpl(host, port, new SharedAuthProperties(SharedAuthObtainer)); ... private LoginProcess SharedAuthObtainer(out byte[] secret) { LoginProcess login = …; secret = …; return login; } versão 1 - julho/2013