Product-apim: Validação de assinatura na memória

Criado em 3 jun. 2020  ·  11Comentários  ·  Fonte: wso2/product-apim

Descreva o (s) seu (s) problema (s)

Para validação de assinatura, o gateway chama o serviço de validação de chave em execução no nó do gerenciador de chaves e o gerenciador de chaves acessa o banco de dados para recuperar os dados necessários para validação.

no caso de uma falha do banco de dados, há uma chance de falhar uma solicitação em tempo de execução.

Descreva sua solução

carregue as informações necessárias para a validação da assinatura na memória na inicialização do servidor e no carregamento do locatário para os locatários.
Para qualquer atualização, como criação de aplicativo, adicione uma assinatura e será notificado por meio de eventos para o gerenciador de tráfego.
O Gateway se inscreverá neste evento por meio de um tópico.

Como você vai implementá-lo


PrioritNormal TypNew Feature

Comentários muito úteis

O requisito para nós é usar o Micro-Gateway junto com o APIM. Os usuários geram o JWT no APIM e os utilizam para obter acesso aos Micro-GW: s individuais. Anteriormente, todas as APIs subscritas estavam presentes nos metadados JWT e podiam ser verificadas "offline" pelo Micro-GW. Esta nova configuração requer que todas as nossas micro-instâncias GW escutem a assinatura JMS para se manterem atualizadas. (e nenhuma maneira de verificar no JWT quais assinaturas estão disponíveis para o cliente)

Só estou pensando que, com potencialmente centenas de micro-GW: s, será difícil depurar porque alguém está recebendo um 401 ... o Tópico não foi registrado, precisamos reiniciar o Micro-GW para fazê-lo baixar todos os metadados de assinatura, o que acontece se o APIM não estiver respondendo quando o Micro-GW estiver iniciando etc. Ter todos os subs cribedAPI: se metadados anexados nos metadados JWT tornou a solução muito mais "robusta" e Micro-GW: s não tinha nenhum vínculo com o APIM, pois o JWT continha todas as informações (e o próprio cliente podia verificar nos metadados do JWT quais assinaturas ele tinha acesso com a chave). Portanto, tudo que eu quero é uma maneira de gerar o comportamento antigo JWT para usar com nosso Micro-GW: s. Talvez seja possível estendendo alguma classe JWT-Generator para APIM? (Ou esse novo manuseio tornará isso muito difícil de realizar?)

Todos 11 comentários

@isharac

carregue as informações necessárias para a validação da assinatura na memória na inicialização do servidor e no carregamento do locatário para os locatários.

No PR wso2 / carbon-apimgt # 8563 os serviços não estão garantidos no momento. Como esses serviços serão protegidos? Autenticação básica ou OAuth?

@isharac @chamilaadhi
Além disso, com essa mudança, exatamente quais atributos perdemos abaixo do JWT e cargas úteis de resposta de validação de chave.


JWT:

{
  "aud": "http://org.wso2.apimgt/gateway",
  "sub": "[email protected]",
  "application": {
    "owner": "admin",
    "tierQuotaType": "requestCount",
    "tier": "10PerMin",
    "name": "New App",
    "id": 2,
    "uuid": null
  },
  "scope": "am_application_scope default",
  "iss": "https://localhost:9443/oauth2/token",
  "tierInfo": {
    "Unlimited": {
      "tierQuotaType": "requestCount",
      "stopOnQuotaReach": true,
      "spikeArrestLimit": 0,
      "spikeArrestUnit": null
    }
  },
  "keytype": "PRODUCTION",
  "subscribedAPIs": [
    {
      "subscriberTenantDomain": "carbon.super",
      "name": "PizzaShackAPI",
      "context": "/pizzashack/1.0.0",
      "publisher": "admin",
      "version": "1.0.0",
      "subscriptionTier": "Unlimited"
    }
  ],
  "consumerKey": "some_value",
  "exp": 3738643151,
  "iat": 1591159504,
  "jti": "some_valu2"
}


