”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 教程:如何将密钥集成到 Angular 中

教程:如何将密钥集成到 Angular 中

发布于2024-08-29
浏览:376

Tutorial: How to Integrate Passkeys into Angular

使用 TypeScript 在 Angular 中实现密钥身份验证

在本指南中,我们将逐步介绍使用 TypeScript 将密钥身份验证集成到 Angular 应用程序中的过程。密钥提供了一种安全且可扩展的方式来管理用户身份验证,无需传统密码。

在我们的原始博客文章中查看完整教程

先决条件

开始之前,请确保您熟悉 Angular、HTML、CSS 和 TypeScript。此外,请确保您的计算机上安装了 Node.js 和 NPM。本教程建议安装 Angular CLI:

npm install -g @angular/cli

设置 Angular 项目

首先,让我们创建一个新的 Angular 项目。在此示例中,我们使用 Angular 版本 15.2.9:

ng new passkeys-demo-angular

在设置过程中,选择以下选项:

  • 共享假名使用数据:
  • 角度路由:
  • 样式表格式: CSS
  • 启用 SSR: 否(如果您的应用程序需要服务器端渲染,请选择是)

设置完成后,运行应用程序以确保一切正常:

ng serve

集成 Corbado 进行密钥身份验证

1. 设置您的 Corbado 帐户

首先,在 Corbado 开发者面板上创建一个帐户。此步骤可让您亲身体验密钥注册。注册后,选择“Corbado Complete”作为您的产品,在 Corbado 中创建一个项目。指定“Web 应用程序”作为应用程序类型,对于框架,选择 Angular。在您的应用程序设置中,使用以下详细信息:

  • 应用程序 URL: http://localhost:4200
  • 依赖方 ID: localhost

2. 嵌入Corbado UI组件

接下来,您需要安装 Corbado 集成所需的软件包。导航到项目的根目录并安装必要的包:

npm i @corbado/web-js
npm i -D @corbado/types @types/react @types/ua-parser-js

修改app.component.ts以在应用程序启动时初始化Corbado:

import { Component, OnInit } from '@angular/core';
import Corbado from "@corbado/web-js";

