fernandoperezwh / djRefugioAnimalesOAuthAPI

0 stars 0 forks source link

Docs: Authorization Grant Types #1

Open fernandoperezwh opened 2 years ago

fernandoperezwh commented 2 years ago

image

fernandoperezwh commented 2 years ago

Authorization Grant Type: Client Credentials

Registrar una aplicación

Con su navegador dirijase a http://localhost:8012/api/auth/applications/register/ para crear una aplicación.

Llene el formulario como se muestra en la imagen de abajo, y antes de guardar tome nota del "Client id" y "Cliente secret" , lo usaremos en un momento. image

Exporte las siguientes variables de entorno para que puedan ser accessibles y obtener como salida el enlace para seguir el flujo de Authorization code

export CLIENT_ID=NNsyTJGQ8IyjLWa8j38bEDc9Lf8wsblW2JxK50m6
export CLIENT_SECRET=MtwUKMJTk09XOuZJPExzpbKr07wXHQxww5KnequwWN5oPsPUqkrMwFDphl7LAQxSM83K9NaviNbkUPzKcmUxUQQWLDewGCWwSzjdMmn725FS15gLEYqAEJVOesKFIEkI

Codificar en base64 el client_id y client_secret para obtener el credential

Este flujo es mas simple que el "Authorization Code". Necesitamos codificar el client_id y client_secret como autenticacion base HTTP codificada en base64.

Con el siguiente comando podemos guardar en una variable de entorno llamada CREDENTIALS el resultado de codificar el CLIENT_ID y CLIENT_SECRET

export CREDENTIAL=$(printf '%s' $(printf "${CLIENT_ID}:${CLIENT_SECRET}" | base64) ; echo)

Obtener el Access Token

Para empezar el flujo de "Client Credential" debera llamar al endpoint /token/

curl -X POST \
    -H "Authorization: Basic ${CREDENTIAL}" \
    -H "Cache-Control: no-cache" \
    -H "Content-Type: application/x-www-form-urlencoded" \
    "http://localhost:8012/api/auth/token/" \
    -d "grant_type=client_credentials"
fernandoperezwh commented 2 years ago

Authorization Grant Type: Authorization Code

Con su navegador dirijase a http://localhost:8012/api/auth/applications/register/ para crear una aplicación.

Llene el formulario como se muestra en la imagen de abajo, y antes de guardar tome nota del "Client id" y "Cliente secret" , lo usaremos en un momento. image

Exporte las siguientes variables de entorno para que puedan ser accessibles y obtener como salida el enlace para seguir el flujo de Authorization code

export CLIENT_ID=NNsyTJGQ8IyjLWa8j38bEDc9Lf8wsblW2JxK50m6
export CLIENT_SECRET=MtwUKMJTk09XOuZJPExzpbKr07wXHQxww5KnequwWN5oPsPUqkrMwFDphl7LAQxSM83K9NaviNbkUPzKcmUxUQQWLDewGCWwSzjdMmn725FS15gLEYqAEJVOesKFIEkI

echo "http://localhost:8012/api/auth/authorize/?response_type=code&client_id=${CLIENT_ID}"

Copie la salida de lo anterior y peguelo en un navegador que cuentre con su sesión previamente abierta. Debe salir una vista similar a esta, de clic en el boton de Autorizar para continuar. image

Al autorizar será redireccionado a la url que especifico en el formulario cuando registro la aplicación junto con un code que podra utilizarse para obtener el Access Token

http://localhost:8012/oauth/callback?code=uVqLxiHDKIirldDZQfSnDsmYW1Abj2

Exporte ese code a una variable de entorno

export CODE=uVqLxiHDKIirldDZQfSnDsmYW1Abj2

Obtener al Access Token

curl -X POST \
    -H "Cache-Control: no-cache" \
    -H "Content-Type: application/x-www-form-urlencoded" \
    "http://localhost:8012/api/auth/token/" \
    -d "client_id=${CLIENT_ID}" \
    -d "client_secret=${CLIENT_SECRET}" \
    -d "code=${CODE}" \
    -d "grant_type=authorization_code"
