查看原文
其他

Blockstack Dev 分享 | 最详细DID身份授权流程

曹帅 一块Plus社区 2020-11-11

一块链习是首家区块链技术学习社区,提供最系统的区块链技术课程学习,定期出品有深度的技术观察 + 评论。


《 Blockstack:从开发入门到技术实战》课程训练营是由一块链习和 Blockstack 共同打造的全球第一档· Blockstack 开发中文实战课程。


每周日晚8点,作为课程内容知识拓展——助教技术分享会,由各位第一期的助教们自发轮流在线上进行分享,为学员们详细解读一个 Blockstack 技术相关内容。



昨晚,由KuCoin 资深前端工程师——曹帅助教在直播间为大家带来第二讲「Blockstack 身份授权流程」,内容复盘如下。


.01 为什么需要应用授权


去中心化身份的前提条件,是在同一个身份平台所能覆盖的范围内,用户的身份识别和检测标准统一。

作为区块链应用开发基础设施的服务提供商,Blockstack 在数据权限上将应用权限 和用户身份/数据分离,保障用户数据所有权。
 
这种设计虽然实现起来较为复杂,且需要多种类型的服务提供支持,但不论是对用户,开发者,还是整个 Blockstack 生态,都是非常优雅的方案。

用户

  •  gaia 通过 app 域名隔离数据权限,无需担心全量数据安全

  •  可以使用多身份来管理相同的应用数据

  •  使用应用之前明确的清楚应用的权限范围

  •  可以将数据在不同应用之间迁移


开发者

  • 无需单独实现账户注册与用户管理等服务

  • 不需要处理复杂的加密解密等校验逻辑


Blockstack

  • 一套 DID 身份与用户数据管理标准

  • 提供更多的应用基础设施服务



.02 应用授权的流程


如下所示:

构建 Token 并跳转

通过 Blockstack.js 所提供的 redirectToSignIn 方法跳转到 BlockstackBrowser 完成授权

  •   构建请求体 authRequest

    • generateAndStoreTransitKey 生成一个临时并随机的公私钥 Key

    • 返回一个经过编码的 authRequest 字符串

  • launchCustomProtocol 封装一系列的逻辑并跳转至 BlockstackBrowser

    • 添加一些超时和请求序号等操作

 

Browser 接收参数并解析

Blockstack 浏览器端接收到 authRequest 参数触发验证流程

  • app/js/auth/index.js 中使用 verifyAuthRequestAndLoadManifest 校验 authRequest 合法性并获取 DApp 的 Manifest.json 文件

    • verifyAuthRequest 校验 Token 的合法性

    • fetchAppManifest 获取应用 Manifest.json 文件

  • getFreshIdentities 通过用户缓存在浏览器中的登录信息 addresses (地址)获取用户的信息

    • 请求

      https://core.blockstack.org/addresses/bitcoin/${address} 获得用户比特币地址的信息

    • 加载用户域名信息

    • 从 Gaia 获取用户 profile 文件的位置,并拿到用户的 profile 文件

  • 用户根据 profile 中包含的身份信息让用户选择需要授权的用户名,触发 login

    • 客户端 noCoreStorage 作为监听标志来构造 authRespon

    • 获取用户的 profileUrl

    • 获取 app 的 bucketUrl

    • 创建并更新用户的 Profile 中 apps 的数据

    • 构建 AuthResponse Token

      • 生成 appPrivateKey

      • 生成 gaiaAssociationToken

    • 通过 Blockstack.js 的 redirectUserToApp 返回应用

    • redirect URI

 
APP 接受并解析
通过 AuthRrsponse 参数解析获取用户信息并持久化
  • 调用 userSession.SignInPending 或 userSession.handlePendingSignIn 能够触发对 AuthResponse 的解析

  • 通过 verifyAuthResponse 进行一系列的验证, fetchPrivate 获得授权用户的profile 数据

  • 持久化用户数据到浏览器 localstorage

              
 

.03 代码解析


构建授权请求

最终的 Token 会成为我们看到的形式。
             

Browser 端的参数解析与数据加载

Blockstack 浏览器端处理 query 中的 authRequest 参数
                                               
       
localstorage 中保存了 Redux 的数据结构。


Browser 端的解析和 Manifest 拉取

             
                     

用户点击登录之后的授权流程

             
                                                                                                       
最后我们得到
             
App 端的解析与处理

app 端的数据通过 
userSession.SignInPending 或 userSession.handlePendingSignIn 解
析 authResponse 参数
                                          
userData 最后的样子(Redux)
             

  • name ‑ 用户的域名

  • profile ‑ 域名下的身份信息

  • email ‑ 用户的邮箱信息decentralizedID ‑ DID

  • identityAddress ‑ 用户身份的 BTC 地址

  • appPrivateKey ‑ app 应用的私钥

  • coreSessionToken ‑ V2 预留

  • authResponseToken ‑ browser 返回的授权信息 Token

  • hubUrl ‑ gaia hub 的地址

  • gaiaAssociationToken ‑ app 与 gaia 交互所需要的 token

  • gaiaHubConfig ‑ gaia 服务器的配置信息


KeyPairs && appPrivateKey
                                        
userData 也会保存在 localstorage 中。
              
localstorage 的保存
             

 

扫码进直播间,回看完整分享!



更多阅读:

|Blockstack Dev 讨论 | 帮你少走弯路的教程在这里

|Blockstack Dev 周记 | “Blockstack 是基础设施最完善的平台”

|Blocksatck Dev 分享 | BTC 钱包技术都在这里了



扫码关注公众号,回复“1”加入开发者社群


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存