@Component({
    selector: 'app-root',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
    title = 'passkeys-demo-angular';
    isInitialized = false;

    constructor() {
    }

    ngOnInit(): void {
        this.initialize();
    }

    async initialize() {
        try {
            await Corbado.load({
                projectId: "",
                darkMode: 'off'
            });
            this.isInitialized = true;
        } catch (error) {
            console.error('Initialization failed:', error);
        }
    }
}

3. 创建登录和配置文件组件

生成两个组件:一个用于显示密钥登录 UI,另一个用于在身份验证成功后显示基本用户信息:

ng generate component login
ng generate component profile

更新您的 app-routing.module.ts 以定义登录和配置文件组件的路由:

// src/app/app-routing.module.ts

import { NgModule } from '@angular/core';
import { ProfileComponent } from "./profile/profile.component";
import { RouterModule, Routes } from "@angular/router";
import { LoginComponent } from "./login/login.component";

const routes: Routes = [
    { path: 'profile', component: ProfileComponent },
    { path: 'login', component: LoginComponent },
    { path: '', component: LoginComponent },
    { path: '**', redirectTo: '/' }
]

@NgModule({
    imports: [
        RouterModule.forRoot(routes)
    ],
    exports: [RouterModule]
})
export class AppRoutingModule {
}

在login.component.ts中,设置密钥身份验证UI并定义成功登录后的行为:

import { Component, OnInit, ViewChild, ElementRef, AfterViewInit } from '@angular/core';
import { Router } from '@angular/router';
import Corbado from "@corbado/web-js";

@Component({
    selector: 'app-login',
    templateUrl: './login.component.html',
    styleUrls: ['./login.component.css']
})
export class LoginComponent implements OnInit, AfterViewInit {
    @ViewChild('authElement', { static: false }) authElement!: ElementRef;  // Access the element

    constructor(private router: Router) {
    }

    ngOnInit() {
        if (Corbado.user) {
            this.router.navigate(['/profile']);
        }
    }

    ngAfterViewInit() {
        // Mount the Corbado auth UI after the view initializes
        Corbado.mountAuthUI(this.authElement.nativeElement, {
            onLoggedIn: () => this.router.navigate(['/profile']), // Use Angular's router instead of window.location
        });
    }
}

并在login.component.html中添加以下内容:

4. 设置个人资料页面

个人资料页面将显示基本用户信息(用户 ID 和电子邮件)并提供注销按钮。如果用户未登录,页面会提示返回首页:

import { Component } from '@angular/core';
import { Router } from "@angular/router";
import Corbado from "@corbado/web-js";

@Component({
    selector: 'app-profile',
    templateUrl: './profile.component.html',
    styleUrls: ['./profile.component.css']
})
export class ProfileComponent {
    user = Corbado.user

    constructor(private router: Router) {
    }

    async handleLogout() {
        await Corbado.logout()
        await this.router.navigate(['/']);
    }
}

在profile.component.html中,根据用户的身份验证状态有条件地呈现用户的信息:

Profile Page

User-ID: {{user.sub}}
Email: {{user.email}}

You're not logged in.

Please go back to home to log in.

运行应用程序

一切设置完毕后,运行应用程序:

ng serve

访问http://localhost:4200查看登录界面,认证成功后将跳转至个人资料页面。

结论

本教程演示了如何使用 Corbado 将密钥身份验证集成到 Angular 应用程序中。借助 Corbado 的工具,实现无密码身份验证既简单又安全。有关会话管理和其他高级功能的更多详细信息,请参阅 Corbado 的文档或查看详细的博客文章。

版本声明 本文转载于:https://dev.to/corbado/tutorial-how-to-integrate-passkeys-into-angular-493p?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 免费接龙
    免费接龙
    很久以前,在同一个星系中,我开始尝试制作 Freecell,作为学习 Angular 1.3 的一种方式。 我已经走了这么远,然后我就被其他事情分散了注意力,就像副项目一样。 我最近有一些空闲时间(我知道,我也没想到),所以我想我应该再试一次。 我基本上是从头开始,因为我对 Angular 1.3 ...
    编程 发布于2024-11-06
  • 为什么 PHP 中的函数调用不能使用属性默认值?
    为什么 PHP 中的函数调用不能使用属性默认值?
    无法在 PHP 属性默认值中调用函数[问题]尽管有编程经验,但新手PHP 中的属性默认错误令我困惑。代码:class Foo { public $path = array( realpath(".") ); }产生语法错误。但是,以下内容可以无缝运...
    编程 发布于2024-11-06
  • 弃用 `ereg_replace` 后,如何将多个空格替换为单个空格?
    弃用 `ereg_replace` 后,如何将多个空格替换为单个空格?
    用单个空格替换多个空格:弃用 ereg_replace虽然使用 ereg_replace 用单个空格替换多个空格可能看起来很简单,但它已被弃用。因此,您在尝试使用它时可能会遇到错误。本文提出了一种替代解决方案。迁移到 preg_replace()要替换 ereg_replace,请切换到 preg_...
    编程 发布于2024-11-06
  • 如何开始自由职业?
    如何开始自由职业?
    您是否正在努力通过 Upwork 赚钱?别担心!我曾经去过那里,我来这里是为了分享我将这些挣扎转化为成功的旅程。凭借奉献精神和正确的方法,您可以开始在 Upwork 上赚钱,并打开通往一系列机会的大门。让我们深入探讨最大化您的收入潜力的关键步骤。 掌握技巧游戏 在 Upwork 上取...
    编程 发布于2024-11-06
  • 如何将 8 个字符作为打包单精度浮点数加载到 __m256 变量中?
    如何将 8 个字符作为打包单精度浮点数加载到 __m256 变量中?
    将 8 个字符从内存加载到 __m256 变量中作为打包单精度浮点数为了优化高斯模糊算法,您寻求用 __m256 内在变量替换浮点缓冲区的使用。本问题旨在确定此任务的最佳指令。AVX2 架构说明:利用 PMOVZX 将字符零扩展为 32 位256b 寄存器中的整数。使用 VCVTDQ2PS 就地转换...
    编程 发布于2024-11-06
  • 如何在Python中查找字符串中子字符串的第n次出现?
    如何在Python中查找字符串中子字符串的第n次出现?
    查找字符串中某个子字符串第 n 次出现识别某个子字符串第 n 次出现对应的索引为各种编程场景中经常出现的任务。在Python中,没有专门为此目的而设计的内置函数。但是,可以采用多种方法来实现此结果。一种简单的方法是使用循环来迭代字符串并计算子字符串的出现次数。起始索引被初始化为第一次出现的结果,循环...
    编程 发布于2024-11-06
  • 编程语言解释
    编程语言解释
    ? 注意:缩略图是使用生成的 ComfyUI 帮助下的 Flux Schnell 模型; 本文是在 NI - 自然智能 的帮助下撰写的 ? 没有时间阅读? - 观看我们创建的视频: 集会 ? 最初所有程序都是用二进制编写的 - 所谓的汇编 编程语言。你从字面上指示CPU在内做什么 ...
    编程 发布于2024-11-06
  • Go Context — TODO() 与 Background() 不再令人困惑!
    Go Context — TODO() 与 Background() 不再令人困惑!
    在 Go 中,上下文包有助于管理请求范围的值、取消信号和截止日期。 启动上下文的两种常见方法是 context.TODO() 和 context.Background()。 尽管它们的行为相似,但它们的目的不同。 上下文.背景() 当您不需要任何特殊处理(例如取消或截止日期)...
    编程 发布于2024-11-06
  • 如何检测 CMake 中的 C++11 编译器支持?
    如何检测 CMake 中的 C++11 编译器支持?
    CMake 中 C 11 编译器支持的检测概述在本指南中,我们探索自动检测编译器是否支持 C 11 的方法CMake,提供对最新和以前 CMake 版本的全面分析。CMake 3.1.0 及更高版本CMake 3.1.0 版本引入了一个强大的功能:检测编译器。这是通过 cmake_minimum_r...
    编程 发布于2024-11-06
  • 基于属性的测试:深入探讨现代测试方法
    基于属性的测试:深入探讨现代测试方法
    基于属性的测试是一种强大的测试方法,它侧重于软件的属性或特征,而不是特定的输入输出情况。与手动定义特定测试用例的传统测试不同,基于属性的测试会自动生成各种输入来验证某些属性是否始终成立。这种方法可以更广泛地探索潜在场景,使其成为发现隐藏错误并确保稳健的软件行为的有效方法。 测试方法的演变 从传统的...
    编程 发布于2024-11-06
  • 为开发人员和安全团队提供主动的 AppSec 持续漏洞管理
    为开发人员和安全团队提供主动的 AppSec 持续漏洞管理
    现代软件开发环境中哪些日益增长的网络安全风险让 CISO 忙碌? 开发人员和安全团队面临着越来越多的威胁,从复杂的开源和供应商控制的供应链攻击到 AI 生成的代码引入的漏洞,例如提示注入和 GitHub Copilot 的代码安全性差。现代应用程序通常严重依赖开源组件(例如在 npm、PyPI 或 ...
    编程 发布于2024-11-06
  • 如何使用 React 对 MeteorJS 中的 Bootstrap Spacing 实用程序类进行故障排除?
    如何使用 React 对 MeteorJS 中的 Bootstrap Spacing 实用程序类进行故障排除?
    在 Bootstrap 中使用间距实用程序类在 Bootstrap 中,间距实用程序类允许您轻松控制元素周围的间距。但是,如果您在使用它们时遇到问题,这里有一个指南可以帮助您解决。更新的间距语法(Bootstrap 4 和 5)Bootstrap 4 引入了间距实用程序类的简化语法:边距:m{sid...
    编程 发布于2024-11-06
  • 如何在Python中设置子进程的工作目录?
    如何在Python中设置子进程的工作目录?
    如何在Python中设置子进程的工作目录在Python中,subprocess.Popen()函数允许您在Py​​thon中执行命令子进程。一个常见的要求是指定子进程的工作目录。问题:如何使用 subprocess.Popen() 设置子进程的工作目录? 答案:要指定工作目录,请使用 subproc...
    编程 发布于2024-11-06
  • Pandas 什么时候创建视图而不是副本?
    Pandas 什么时候创建视图而不是副本?
    Pandas 视图与副本生成规则Pandas 在决定 DataFrame 上的切片操作是否产生视图或结果时采用特定规则复制。通过了解这些规则,您可以优化数据操作并避免意外行为。从始终生成副本的操作开始:所有操作,除了那些专门设计用于修改的操作就地 DataFrame,创建副本。只有某些操作支持 in...
    编程 发布于2024-11-06
  • 使用代理服务器解锁地理限制网站
    使用代理服务器解锁地理限制网站
    利用代理服务器绕过区域封锁是一种常用且有效的方法。代理服务器作为中介,可以隐藏用户的真实IP地址,使用户的请求看起来像是来自代理服务器的地理位置,从而绕过区域封锁。 使用代理服务器绕过区域封锁的关键步骤:‌‌ 选择合适的代理服务器‌:根据目标区域的网络环境和遮挡情况,选择覆盖该区域的...
    编程 发布于2024-11-06

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3