」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 教學:如何將金鑰整合到 Angular 中

教學:如何將金鑰整合到 Angular 中

發佈於2024-08-29
瀏覽:662

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]刪除
最新教學 更多>
  • 棄用 `ereg_replace` 後,如何將多個空格替換為單一空格?
    棄用 `ereg_replace` 後,如何將多個空格替換為單一空格?
    用單一空格取代多個空格:棄用ereg_replace雖然使用ereg_replace 以單一空格取代多個空格看起來很簡單,但它已被棄用。因此,您在嘗試使用它時可能會遇到錯誤。本文提出了一種替代解決方案。 遷移到 preg_replace()要取代 ereg_replace,請切換到 preg_rep...
    程式設計 發佈於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_requ...
    程式設計 發佈於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{...
    程式設計 發佈於2024-11-06
  • 如何在Python中設定子程序的工作目錄?
    如何在Python中設定子程序的工作目錄?
    如何在Python中設定子程序的工作目錄在Python中,subprocess.Popen()函數允許您在Py thon中執行指令子程序。一個常見的要求是指定子程序的工作目錄。 問題:如何使用 subprocess.Popen() 設定子程序的工作目錄? 答案:要指定工作目錄,請使用 subproc...
    程式設計 發佈於2024-11-06
  • Pandas 什麼時候創建視圖而不是副本?
    Pandas 什麼時候創建視圖而不是副本?
    Pandas 視圖與副本生成規則Pandas 在決定 DataFrame 上的切片操作是否產生視圖或結果時採用特定規則複製。透過了解這些規則,您可以優化資料操作並避免意外行為。 從始終產生副本的操作開始:所有操作,除了那些專門設計用於修改的操作就地 DataFrame,創建副本。 只有某些操作支援 ...
    程式設計 發佈於2024-11-06
  • 使用代理伺服器解鎖地理限制網站
    使用代理伺服器解鎖地理限制網站
    利用代理服务器绕过区域封锁是一种常用且有效的方法。代理服务器作为中介,可以隐藏用户的真实IP地址,使用户的请求看起来像是来自代理服务器的地理位置,从而绕过区域封锁。 使用代理服务器绕过区域封锁的关键步骤:‌‌ 选择合适的代理服务器‌:根据目标区域的网络环境和遮挡情况,选择覆盖该区域的...
    程式設計 發佈於2024-11-06
  • 如何為三角形中的線性漸變鋸齒線建立平滑邊緣?
    如何為三角形中的線性漸變鋸齒線建立平滑邊緣?
    為線性漸變鋸齒線創建平滑邊緣為了設計具有由兩個三角形形成的尖底的響應式圖像,開發人員在三角形線上遇到了意外的鋸齒狀邊緣。為了解決這個問題,我們探索了產生更平滑漸變過渡的策略。 雖然硬停止線性漸變影像中的顏色通常會導致鋸齒狀邊緣,但調整停止點和起始點可以緩解此問題。不要突然從一種顏色變為另一種顏色,而...
    程式設計 發佈於2024-11-06
  • Java 中「static」的魔力:一為所有,一切為一!
    Java 中「static」的魔力:一為所有,一切為一!
    老实说,当我们第一次遇到 static 关键字时,我们都会想:“这是什么魔法?” ?但别担心,我会用一种简单、深入、甚至有点有趣的方式来分解它! 想象一下你正在参加一个聚会?你和你所有的朋友都戴着帽子。但每个人都必须分享一顶帽子。这基本上就是 Java 中 static 关键字的作用!您不必为每个朋...
    程式設計 發佈於2024-11-06

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3