Resposta de validação de chave

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
        <ns:validateKeyResponse xmlns:ns="http://org.apache.axis2/xsd">
            <ns:return xmlns:ax2129="http://keymgt.apimgt.carbon.wso2.org/xsd"
                       xmlns:ax2131="http://api.apimgt.carbon.wso2.org/xsd"
                       xmlns:ax2133="http://dto.impl.apimgt.carbon.wso2.org/xsd"
                       xmlns:ax2135="http://model.api.apimgt.carbon.wso2.org/xsd"
                       xmlns:ax2136="http://dto.api.apimgt.carbon.wso2.org/xsd"
                       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ax2133:APIKeyValidationInfoDTO">
                <ax2133:apiName>$APINAME</ax2133:apiName>
                <ax2133:apiPublisher>admin</ax2133:apiPublisher>
                <ax2133:apiTier xsi:nil="true" />
                <ax2133:applicationId>$APPLICATION_ID</ax2133:applicationId>
                <ax2133:applicationName>$APPLICATION_NAME</ax2133:applicationName>
                <ax2133:applicationTier>$APPLICATION_TIER</ax2133:applicationTier>
                <ax2133:authorized>true</ax2133:authorized>
                <ax2133:authorizedDomains xsi:nil="true" />
                <ax2133:consumerKey>fxzmLefepgKF2Qa</ax2133:consumerKey>
                <ax2133:contentAware>false</ax2133:contentAware>
                <ax2133:endUserName>[email protected]</ax2133:endUserName>
                <ax2133:endUserToken xsi:nil="true" />
                <ax2133:issuedTime>15288163</ax2133:issuedTime>
                <ax2133:scopes>default</ax2133:scopes>
                <ax2133:scopes>am_application_scope</ax2133:scopes>
                <ax2133:spikeArrestLimit>0</ax2133:spikeArrestLimit>
                <ax2133:spikeArrestUnit xsi:nil="true" />
                <ax2133:stopOnQuotaReach>true</ax2133:stopOnQuotaReach>
                <ax2133:subscriber>admin</ax2133:subscriber>
                <ax2133:subscriberTenantDomain>carbon.super</ax2133:subscriberTenantDomain>
                <ax2133:throttlingDataList>api_level_throttling_key</ax2133:throttlingDataList>
                <ax2133:tier>$TIER</ax2133:tier>
                <ax2133:type>$KEY_TYPE</ax2133:type>
                <ax2133:userType>APPLICATION</ax2133:userType>
                <ax2133:validationStatus>0</ax2133:validationStatus>
                <ax2133:validityPeriod>9223376854775807</ax2133:validityPeriod>
            </ns:return>
        </ns:validateKeyResponse>
    </soapenv:Body>
</soapenv:Envelope>

@isharac

carregue as informações necessárias para a validação da assinatura na memória na inicialização do servidor e no carregamento do locatário para os locatários.

No PR wso2 / carbon-apimgt # 8563 os serviços não estão garantidos no momento. Como esses serviços serão protegidos? Autenticação básica ou OAuth?

Isso é protegido com autenticação básica.

@praminda , teremos apenas declarações JWT padrão em um JWT proveniente do provedor Oauth após essa mudança

OK. Então, vamos perder os atributos abaixo do JWT,

"application": {},
"tierInfo": {},
"keytype": "",
"subscribedAPIs": [],

e apenas os seguintes atributos estarão disponíveis na resposta de validação de chave. Estou correcto?