fernandoperezwh commented 2 years ago

Authorization Grant Type: Resource owner password-based

Con su navegador dirijase a http://localhost:8012/api/auth/applications/register/ para crear una aplicación.

Llene el formulario como se muestra en la imagen de abajo, y antes de guardar tome nota del "Client id" y "Cliente secret" , lo usaremos en un momento. image

Exporte las siguientes variables de entorno para que puedan ser accessibles

export USERNAME=fernando
export PASSWORD=fernando123
export CLIENT_ID=NNsyTJGQ8IyjLWa8j38bEDc9Lf8wsblW2JxK50m6
export CLIENT_SECRET=MtwUKMJTk09XOuZJPExzpbKr07wXHQxww5KnequwWN5oPsPUqkrMwFDphl7LAQxSM83K9NaviNbkUPzKcmUxUQQWLDewGCWwSzjdMmn725FS15gLEYqAEJVOesKFIEkI
curl -X POST "http://localhost:8012/api/auth/token/" \
    -d "grant_type=password" \
    -d "username=${USERNAME}" \
    -d "password=${PASSWORD}" \
    -u"${CLIENT_ID}:${CLIENT_SECRET}"
fernandoperezwh commented 2 years ago

Authorization Grant Type: Implicit

Con su navegador dirijase a http://localhost:8012/api/auth/applications/register/ para crear una aplicación.

Llene el formulario como se muestra en la imagen de abajo, y antes de guardar tome nota del "Client id" y "Cliente secret" , lo usaremos en un momento. image

Exporte las siguientes variables de entorno para que puedan ser accessibles

export CLIENT_ID=NNsyTJGQ8IyjLWa8j38bEDc9Lf8wsblW2JxK50m6
export CLIENT_SECRET=MtwUKMJTk09XOuZJPExzpbKr07wXHQxww5KnequwWN5oPsPUqkrMwFDphl7LAQxSM83K9NaviNbkUPzKcmUxUQQWLDewGCWwSzjdMmn725FS15gLEYqAEJVOesKFIEkI

echo "http://localhost:8012/api/auth/authorize/?response_type=token&client_id=${CLIENT_ID}"

Al autorizar será redireccionado a la url que especifico en el formulario cuando registro la aplicación junto con el access_token, refresh_token, expires_in y el scope que vienen de forma implícita en el hash de la url.

http://localhost:8000/oauth/callback#access_token=DdPCKNSQ7vQWJKkCGLl5HnZNeI9TaQ&token_type=Bearer&state=&expires_in=36000&scope=read+write

Es similar al flujo de "Authorization code" pero con dos diferencias:


"[...] La única razón restante para usar el flujo implícito es si el servidor de autorización no admite o no puede admitir solicitudes de origen cruzado (CORS). La concesión del código de autorización requiere que la aplicación de JavaScript realice una solicitud POST al servidor de autorización, por lo que el servidor de autorización deberá admitir los encabezados CORS apropiados para permitir que el navegador realice esa solicitud. Este es un cambio relativamente fácil de realizar si está creando su propio servidor de autorización, pero si está utilizando un servidor existente, es posible que tenga que usar la concesión implícita para sortear la limitación de CORS." .- What is the OAuth 2.0 Implicit Grant Type?

fernandoperezwh commented 2 years ago

Lecturas

Por qué el tipo de concesión de credenciales de contraseña del propietario del recurso no es autenticación ni es adecuado para aplicaciones modernas

"El tipo de concesión de credenciales de contraseña del propietario del recurso es adecuado en los casos en que el propietario del recurso tiene una relación de confianza con el cliente, como el sistema operativo del dispositivo o una aplicación con muchos privilegios. El servidor de autorizaciones debe tener especial cuidado al habilitar este tipo de concesión y SOLO PERMITIRLO CUANDO OTROS FLUJOS NO SON VIABLES.". RFC 6749 The OAuth 2.0 Authorization Framework - Section 4.3