dfinity开发——使用互联网身份(internet identity)登录

Posted 知来者逆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dfinity开发——使用互联网身份(internet identity)登录相关的知识,希望对你有一定的参考价值。

前言

1.Internet Identity是由ICP支持的匿名区块链认证框架。用户可以创建自己的身份“锚”,将兼容的加密设备分配写入到当前设备,如笔记本电脑上的指纹传感器、手机上的面部识别系统,或便携式HSM,如YubiKey或Ledger钱包。然后,用户可以使用分配给他们的身份锚设备,注册验证ICP的dapp。这提供了很高的便利性,允许用户以极低的摩擦来验证他们感兴趣的dapp,同时受益于最高级别的加密安全性,但不需要直接管理或处理加密密钥材料。这样可以防止出错和关键材料被盗。系统对dapp进行了匿名化,每当一个锚与dapp交互时,dapp就会看到一个特别生成的假名,这可以防止用户在使用不同的dapp时被跟踪。每个用户可以创建任意数量的身份锚。
2.与大多数登录认证方法不同,Internet Identity 不需要设置和管理密码,也不需要向 dapps 或 Internet Identity 提供任何个人识别信息,这样大大的提高了安全性。
3.这里将演示如何使用Internet Identity身份,获取当前PID,使用的语言是motoko和ts。
4.工程源码地址:https://download.csdn.net/download/matt45m/85272218

项目流程

1.首先去dfinity的官网上下载编译Internet Identity,并按官方文档把Internet Identity编译成.wasm和.did文件。
2.创建项目

dfx new auth_client_demo

3.在index.html文件添加以下代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width" />
    <title>auth_demo</title>
    <base href="/" />

    <!-- <link type="text/css" rel="stylesheet" href="main.css" /> -->
  </head>
  <body>
    <form>
      <button id="btn_login" type="button">使用互联网身份登录</button>
    </form>
    <form>
      <span>当前PID:</span>
      <input id="pid"  type="text"  style="width: 400px" placeholder="当前 Principal ID" />
      <button id="btn_pid"  type="button">获取当前PID</button>
  </form>
  <form>
    <span>当前CID:</span>
    <input id="cid"  type="text"  style="width: 400px" placeholder="当前Canister ID" />
    <button id="btn_cid"  type="button">获取当前CID</button>
  </form>
  <form>
    <button id="btn_logout" type="button">退出登录</button>
  </form>
    <!-- <main id="pageContent"></main> -->
  </body>
</html>

4.在main.mo 文件添加以下代码

import Principal "mo:base/Principal";

actor Self

    public shared query (caller) func whoami() : async Principal
    
       caller
    ;

    public shared (caller) func getCanister() : async Principal
    
         Principal.fromActor(Self);
    ;
;

5.index.ts里面添加以下代码

import  AuthClient  from "@dfinity/auth-client";
import  canisterId, createActor  from "../../declarations/whoami";
import  Actor, Identity  from "@dfinity/agent";

var btn_login = document.getElementById("btn_login") as HTMLButtonElement;
var input_pid = document.getElementById("pid") as HTMLButtonElement;
var input_cid = document.getElementById("cid") as HTMLButtonElement;
var btn_pid = document.getElementById("btn_pid") as HTMLButtonElement;
var btn_cid = document.getElementById("btn_cid") as HTMLButtonElement;
var btn_logout = document.getElementById("btn_logout") as HTMLButtonElement;

var login_index = 0;

const init = async () => 

  const authClient = await AuthClient.create();

  if (await authClient.isAuthenticated())
  
      handleAuthenticated(authClient);
  


  const days = BigInt(1);
  const hours = BigInt(24);
  const nanoseconds = BigInt(3600000000000);

  //登录
  btn_login.onclick = async () => 
  
    await authClient.login(onSuccess: async () => handleAuthenticated(authClient);,
      identityProvider:process.env.DFX_NETWORK === "ic"
          ? "https://identity.ic0.app/#authorize": //线上internet identity canister ID
          "http://rrkah-fqaaa-aaaaa-aaaaq-cai.localhost:8000/#authorize",//本地internet identity canister ID
          //最大授权有效期为8天
          maxTimeToLive: days * hours * nanoseconds,
       );
       login_index = 1;
   ;
