- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在为一个项目实现 webauthn。重点是让用户可以在网站上的手机上使用 FaceId 或指纹扫描。
我尝试了 webauthn 的 djoser 版本,但我想为已经拥有帐户的用户提供这种可能性,所以我实现了 djoser 的 webauthn 并更新了它,使其可以与已经创建的帐户一起使用。
我可以请求 webauthn token 的注册请求,并在我使用 @simplewebauthn/browser ("@simplewebauthn/browser": "^6.3.0-alpha.1") 。那里一切正常。
我通过拉动 git 使用最新版本的 djoser,webauthn 的版本是 0.4.7 链接到 djoser。
djoser @git+https://github.com/sunscrapers/djoser.git@abdf622f95dfa2c6278c4bd6d50dfe69559d90c0
webauthn==0.4.7
但是当我把注册的结果发回后台时,报错:
身份验证被拒绝。错误:收到无效签名..
这是 SignUpView:
permission_classes = (AllowAny,)
def post(self, request, ukey):
co = get_object_or_404(CredentialOptions, ukey=ukey)
webauthn_registration_response = WebAuthnRegistrationResponse(
rp_id=settings.DJOSER["WEBAUTHN"]["RP_ID"],
origin=settings.DJOSER["WEBAUTHN"]["ORIGIN"],
registration_response=request.data,
challenge=co.challenge,
none_attestation_permitted=True,
)
try:
webauthn_credential = webauthn_registration_response.verify()
except RegistrationRejectedException as e:
return Response(
{api_settings.NON_FIELD_ERRORS_KEY: format(e)},
status=status.HTTP_400_BAD_REQUEST,
)
user = User.objects.get(username=request.data["username"])
user_serializer = CustomUserSerializer(user)
co.challenge = ""
co.user = user
co.sign_count = webauthn_credential.sign_count
co.credential_id = webauthn_credential.credential_id.decode()
co.public_key = webauthn_credential.public_key.decode()
co.save()
return Response(user_serializer.data, status=status.HTTP_201_CREATED)
这里还有 SignUpRequesrtView
,我在其中编辑了一些小东西以使其按我想要的方式工作:
class SignupRequestView(APIView):
permission_classes = (AllowAny,)
def post(self, request):
CredentialOptions.objects.filter(username=request.data["username"]).delete()
serializer = WebauthnSignupSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
co = serializer.save()
credential_registration_dict = WebAuthnMakeCredentialOptions(
challenge=co.challenge,
rp_name=settings.DJOSER["WEBAUTHN"]["RP_NAME"],
rp_id=settings.DJOSER["WEBAUTHN"]["RP_ID"],
user_id=co.ukey,
username=co.username,
display_name=co.display_name,
icon_url="",
)
return Response(credential_registration_dict.registration_dict)
我还更新了 WebAuthnSignupSerializer
以检查是否存在具有给定用户名的帐户,如果是,则创建 CredentialOptions
:
class WebauthnSignupSerializer(serializers.ModelSerializer):
class Meta:
model = CredentialOptions
fields = ("username", "display_name")
def create(self, validated_data):
validated_data.update(
{
"challenge": create_challenge(
length=settings.DJOSER["WEBAUTHN"]["CHALLENGE_LENGTH"]
),
"ukey": create_ukey(length=settings.DJOSER["WEBAUTHN"]["UKEY_LENGTH"]),
}
)
return super().create(validated_data)
def validate_username(self, username):
if User.objects.filter(username=username).exists():
return username
else:
raise serializers.ValidationError(f"User {username} does not exist.")```
最佳答案
编辑:长话短说;
@simplewebauthn/browser 将签名编码为 base64url,而 duo-labs/py_webauthn 需要十六进制编码的签名。
嗯,这不是真正的答案,而是一点“帮助”。
您可以使用这个小工具(在页面底部)检查签名是否有效:https://webauthn.passwordless.id/demos/playground.html
至少,使用它,您将知道您的数据是否正确或是否存储有误。从字节到 base64url 的转换如此之多,以至于跟踪起来并不总是那么容易。也许这是数据格式/转换问题?比如不转换为字节,或者不小心将编码双重编码为 base64url。
最后,存储的公钥根据算法有不同的格式。 “原始”或“ASN.1”包装,以防您对 key 本身有疑问。
祝你好运!
编辑:
在深入研究 sunscrapers/djoser 的源代码时,我注意到了一些非常奇怪的事情。虽然所有数据都编码为 base64,但签名似乎是十六进制编码,请参阅他们的 test app
这似乎是因为它使用 duo-labs/py_webauthn 作为需要 hex encoded signature 的依赖项.另一方面,@simplewebauthn/browser lib encodes it into base64url ,就像所有其他数据一样。
关于python - 带有 djoser 的 django 上的 webauthn 签名问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74615858/
djoser是什么? 作用:Django认证系统的REST实现。djoser库提供了一组Django Rest Framework视图,用于处理注册、登录、注销、密码重置和帐户激活等基本操作。它适用于
我在我的 WebApp 中使用 Djoser 进行身份验证,它非常好。但是,我担心一些端点,比如 auth/users 如果传递了 token ,则返回所有用户。我不会使用此端点并将在前端禁用它,因为
我在让 Djoser 密码重置模块在我正在为其开发的 API 上工作时遇到了一些问题。 在我的 DJANGO 设置中: EMAIL_USE_TLS=True EMAIL_HOST=smtp.gmail
我有一个使用 Djoser 进行身份验证的 DRF 项目。计划是覆盖 Djoser 的默认激活电子邮件并发送一些 HTML 模板电子邮件。这是我拥有的: # settings.py DJOSER =
我正在使用 djoser 进行身份验证。我想自定义 djoser 的创建用户端点。我有一个用户应用程序。这是我的用户模型 from django.db import models class User
如何更改电子邮件 djoser 发送的链接使用的域? 最佳答案 我想通了,要更改链接域,您需要将 DOMAIN 和 SITE_NAME 添加到您的项目设置中。例子: DOMAIN = config('
所以我最近尝试使用 djoser,我想使用电子邮件而不是用户名登录。 左塞尔:http://djoser.readthedocs.io/en/latest/index.html 然后我尝试自定义 to
我对如何修改 Djoser 的注册端点感到困惑。我想做的就是向端点添加范围限制,但我不明白如何覆盖它。文档上的这个页面讨论了它:https://djoser.readthedocs.io/en/2.1
所以 Djoser JWT 在您登录时提供了一个访问 token ,该 token 过期多久? 最佳答案 您必须在设置中提供该值。我使用以下配置。对于访问 token ,10 分钟可能更好。 SIMP
我一直在寻找有关如何执行此操作的更多信息,但似乎几乎没有文档帮助。 本质上我想要做的是为激活电子邮件创建一个新模板,以便链接可以以 localhost:3000 而不是 localhost:8000
我使用 Django Rest 框架和 Djoser 进行身份验证和用户注册。 当新用户注册时,Djoser 会发送一封激活电子邮件,其中包含执行 GET 请求的链接。为了激活,我需要从激活 URL
我无法通过激活链接激活用户。 如何正确配置路径来处理他们的请求? 我的配置: DJOSER = { 'PASSWORD_RESET_CONFIRM_URL': 'api/v1/auth/use
我在 django rest 框架中使用 djoser,我想从创建用户表单中删除用户名字段: settings.py : 'SERIALIZERS': { 'user_create': 'us
我正在尝试使用来自 Djoser 的“注册”端点.它工作正常,但我需要的字段不仅仅是“用户名”、“电子邮件”和“密码”。 我见过这个 question事实上我可以看到我想要的字段(在可浏览的 API
我已经使用 Django Ninja 框架实现了 CRUD,但现在我想在我的应用程序中进行身份验证,我已经安装并配置了 Djoser,所以现在我可以生成 token ,但我不知道如何在我的 CRUD
我目前正在尝试使用 Django 测试我的 API 端点。到目前为止,我已经使用了 APITestCase,但在登录和使用我的 token 时遇到了问题。 我有一个密码为“1”的 Clark 用户,我
我正在尝试将 djoser 与 token 身份验证一起使用,但使用的是 django-rest-knox token 。 我已将 TOKEN_MODEL 设置为 knox.models.AuthTo
我目前正在为一个项目实现 webauthn。重点是让用户可以在网站上的手机上使用 FaceId 或指纹扫描。 我尝试了 webauthn 的 djoser 版本,但我想为已经拥有帐户的用户提供这种可能
我在我的项目中使用 Djoser 进行身份验证。一直在努力添加电子邮件激活超过 4 天,但似乎未能很好地捕获它,因为文档对我来说有点难以理解。 这是我的代码settings.py #change au
我正计划使用Django Rest Framework构建应用程序。我对使用Django-Rest-Framework-JWT身份验证机制比对 session 或 token 身份验证机制更感兴趣。
我是一名优秀的程序员,十分优秀!