elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  Como obtengo los datos de la autorizacion (Basic Auth) en un request API | Python Django
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Como obtengo los datos de la autorizacion (Basic Auth) en un request API | Python Django  (Leído 1,625 veces)
Drakaris

Desconectado Desconectado

Mensajes: 286


Todo lo que puedas imaginar, lo puedes crear.


Ver Perfil
Como obtengo los datos de la autorizacion (Basic Auth) en un request API | Python Django
« en: 18 Septiembre 2021, 21:33 pm »

Buenos dias, ¿como estais?  :D

Tengo un pequeño problemilla. Os cuento, estoy haciendo una API en Django [sin Django REST Framework  :silbar:] y esta API el usuario puede utilizarla si se autentifica con metodo Basic Auth

Donde pone Username es la Password
Y donde pone password es el OTP

Mi API hace esto:
Código
  1. @csrf_exempt
  2.    def requests(self,req,table:str,columns:list=False):
  3.        try:
  4.            try:
  5.                if not loginAdmin(req.headers['password'], int(req.headers['otp'])):
  6.                    raise Exception("Access denied")
  7.            except:
  8.                raise Exception("You need authentication")
  9.            conn = sqlite3.connect(Environment().pathDB())
  10.            cursor = conn.cursor()
  11.  
es parte del codigo, pues yo estoy aqui seleccionando las keys password y otp del header, pero segun me he informado de que se muestra en el header en la key "Authorization" con encriptacion BASE64
https://learning.postman.com/docs/sending-requests/authorization/#basic-auth

Pero yo he hecho return de req.headers y no hay ninguna key llamada "Authorization" o "Authorization", pero en el postman si se ve

He estado buscando info y segun dicen si con req.META hay una HTTP_AUTHORIZATION, pero no se muestra ninguno
Citar
GATEWAY_INTERFACESERVER_PROTOCOLREQUEST_METHODQUERY_STRINGREQUEST_URISCRIPT_NAMEPATH_INFOPATH_TRANSLATEDHTTP_HOSTHTTP_USER_AGENTHTTP_ACCEPT_ENCODINGHTTP_ACCEPTHTTP_CONNECTIONSERVER_SIGNATURESERVER_SOFTWARESERVER_NAMESERVER_ADDRSERVER_PORTREMOTE_ADDRDOCUMENT_ROOTREQUEST_SCHEMECONTEXT_PREFIXCONTEXT_DOCUMENT_ROOTSERVER_ADMINSCRIPT_FILENAMEREMOTE_PORTmod_wsgi.script_namemod_wsgi.path_infomod_wsgi.process_groupmod_wsgi.application_groupmod_wsgi.callable_objectmod_wsgi.request_handlermod_wsgi.handler_scriptmod_wsgi.script_reloadingmod_wsgi.listener_hostmod_wsgi.listener_portmod_wsgi.enable_sendfilemod_wsgi.ignore_activitymod_wsgi.request_startmod_wsgi.request_idmod_wsgi.script_startwsgi.versionwsgi.multithreadwsgi.multiprocesswsgi.run_oncewsgi.url_schemewsgi.errorswsgi.inputwsgi.input_terminatedwsgi.file_wrapperapache.versionmod_wsgi.versionmod_wsgi.total_requestsmod_wsgi.thread_idmod_wsgi.thread_requests