;

async function handleAuthenticated(authClient: AuthClient) 

  const identity = (await authClient.getIdentity()) as unknown as Identity;
  const whoami_actor = createActor(canisterId as string, agentOptions: identity,,);
  authClient.idleManager?.registerCallback(() => 
  
    Actor.agentOf(whoami_actor)?.invalidateIdentity?.();
  );

  //获取当前PID
  btn_pid.onclick = async () => 
  
    if(login_index == 1)
    
        try 
        
          const response = await whoami_actor.whoami();
          console.log(response);
          input_pid.value =response.toString();
         catch (error) 
        
          console.error(error);
        
    
    else
    
      input_pid.value ="当前 Principal ID";
    
  ;

  //退出登录
  btn_logout.onclick =async () => 
  
      await authClient.logout();
      input_pid.value ="";
      input_cid.value = "";
      login_index = 0;
  ;

  //获取当前canister ID
  btn_cid.onclick = async () =>
  
    if(login_index == 1)
    
        try 
        
          const response = await whoami_actor.getCanister();
          input_cid.value =response.toString();
         catch (error) 
        
          console.error(error);
        
    
    else
    
      input_cid.value ="当前 Canister ID";
    
  ;


init();

6.启动dfinity环境

dfx start --clean

7.在编译好的Internet Identity目录下创建canister.

dfx deploy internet_identity --argument '(null)'


把生成的Internet Identity canister id 复制到index.ts 本地internet identity canister ID

 identityProvider:process.env.DFX_NETWORK === "ic"
          ? "https://identity.ic0.app/#authorize": //线上internet identity canister ID
          "http://rrkah-fqaaa-aaaaa-aaaaq-cai.localhost:8000/#authorize",//本地internet identity canister ID

8.在本地部署项目

dfx deploy
npm install
npm start

9.访问 http://localhost:8080/

点击使用互联网身份登录

创建设备后按提前一步步注册完设备就可以了。


最终结果:

DFINITY丨在互联网计算机上推出的去中心化社交媒体网络distrikt

在互联网计算机区块链上新推出的distrikt 是一个去中心化的专业社交媒体网络,赋予用户对其身份和数据的所有权和权力。该平台是第一个完全基于区块链的专业社交网络——distrikt 的所有参与、上传和交流都发生在链上。

distrikt 是一个专业网络,旨在展示用户生成的中长篇书面内容。与现有平台相比,distrikt 是 LinkedIn、Twitter 和 Medium 的组合,但它是去中心化的、用户管理的和用户所有的。

distrikt 平台上的所有权将涉及一个原生通证,该通证将激励用户参与自治治理,授予他们投票权来决定提交审议的提案。该系统将确保 distrikt 的用户是决定平台如何发展的积极决策者。

2 月,distrikt 团队接管了 LinkedUp 的开发,这是一个专业的社交媒体 dapp,由 DFINITY 基金会创建作为演示,以展示可以轻松地在互联网计算机上构建和部署软件。在开发 dapp 并于 7 月 27 日推出之后,distrikt 已经吸引了超过20,000 名注册用户。

“我们设想未来人们可以享受社交媒体平台的所有好处,而无需为他们的数据和隐私付费。” distrikt 联合创始人 Andra Georgescu 说。“作为 distrikt 用户,您将拥有自己的数据和身份。你不必只是为了享受产品而成为产品。”

中心化的企业社交平台受到影响数十亿用户的决策缺乏可见性或监督的困扰,以及隐私、数据管理、审查、安全等普遍存在的问题。新的所有权和治理结构正在制定新的方法来解决工程和设计使平台成为一个有弹性的和开放的社区产品。

“我们希望为 distrikt 用户提供集中式社交媒体平台所缺乏的透明度和自主权。”

