教程:将密钥集成到 Django (Python)

WBOY
发布: 2024-08-31 06:04:02
原创
502 人浏览过

介绍

在本指南中,我们将引导您完成将密钥身份验证集成到 Python Django Web 应用程序的步骤。我们将利用 Corbado 的密钥优先 UI 组件,该组件无缝连接到密钥后端(包括 WebAuthn 服务器),使集成过程简单高效。

在这里阅读完整的原始教程

Django Passkey 项目先决条件

在我们开始实施之前,请确保您对 Django、Python、HTML 和 JavaScript 有基本的了解。熟悉这些技术将帮助您更轻松地跟进。

设置 Django 项目

1. 初始化您的 Django 项目

如果您的计算机上未安装 Django,您可以通过运行以下命令来安装它:

pip install Django==4.2.7
登录后复制

接下来,安装用于密钥的 Corbado Python SDK:

pip install passkeys
登录后复制

现在,创建一个新的 Django 项目:

django-admin startproject passkeys_demo
cd passkeys_demo
登录后复制

这将生成一个 passkeys_demo 目录,其中包含您的 Django 项目文件。

2.配置环境变量

在您的项目目录中,创建一个 .env 文件来存储环境变量。您需要一个项目 ID 和 API 密钥,可以从 Corbado 开发者面板获取(您需要在开发者面板中创建 Corbado 项目):

PROJECT_ID=your_project_id
API_SECRET=your_api_secret
登录后复制

安装 django-environ 包以将这些变量加载到您的 Django 设置中:

pip install django-environ
登录后复制

在您的settings.py中,导入environ并将其配置为读取.env文件:

import environ

env = environ.Env()
environ.Env.read_env()

PROJECT_ID = env('PROJECT_ID')
API_SECRET = env('API_SECRET')
登录后复制

3. 使用会话管理创建 Django 模板

在 passkeys_demo 项目中创建一个 templates 目录。在此目录中,为登录页面创建index.html,为用户个人资料页面创建profile.html。

index.html:

<!DOCTYPE html>
<html>
  <head>
    <link
      rel="stylesheet"
      href="https://unpkg.com/@corbado/web-js@latest/dist/bundle/index.css"
    />
    <script src="https://unpkg.com/@corbado/web-js@latest/dist/bundle/index.js"></script>
  </head>
  <body>
    <script>
      (async () => {
        await Corbado.load({
          projectId: "{{ PROJECT_ID }}",
          darkMode: "off",
          setShortSessionCookie: "true",
        });
        const authElement = document.getElementById('corbado-auth');
        Corbado.mountAuthUI(authElement, {
          onLoggedIn: () => {
            window.location.href = '/profile';
          },
        });
      })();
    </script>

    <div id="corbado-auth"></div>
  </body>
</html>
profile.html:
<!DOCTYPE html>
<html>
  <head>
    <link
      rel="stylesheet"
      href="https://unpkg.com/@corbado/web-js@latest/dist/bundle/index.css"
    />
    <script src="https://unpkg.com/@corbado/web-js@latest/dist/bundle/index.js"></script>
  </head>
  <body>
    <h2>Protected Page ?</h2>
    <p>User ID: {{ USER_ID }}</p>
    <p>Name: {{ USER_NAME }}</p>
    <p>Email: {{ USER_EMAIL }}</p>
    <div id="passkey-list"></div>
    <button id="logoutButton">Logout</button>

    <script>
      (async () => {
        await Corbado.load({
          projectId: "{{ PROJECT_ID }}",
          darkMode: "off",
        });

        const passkeyListElement = document.getElementById("passkey-list");
        Corbado.mountPasskeyListUI(passkeyListElement);

        const logoutButton = document.getElementById('logoutButton');
        logoutButton.addEventListener('click', function() {
          Corbado.logout()
            .then(() => {
              window.location.replace("/");
            })
            .catch(err => {
              console.error(err);
            });
        });
      })();
    </script>
  </body>
</html>
登录后复制

4.创建Django视图并配置路由

在views.py中,创建以下方法来渲染登录和个人资料页面:

from django.shortcuts import render, redirect
from django.http import HttpResponse
from corbado_python_sdk import Config, CorbadoSDK, SessionInterface, UserEntity
from corbado_python_sdk.entities.session_validation_result import SessionValidationResult
from corbado_python_sdk.generated.models.identifier import Identifier

from passkeys_demo.settings import API_SECRET, PROJECT_ID

config = Config(api_secret=API_SECRET, project_id=PROJECT_ID)
sdk = CorbadoSDK(config=config)
sessions = sdk.sessions
identifiers = sdk.identifiers

def index(request):
    context = {"PROJECT_ID": PROJECT_ID}
    return render(request, "index.html", context)

def profile(request):
    token = request.COOKIES.get(config.short_session_cookie_name)
    try:
        if not token:
            raise ValueError("No token found")
        validation_result = sessions.get_and_validate_short_session_value(short_session=token)
        if validation_result.authenticated:
            email_identifiers = identifiers.list_all_emails_by_user_id(
                user_id=validation_result.user_id or ""
            )
            user = sessions.get_current_user(short_session=token)
            context = {
                "PROJECT_ID": PROJECT_ID,
                "USER_ID": user.user_id,
                "USER_NAME": user.full_name,
                "USER_EMAIL": email_identifiers[0].value,
            }
            return render(request, "profile.html", context)
        else:
            return HttpResponse("You are not authenticated or have not yet confirmed your email.", status=401)
    except Exception as e:
        print(e)
        return redirect("/")
登录后复制

在urls.py中配置路由:

from django.urls import path
from . import views

urlpatterns = [
    path("", views.index, name="index"),
    path("profile/", views.profile, name="profile"),
    path('<path:unknown_path>/', lambda request, unknown_path: redirect('/'), name='fallback')
]
登录后复制

运行 Django 应用程序

要启动 Django 应用程序,请使用以下命令:

python manage.py runserver
登录后复制

在 Web 浏览器中访问 http://localhost:8000,您应该会看到 Corbado UI 组件无缝集成。

Tutorial: Integrate Passkeys into Django (Python)

结论

本指南引导您完成使用 Corbado 组件向 Django 应用程序添加基于密码的身份验证的过程。这种方法不仅通过实施无密码身份验证来增强安全性,而且还简化了会话管理。有关 Corbado 会话管理功能的更多详细信息,请参阅官方文档。

以上是教程:将密钥集成到 Django (Python)的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板