Aqui dejo la API:
Código
  1. from sources import loginAdmin,Environment,logFile
  2. import sqlite3,re
  3. from django.urls import  path
  4. from django.http import JsonResponse, HttpResponse, QueryDict
  5. from django.views.decorators.csrf import csrf_exempt
  6.  
  7. """
  8. ==========================API REST==========================
  9. SYNTAX:
  10.    127.0.0.1/api[/table,table1,table3,...][/column]?<key>=[>|<|>=|<=]<value>&[|]<key>=[>|<|>=|<=]<value>&LIMIT=<min>[,max]
  11. ============================================================
  12. IMPORTANT:
  13.    For do a request you need authentication with password and OTP
  14.  
  15. EXAMPLES:
  16.    GET:
  17.        127.0.0.1/api/server -> SELECT * FROM server
  18.        127.0.0.1/api/server?LIMIT=5 -> SELECT * FROM server LIMIT 5
  19.        127.0.0.1/api/server?password=ejem&id=1&LIMIT=5,7 -> SELECT * FROM server WHERE password='ejem' AND id=1 LIMIT 5,7
  20.        127.0.0.1/api/server/otp,id -> SELECT otp,id FROM server
  21.        127.0.0.1/api/server/otp?id=1&password=hola -> SELECT otp FROM server WHERE id=1 AND password='hola'
  22.        127.0.0.1/api/server/otp?id=1&|password=hola -> SELECT otp FROM server WHERE id=1 OR password='hola'
  23.  
  24.    POST:
  25.        127.0.0.1/api/server -> INSERT INTO server (otp,ejem) VALUES (1234,'1233da')
  26.            Body x-www-form-urlencoded
  27.                key     value
  28.                --------------------
  29.                otp     1234
  30.                ejem    1233da
  31.  
  32.        IMPORTANT: The params in the url doesn't affect
  33.  
  34.    PUT:
  35.        127.0.0.1/api/server?port=8899&|password=h -> UPDATE server SET otp='1234', ejem='1233da' WHERE port=8899 OR password='h'
  36.            Body x-www-form-urlencoded
  37.                key     value
  38.                --------------------
  39.                otp     1234
  40.                ejem    1233da
  41.  
  42.    DELETE:
  43.        127.0.0.1/api/server?port=8899&password=h -> DELETE FROM server WHERE port=8899 AND password='h'
  44.            not body data
  45. """
  46.  
  47. class getData:
  48.    def __init__(self,data):
  49.        self.list = QueryDict(data)
  50.        self.output = ''
  51.  
  52.    # This method returns key1,key2,key3...
  53.    # For clause as SELECT, INSERT
  54.    def getKeys(self):
  55.        for t in self.list:
  56.            self.output+=f'{t},'
  57.        self.output = re.sub(r",$","",self.output)
  58.        return self.output
  59.  
  60.    # This method returns value1,value2,value3...
  61.    # For clause as SELECT, INSERT
  62.    def getValues(self):
  63.        for t in self.list:
  64.            try:
  65.                if int(self.list[t]):
  66.                    self.output+=f'{self.list[t]},'
  67.            except:
  68.                self.output += f"'{self.list[t]}',"
  69.        self.output = re.sub(r",$","",self.output)
  70.        return self.output
  71.  
  72.    # This method returns key1=value1, key2=value2, key3=value3
  73.    # being '=' the 'delimitator'
  74.    # For clause as UPDATE
  75.    def keysValues(self,delimitator):
  76.        for value in self.list:
  77.            self.output+=f"{value}{delimitator}'{self.list[value]}', "
  78.        self.output = re.sub(r", $", "", self.output)
  79.        return self.output
  80.  
  81. class Database:
  82.    # if there are columns, show it
  83.    def columns(self,columns):
  84.        if columns:
  85.            return  columns
  86.        else:
  87.            return "*"
  88.  
  89.    # This method add the operator specified in the url
  90.    def keyWhere(self,key):
  91.        operator = re.sub(r"[^>|<|=]","",key)
  92.        value = re.sub(r"[>|<|=]","",key)
  93.        if operator == "":
  94.            operator="="
  95.        try:
  96.            if int(value):
  97.                return f"{operator}{value}"
  98.        except:
  99.            return f"{operator}'{value}'"
  100.  
  101.    def LimitClause(self,params):
  102.        if params:
  103.            output = ''
  104.            for key in params:
  105.                if key=="LIMIT":
  106.                    output=f" LIMIT {params[key]}"
  107.            return output
  108.        else:
  109.            return ""
  110.  
  111.    # This method add AND or OR in each condition in WHERE
  112.    def WhereClause(self,params):
  113.        if params:
  114.            output=''
  115.            for key in params:
  116.                if key=="LIMIT":
  117.                    continue
  118.                operator = "OR" if key[0]=="|" else "AND"
  119.                if list(params).index(key) > 0:
  120.                    output+=f" {operator} {key[1::] if operator=='OR' else key}{self.keyWhere(params[key])}"
  121.                else:
  122.                    output += f"WHERE {key[1::] if operator=='OR' else key}{self.keyWhere(params[key])}"
  123.            return output
  124.        else:
  125.            return ""
  126.  
  127.    @csrf_exempt
  128.    def requests(self,req,table:str,columns:list=False):
  129.        try:
  130.            try:
  131.                if not loginAdmin(req.headers['password'], int(req.headers['otp'])):
  132.                    raise Exception("Access denied")
  133.            except:
  134.                raise Exception("You need authentication")
  135.            conn = sqlite3.connect(Environment().pathDB())
  136.            cursor = conn.cursor()
  137.            if req.method == "GET":
  138.                data = cursor.execute(f"SELECT {self.columns(columns)} FROM {table} {self.WhereClause(req.GET.dict())}{self.LimitClause(req.GET.dict())}")
  139.                data = list(data)
  140.                conn.close()
  141.                if len(data) == 0:
  142.                    data = None
  143.                return JsonResponse({
  144.                    "result": data
  145.                })
  146.            elif req.method == "POST":
  147.                if columns:
  148.                    raise Exception("POST not allowed")
  149.                cursor.execute(f"INSERT INTO {table} ({getData(req.body).getKeys()}) VALUES ({getData(req.body).getValues()})")
  150.                conn.commit()
  151.                conn.close()
  152.                return JsonResponse({"INSERT":True})
  153.            elif req.method == "PUT":
  154.                if columns:
  155.                    raise Exception("PUT not allowed")
  156.                cursor.execute(f"UPDATE {table} SET {getData(req.body).keysValues('=')} {self.WhereClause(req.GET.dict())}")
  157.                conn.commit()
  158.                conn.close()
  159.                return JsonResponse({"UPDATE": True})
  160.            elif req.method == 'DELETE':
  161.                if columns:
  162.                    raise Exception("DELETE not allowed")
  163.                cursor.execute(f"DELETE FROM {table} {self.WhereClause(req.GET.dict())}")
  164.                conn.commit()
  165.                conn.close()
  166.                return JsonResponse({"DELETE": True})
  167.        except sqlite3.Error as err:
  168.            return HttpResponse(logFile(True).message(f"DB -> {err}",True))
  169.        except Exception as err:
  170.            return HttpResponse({f"Error in the API REST -> {err}"})
  171. urlpatterns=[
  172.    path('<table>',Database().requests),
  173.    path('<table>/<columns>',Database().requests)
  174. ]
  175.  

¿Como yo puedo mostrar los datos del Auth? Muchas gracias.

P.D: Cualquier comentario, sugerencia u opinion sobre la mejora del código, lo agradecería mucho. Mil gracias.


« Última modificación: 19 Septiembre 2021, 00:48 am por Drakaris » En línea

Lo increible, no es lo que ves, sino como es
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
visual basic 6 HTTP request
Programación Visual Basic
markx 6 8,031 Último mensaje 29 Agosto 2007, 20:23 pm
por markx
parametros variables en modelos de django [python]
Desarrollo Web
Kase 0 2,967 Último mensaje 14 Mayo 2011, 00:06 am
por Kase
[Duda]Como obtengo el valor de un Text-Tkinter(Python)
Scripting
Proxmond 0 2,113 Último mensaje 18 Junio 2014, 01:42 am
por Proxmond
Dudas sobre el API de twitter para php (user auth, app auth)
PHP
erest0r 2 1,839 Último mensaje 18 Junio 2015, 23:01 pm
por erest0r
[PYTHON] Modulo request
Scripting
dimineko 1 2,117 Último mensaje 12 Mayo 2019, 22:14 pm
por tincopasan
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines