Enabled fido registration on frontend

This commit is contained in:
Spitfireap
2024-06-22 19:45:22 +02:00
parent def1f65aea
commit 176cead8f2
9 changed files with 47 additions and 22 deletions
+1 -1
View File
@@ -18,7 +18,7 @@ Then, just run the following command::
Then if not done already, run this command to create an OIDC application
in order to be able to log in from the frontend::
$ docker exec modoboa-api '/bin/sh -c python3 /code/test_project/manage.py createapplication --name frontend --algorithm RS256 --redirect-uris 'http://localhost:3000/login/logged' public authorization_grant_type authorization-code'
$ docker exec modoboa-api '/bin/sh -c python3 /code/test_project/python manage.py createapplication --name frontend --client-id "LVQbfIIX3khWR3nDvix1u9yEGHZUxcx53bhJ7FlD" --user 1 --algorithm RS256 --redirect-uris 'https://localhost:3000/login/logged' public authorization-code'
It will start the docker environment and make a Modoboa instance
available at ``http://localhost:8000`` and the new admin interface at ``http://localhost:8080``
+2 -1
View File
@@ -13,8 +13,9 @@ RUN python3 -m venv $VIRTUAL_ENV
WORKDIR /tmp
COPY requirements.txt /tmp
COPY test-requirements.txt /tmp
COPY dev-requirements.txt /tmp
RUN python -m pip install -U pip
RUN pip install -r requirements.txt -r test-requirements.txt
RUN pip install -r requirements.txt -r test-requirements.txt -r dev-requirements.txt
FROM base as run
COPY docker/doveadm /usr/local/bin
RUN chmod +x /usr/local/bin/doveadm
+4 -1
View File
@@ -18,5 +18,8 @@ export default {
},
endFidoRegistration(data) {
return repository.post('/fido/registration/end/', data)
}
},
getAllFidoRegistred() {
return repository.get('/fido/')
},
}
@@ -66,6 +66,9 @@ async function startFidoRegistration() {
onMounted(() => {
registrationLoading.value = true
authApi.getAllFidoRegistred().then((resp) => {
console.log(resp)
})
authApi.beginFidoRegistration().then((resp) => {
creationOption.value = createRequestFromJSON(resp.data)
}).finally(() => registrationLoading.value = false)
+1 -1
View File
@@ -241,7 +241,7 @@ class CoreGlobalParametersSerializer(serializers.Serializer):
class FIDOSerializer(serializers.ModelSerializer):
class Meta:
model = models.UserFidoKeys
fields = ["id", "name", "enabled", "added_on", "last_used"]
fields = ["id", "name", "enabled", "added_on", "last_used", "use_count"]
class FidoRegistrationSerializer(serializers.Serializer):
+5 -1
View File
@@ -195,6 +195,10 @@ class FIDOViewSet(GetThrottleViewsetMixin,
serializer = serializers.FidoRegistrationSerializer(
data=request.data)
serializer.is_valid(raise_exception=True)
f2_auth.end_registration(request.data,
credential_data = f2_auth.end_registration(request.data,
request.session.pop("fido2_state"),
request.user.id)
models.UserFidoKeys.objects.create(name=request.data["name"],
credential_data=credential_data,
user=request.user)
return response.Response({"success": True}, 200)
+3 -3
View File
@@ -3,7 +3,7 @@ from .models import UserFidoKeys
from fido2.webauthn import PublicKeyCredentialRpEntity, PublicKeyCredentialUserEntity, AttestedCredentialData, UserVerificationRequirement
from fido2.server import Fido2Server
from fido2.utils import websafe_decode
from fido2.utils import websafe_decode, websafe_encode
import fido2.features
@@ -20,7 +20,7 @@ def create_fido2_server():
def get_creds_from_user(user_id):
[AttestedCredentialData(websafe_decode(uf.token)) for uf in UserFidoKeys.objects.filter(user=user_id)]
return [AttestedCredentialData(websafe_decode(uf.credential_data)) for uf in UserFidoKeys.objects.filter(user=user_id)]
def begin_registration(request):
@@ -47,4 +47,4 @@ def end_registration(data, fido2_state, user_id):
fido2_state,
data
)
print(auth_data)
return websafe_encode(auth_data.credential_data)
+25 -12
View File
@@ -1,4 +1,4 @@
# Generated by Django 4.2.11 on 2024-04-18 15:18
# Generated by Django 4.2.11 on 2024-05-02 16:58
from django.conf import settings
from django.db import migrations, models
@@ -8,22 +8,35 @@ import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('core', '0027_alter_user_language'),
("core", "0027_alter_user_language"),
]
operations = [
migrations.CreateModel(
name='UserFidoKeys',
name="UserFidoKeys",
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)),
('enabled', models.BooleanField(default=True)),
('platform', models.CharField(default='', max_length=255)),
('added_on', models.DateTimeField(auto_now_add=True)),
('last_used', models.DateTimeField(default=None, null=True)),
('credential_id', models.CharField(max_length=255, unique=True)),
('token', models.CharField(max_length=255)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.CharField(max_length=255)),
("enabled", models.BooleanField(default=True)),
("added_on", models.DateTimeField(auto_now_add=True)),
("last_used", models.DateTimeField(default=None, null=True)),
("use_count", models.IntegerField(default=0)),
("credential_data", models.TextField()),
(
"user",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
),
),
],
),
]
+3 -2
View File
@@ -417,8 +417,9 @@ class UserFidoKeys(models.Model):
name = models.CharField(max_length=255)
enabled = models.BooleanField(default=True)
added_on = models.DateTimeField(auto_now_add=True)
last_used = models.DateTimeField(null=True,default=None)
credential_data = models.CharField(max_length=4096)
last_used = models.DateTimeField(null=True, default=None)
use_count = models.IntegerField(default=0)
credential_data = models.TextField()
def populate_callback(user, group="SimpleUsers"):