<ax2133:apiName>$APINAME</ax2133:apiName>
<ax2133:apiPublisher>admin</ax2133:apiPublisher>
<ax2133:apiTier xsi:nil="true" />
<ax2133:authorized>true</ax2133:authorized>
<ax2133:authorizedDomains xsi:nil="true" />
<ax2133:consumerKey>fxzmLefepgKF2Qa</ax2133:consumerKey>
<ax2133:contentAware>false</ax2133:contentAware>
<ax2133:endUserName>[email protected]</ax2133:endUserName>
<ax2133:endUserToken xsi:nil="true" />
<ax2133:issuedTime>15288163</ax2133:issuedTime>
<ax2133:scopes>default</ax2133:scopes>
<ax2133:scopes>am_application_scope</ax2133:scopes>
<ax2133:userType>APPLICATION</ax2133:userType>
<ax2133:validationStatus>0</ax2133:validationStatus>
<ax2133:validityPeriod>9223376854775807</ax2133:validityPeriod>

Isso é implementado.

Alguma consideração para permitir ao usuário configurar este comportamento ou não? Prefere ser capaz de obter todas as informações em um JWT do que depender de assinaturas JMS para se manter atualizado. Ou pelo menos uma forma de gerar um JWT com todas as assinaturas do banco de dados? (Especificamente quando usado junto com micro-gw).

Olá @ christian-morin
Não temos planos de torná-lo configurável, pois este é o comportamento padrão agora.
E o gerenciador de chaves de terceiros não tem conhecimento dos metadados de assinaturas (já que o banco de dados não é compartilhado), o JWT gerado a partir do KM de terceiros não pode ser incluído nos dados de assinatura.

Se você puder compartilhar suas necessidades específicas, talvez possamos encontrar uma solução.

O requisito para nós é usar o Micro-Gateway junto com o APIM. Os usuários geram o JWT no APIM e os utilizam para obter acesso aos Micro-GW: s individuais. Anteriormente, todas as APIs subscritas estavam presentes nos metadados JWT e podiam ser verificadas "offline" pelo Micro-GW. Esta nova configuração requer que todas as nossas micro-instâncias GW escutem a assinatura JMS para se manterem atualizadas. (e nenhuma maneira de verificar no JWT quais assinaturas estão disponíveis para o cliente)

Só estou pensando que, com potencialmente centenas de micro-GW: s, será difícil depurar porque alguém está recebendo um 401 ... o Tópico não foi registrado, precisamos reiniciar o Micro-GW para fazê-lo baixar todos os metadados de assinatura, o que acontece se o APIM não estiver respondendo quando o Micro-GW estiver iniciando etc. Ter todos os subs cribedAPI: se metadados anexados nos metadados JWT tornou a solução muito mais "robusta" e Micro-GW: s não tinha nenhum vínculo com o APIM, pois o JWT continha todas as informações (e o próprio cliente podia verificar nos metadados do JWT quais assinaturas ele tinha acesso com a chave). Portanto, tudo que eu quero é uma maneira de gerar o comportamento antigo JWT para usar com nosso Micro-GW: s. Talvez seja possível estendendo alguma classe JWT-Generator para APIM? (Ou esse novo manuseio tornará isso muito difícil de realizar?)

Olá @ christian-morin
Para apoiar o seu caso de uso, podemos apresentar 2 opções.

Opção 1:
Use APIM 3.1.0 com MG 3.2.0

Opção 2:
Use API-M 3.2.0 e personalize o TokenIssuer conforme explicado em [1].
Nesse caso, você precisará compartilhar o banco de dados APIM com o nó do gerenciador de chaves e poderá adicionar as declarações necessárias no JWT.

Espero que isto ajude!
[1] https://is.docs.wso2.com/en/latest/learn/extension-points-for-oauth/#oauth -token-generator

Oi @isharac

Obrigado pela resposta. Presumo que a Opção 1 não seja uma solução muito boa a longo prazo, pois então nunca poderemos atualizar o produto. ;)

Suspeitei que teríamos que escrever um TokenIssuer personalizado como você sugere, mas fico feliz em saber que é possível. Obrigada.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

Thangthanh picture Thangthanh  ·  3Comentários

akurathimohan picture akurathimohan  ·  3Comentários

ruks picture ruks  ·  11Comentários

YannickB picture YannickB  ·  25Comentários

markokocic picture markokocic  ·  10Comentários