Desenvolvimento de um autorizador personalizado com FunctionGraph
Visão geral
As melhores práticas para o APIG da Huawei Cloud orientam você pelo desenvolvimento de autorizadores personalizados.
Além do IAM e da autenticação de aplicações, o APIG também suporta autenticação personalizada com seu próprio sistema de autenticação, que pode se adaptar melhor aos recursos de sua empresa.
A autenticação personalizada é implementada usando o serviço FunctionGraph. Você pode criar uma função de FunctionGraph para que o APIG possa invocá-la para autenticar solicitações para sua API. Esta seção usa a autenticação básica como um exemplo para descrever como implementar a autenticação personalizada com o FunctionGraph.
Desenvolvimento de uma função de autenticação personalizada
Crie uma função no console do FunctionGraph consultando Criação de uma função para autenticação personalizada de front-end.
Especifique o tempo de execução como Python 3.6.
Parâmetro |
Descrição |
---|---|
Function Type |
Padrão: Event Function |
Region |
Selecione a mesma região que a do APIG. |
Function Name |
Insira um nome que esteja em conformidade com regras específicas para facilitar a pesquisa. |
Agency |
Uma agência que delega FunctionGraph para acessar outros serviços em nuvem. Para este exemplo, selecione Use no agency. |
Enterprise Project |
A opção padrão é default. |
Runtime |
Selecione Python 3.6. |
Na página de guia Code, copie o seguinte código para index.py (se você estiver usando um gateway dedicado, para o qual o parâmetro authorizer_context_support_num_bool foi ativado, o tipo de value no context pode ser boolean ou number).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# -*- coding:utf-8 -*- import json def handler(event, context): # If the authentication information is correct, the username is returned. if event["headers"]["authorization"]=='Basic dXN****cmQ=': return { 'statusCode': 200, 'body': json.dumps({ "status":"allow", "context":{ "user_name":"user1" } }) } else: return { 'statusCode': 200, 'body': json.dumps({ "status":"deny", "context":{ "code": "1001", "message":"incorrect username or password", "authorizer_success": "false" } }) } |
Criação de um autorizador personalizado
No console do APIG, acesse a página Create Custom Authorizer, defina Type como Frontend, selecione a função criada na seção anterior e clique em OK.
Criação de uma API de autenticação personalizada
Crie uma API consultando Criação de uma API. Defina o modo de autenticação como Custom e selecione o autorizador personalizado criado na seção anterior. Depois de modificar a API, publique-a.
Configuração da resposta a erros
Se informações de autenticação incorretas forem transportadas em uma solicitação para a API, a resposta será exibida da seguinte forma:
1
|
{"error_msg":"Incorrect authentication information: frontend authorizer","error_code":"APIG.0305","request_id":"36e42b3019077c2b720b6fc847733ce9"} |
Para retornar o campo no context da função como a resposta da API (se você estiver usando um gateway dedicado, para o qual o parâmetro authorizer_context_support_num_bool foi ativado, o tipo de value em context pode ser boolean ou number), modifique o modelo de resposta do gateway. Na página de detalhes do grupo ao qual a API pertence, navegue até a área Gateway Responses na guia Gateway Information e clique em Edit. Altere o código de status para 401, modifique o modelo de resposta com o seguinte código e clique em OK (não é necessário adicionar aspas duplas para variáveis do tipo boolean ou number):
1
|
{"code":"$context.authorizer.frontend.code","message":"$context.authorizer.frontend.message", "authorizer_success": "$context.authorizer.frontend.authorizer_success"} |
2
Após a modificação, se a autenticação incorreta for transferida ao chamar a API, o código de status 401 será retornado e o resultado da resposta será o seguinte:
1
|
{"code":"1001","message":"incorrect username or password","authorizer_success": "false"} |
Mapeamento de parâmetros de autenticação de front-end para parâmetros de back-end
Se a autenticação for bem-sucedida, as informações de contexto retornadas pela função podem ser transferidas para o back-end da API. Para fazer isso, execute as seguintes configurações:
Na página APIs, escolha More > Edit na linha que contém a API e vá para a página Define Backend Request. Adicione um parâmetro do sistema, especifique o tipo de parâmetro como Frontend authentication parameter, defina o nome do parâmetro para o conteúdo do campo context na resposta da função e defina o nome e a localização do parâmetro de back-end para o qual você deseja mapear o parâmetro de autenticação do front-end.
Depois de modificar a API, publique-a novamente. Se as informações de autenticação transportadas em uma solicitação para a API estiverem corretas, o resultado da resposta conterá o campo de cabeçalho X-User-Name cujo valor é o mesmo do user_name no campo context da função de autenticação.