distrikt 的日常运营将由开放互联网基金会管理,该基金会是一家总部位于瑞士的非营利组织,通过开发赋予用户权力的数字产品和服务来支持开放互联网的发展。为了在最终的公开筹款活动之前维持 distrikt 的持续发展,开放互联网基金会已经获得了 600 万瑞士法郎和 40,000 个 ICP 实用程序通证的捐赠。

需要像distrikt 这样的新的、去中心化的社交空间来培育在线环境,以培养建设性的用户体验和关系,以及前所未有的联系和协调水平。distrikt 的使命是让用户能够与他人联系、协作和共享,同时在他们可以管理自己的平台上保留对其数据的完全所有权和控制权。它旨在体现两全其美:出色的用户体验与区块链技术的优势相结合。

Andra Georgescu 和 distrikt 开发团队分享了他们项目的一些细节。

Q1.你们的技术是做什么的?distrikt 旨在解决什么问题?

A:distrikt 将允许用户相互连接、交流和共享原始内容,同时保留对其数据和身份的所有权和控制权。这解决了很多社交媒体用户越来越意识到的问题,例如侵犯隐私、数据泄露、缺乏自主权或主权等。

Q2.谁是你们的目标用户?

A:具有隐私意识和企业家精神的年轻专业人士。

Q3.你们的团队在哪里?

A:我们的开发团队位于塞尔维亚贝尔格莱德,而我们的设计和营销团队位于罗马尼亚布加勒斯特。开放互联网基金会成立于瑞士纳沙泰尔,负责运营。

Q4.是什么促使你们使用区块链技术开发你们的服务?

A:我们希望为 distrikt 用户提供集中式社交媒体平台所缺乏的透明度和自主权。区块链网络的安全性和密码学也是一个有吸引力的价值主张,尤其是在建立在传统中心化基础设施上的平台上经常发生大量数据泄漏的情况下。

Q5.为什么选择在互联网计算机上开发而不是其他平台(区块链网络或中心化解决方案)?

A:互联网计算机允许像 distrikt 这样的平台成为生态系统的一部分,在这个生态系统中,它们可以作为一个真正分散的系统蓬勃发展,直接在互联网上并且不依赖于专有系统。distrikt 不会面临平台风险,这在启动自主软件的背景下尤为重要。

Q6.在互联网计算机上构建最让你们感到惊讶的是什么?

A:最让我们惊讶的是,区块链层是如此高效,而且我们还没有遇到与在区块链网络上开发相关的摩擦。相反,这个过程就像在更传统的堆栈上开发一样无缝。

Q7.你们旨在实现的成功基准是什么?

A:用户采用和保留是我们未来最重要的指标,我们正在努力开发收集反馈并对用户的好恶做出及时反应的方法。distrikt 会发展,我们认为它会发展一个迭代过程。我们最大的老师将是我们的尝鲜者!

Q8.你们预计未来如何开发和改进你们的产品或服务?

A:在 2021 年的版本中,distrikt 将在一个 LinkedIn 风格的平台内为用户提供类似 Medium 的文章创建、分发和消费,让他们能够展示他们的项目和成就,并突出重要的里程碑。

distrikt 的最终愿景是它成为一个社区建设平台,用户可以在其中创建称为 distrikt 的群组,这些群组可以像社区自然倾向于的那样成长、合并和分化。

Q9.你们希望在互联网计算机生态系统中开发什么新的去中心化服务或应用程序?

A:我们希望看到以下内容:

一款手机备份/恢复解决方案

一个照片存储/共享应用程序

以上是关于dfinity开发——使用互联网身份(internet identity)登录的主要内容,如果未能解决你的问题,请参考以下文章

加密货币初创公司Dfinity将推出与亚马逊网络服务竞争的互联网区块链

DFINITY基本架构

Dfinity挖矿系列:编译和构建网络计算机(ICP)核心服务

互联网计算机的 Dfinity 快速入门

ICP矿机dfinity项目介绍

超潜力公链DFINITY——DeFi 开发者最佳进入时期