Autenticación con Azure B2C y API Management

Para un caso práctico imaginemos que tenemos una aplicación web que esta dividida en dos partes importantes el frontend y el backend o API y necesitamos tener registro de usuario e inicio de sesión y la protección de nuestro API evitando que cualquiera pueda hacer request y obtener la información sensible de manera fácil.

En el siguiente gráfico podrás ver el diseño a un alto nivel de como debería funcionar nuestra aplicación.

arch

Requisitos

A continuación vamos a realizar los ajustes necesario en cada una de las principales capas.

Frontend

Cada vez que un usuario realiza un login a través de AD B2C este al momento de realizar el redireccionamiento a nuestro front dentro de los parámetros de la url envía el id_token

#id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ilg1ZVhrNHh5b2pOR...

Desde nuestro front debemos obtener este token para luego enviarlo en los headers de los rquests necesrios a Azure API Management.

API Management

API Management maneja una serie de políticas que nos van ayudar a controlar el acceso a nuestro API así como mantener trazabilidad e información sobre los consumos de nuestro API.

Para este caso queremos que ante cada request que se haga valide si el JWT Token que están enviando es valido.

Accedemos al portal de azure y buscamos API Management en All Services una vez allí seleccionamos nuestro API Management.

Accedemos a API's -> {nuestro-api} -> All operations

Como veras tenemos varias partes donde podremos agregar diferentes tipos de políticas según necesitemos. Para este caso particular necesitamos validar que el request lleve un JWT Token y este este firmado correctamente asi que vamos a crear una nueva política en el apartado Inbound processing.

Para esto simplemente damos clic en la opción Add policy y en la lista seleccionamos Other policies

nos abrirá un editor XML donde agregaremos la política para validar el JWT Token.

Deberas agregar el siguiente código entre el tag <inbound></inbound> y salvar para aplicar los cambios.

<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">  
  <openid-config url="https://{tenant}.b2clogin.com/tfp/{tenant}.onmicrosoft.com/{user-flow-policy-name}/v2.0/.well-known/openid-configuration" />
    <required-claims>
      <claim name="aud">
        <value>{application-id}</value>
      </claim>
    </required-claims>
</validate-jwt>  

Acá debes tener en cuenta los siguientes datos importantes:

  • tenant

Corresponde al tenant que create al momento de desplegar el Azure AD B2C

  • user-flow-policy-name

Es el nombre que definiste al crear el flujo de login de usuario dentro de Azure AD B2C

  • application-id

Este es el id de la aplicación que estas usando en el flujo de usuario de login, para este caso.

En resumen el xml incluye un parametro url dentro del tag openid-config esta url la podrás obtener fácilmente entrando al panel de Azure AD B2C en la opción User flows(policies) -> B2C_1_{your-policy} -> Run user flow, asegurate de seleccionar la aplicación y el dominio correctos.

run-flow

En esta vista podras encontrar la url que necesitamos en la parte superior.

Importante

Para que la validación de la firma del JWT Token que se genera luego del login sea exitosa deberemos asegurarnos que dentro de las propiedades nuestro user-flow tenemos seleccionado en el issuerde Token compatibility settings la url que contiene el nombre de nuestro user-flow

user-flow-properties

Por ultimo el application-id deberá corresponder a la aplicación que seleccionamos en el momento en que obtuvimos la url parar openid-config.

Listo! con esto ya tenemos todo lo necesario para que las llamadas a nuestro API a travez de API Management estén validadas y protegidas por medio de JWT Token generado por Azure AD B2C.

Ahora cada llamada que hagamos al API deberá incluir en el header de la peticion el JWT Token

Authorization eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ilg1ZVhrNHh5b2pOR...

API

Ahora Azure API Management enviará los request a nuestro API y junto al request envia tambien el Header Authorization asi es que podremos hacer el decode del JWT Token para obtener la información necesaria y así limitar las respuestas de los endpoint de acuerdo a nuestra lógica o necesidad.

Jose Aponte

Desarrollador full-stack apasionado por las tecnologías de información y los lenguajes de programación. Me gustan divertirme con mi familia, mi lema es "Nunca paras de Aprender"

Bogota

Subscribe to Jappsku Engineering Blog

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!