003区块链网络的基本权限控制与应用程序开发

本文详细探讨了区块链网络中的权限控制与应用程序开发,重点介绍了如何在Hyperledger Fabric上实现用户认证和权限管理。通过Composer REST Server集成OAuth支持,实现了GitHub登录认证,并详细阐述了Identity、Participant和Card的概念及其相互关系。此外,文章还讲解了如何通过Composer API进行应用程序开发,以及如何利用Access Control Rules实施更严格的权限策略。最后,提供了示例代码和实际操作步骤,帮助读者深入理解区块链网络的权限控制与应用开发。
摘要由CSDN通过智能技术生成

前言

在本系列第 2 部分中,我们设想了一个具有现实意义的 User Story,实现了一个“共享自行车区块链网络” – bikesharing Network 的基础功能,并部署、使用了它。在此过程中,我们学习了 BND,Composer Modeling Language,以及一些基本的通过 Composer 部署、控制 Fabric 区块链业务网络的方法。

但之前的 bikesharing Network 实现并未考虑到权限控制问题,我们甚至没有多用户机制,而这是一个商业应用不可缺少的重要环节。所以,在本文中,我们会着重讲解身份认证、授权机制问题,了解 Composer 框架下的权限控制方式。

之前的介绍中,都是通过浏览器(或 curl 等客户端工具)访问 REST Server 的方式操作区块链业务网络资源,本文中,我们会讲解如何通过 Composer API 进行区块链应用开发。这样,我们就可以将区块链应用与任意其他应用系统进行集成。

本文中以第 2 部分的示例为基础,请先行阅读、执行学习之前的示例。本文示例所使用的 Fabric 的版本为 1.1.0,Composer 的最新版本为 0.19.4。在以后的学习过程,它们可能随时有版本更新,请注意版本更新可能带来的变化。(Micro 版本号对应用应该没有影响,在本文公开后,如继续有升级,请自行升级 Composer 即可。)

权限与认证

我们从一些明显的问题出发,来学习如何在区块链网络中处理权限与身份认证问题。

REST Server 用户认证

之前,任意用户都可以访问 http://fabric11dev1:3100/explorer(fabric11dev1:3100 是我们的示例服务器地址、端口,如有需要,请将其改为你所用的服务器地址、端口。本文均如此,不再另行说明),这是明显不符合实际情况的。所以,我们的第一步是:让 REST Server 支持用户认证功能,未认证的用户不允许访问。

Composer REST Server 是在 LoopBack 基础上开发的,而 LoopBack 通过 loopback-component-passport(这个 module 集成了 Passport)实现第三方登录,使我们可以使用诸如 GitHub,Google,QQ,BaiDu 等第三方账户完成身份验证,登录 REST Server。

LoopBack:是一个高扩展性、开源的 Node.js 框架应用,只需要增加很少(甚至不需要)代码,就可以帮助我们建立动态的 REST API 服务。

Passport:是一个 Node.js 框架下的第三方认证中间件,可以帮助 Node.js 应用支持第三方认证(如 OAuth,Basic)。

loopback-component-passport:这是 LoopBack 的一个组件,它集成了 Passport,是其与 LoopBack 二者的桥梁。

GitHub 支持 OAuth 且不需要额外的审核程序,现在我们可以通过 Passport 使 REST Server 支持 GitHub 第三方用户认证,这样,只要有 GitHub 账户就可以登录我们的 REST Server 了。

注册、配置 OAuth App
  1. 登录 GitHub,点击右上角的用户头像 / Settings。
  2. 点击 Developer settings / OAuth Apps / New OAuth App
  3. 在 Register a new OAuth application 表单中输入以下内容:
1
2
3
4
Application name:bikesharing-network
Homepage URL:http://fabric11dev1:3100
Application description:The bikesharing test REST Server.
Authorization callback URL:http://fabric11dev1:3100/auth/github/callback

注意:比其他一些 OAuth 服务更自由,GitHub OAuth 并不要求 fabric11dev1 是真实的 Internet 地址,也不会去验证它的存在。只要这个 host 可以被你自己的浏览器访问到就可以了。

  1. 点击 Register application。
  2. 注册成功后,在 app 详情页面复制 Client ID 与 Client Secret 内容。
  3. 在 REST Server 所在机器上,执行如下内容(请替换<Client ID><Client Secret>),以设置系统环境变量 COMPOSER_PROVIDERS:
1
2
3
4
5
6
7
8
9
10
11
12
$ export COMPOSER_PROVIDERS='{
  "github": {
  "provider": "github",
  "module": "passport-github",
  "clientID": "< em >< Client ID></ em >",
  "clientSecret": "< em >< Client Secret></ em >",
  "authPath": "/auth/github",
  "callbackURL": "/auth/github/callback",
  "successRedirect": "/",
  "failureRedirect": "/"
  }
}'

注意:这里的 callbackURL 必须与 "Register a new OAuth application" 表单中的 "Authorization callback URL" 属性对应,只是不需要 host name:port。

也可以将此系统变量加入 profile 文件中并执行;或将此 export 命令写入 .sh 文件,并以 source 执行。

安装 passport-github
1
$ npm install -g passport-github
重启 Composer REST Server
1
2
$ composer-rest-server --card admin@bikesharing-network --namespaces
     "never" --port 3100 --authentication true

再访问 http://fabric11dev1:3100/auth/github

如果在当前浏览器中用户已经登录过 GitHub,则会自动跳转到 homepage, 并显示 Access token 内容,表示第三方认证成功。如果当前浏览器没有登录过 GitHub,则会跳转到 GitHub 页面提示用户登录。

注意:

不要忘记 export COMPOSER_PROVIDERS;

路径 autu/github 应与之前定义的环境变量 COMPOSER_PROVIDERS 中的 authPath 一致。

如果在关闭浏览器后再次访问,可能需要先执行 Logout,再重新访问 http://fabric11dev1:3100/auth/github。

第三方 OAuth 认证成功后的页面
在 curl 中使用 OAuth

如果需要通过 curl 等命令行工具访问带用户认证功能的 REST Server,需要以下过程:

  • 通过浏览器登录成功,如前文所述。
  • 点击 Access Token / Show,得到 Token。示例为:n0dsdJdVd4qcmvvTtAKhiBx0bRnkyey2VGTOlunvNgT3M33ASC7blHA6lxViUfAv
  • 在 curl 命令中加入此 Token。

示例在 URL 中加入 Token:

1
$ curl -v http://localhost:3100/api/system/ping?access_token=n0dsdJdVd4qcmvvTtAKhiBx0bRnkyey2VGTOlunvNgT3M33ASC7blHA6lxViUfAv

示例在 Header 中加入 Token:

1
$ curl -v -H 'X-Access-Token:n0dsdJdVd4qcmvvTtAKhiBx0bRnkyey2VGTOlunvNgT3M33ASC7blHA6lxViUfAv' http://localhost:3100/api/system/ping

注意:使用时请替换 Token。

Identity,Participant 和 Card

我们可能有一个疑虑:虽然上文的方法使得 REST Server 可以要求访问者必须通过一定的身份认证条件;但是 userA@github 与 userB@github 同时访问这个 REST Server,系统又如何区别呢?在这个部分我们将回答这个问题。

System Historian
  • 我们提交一个 BikeRentTransaction:
1
2
3
4
5
6
{
   "$class": "org.bikesharing.biznet.BikeRentTransaction",
   "user": "resource:org.bikesharing.biznet.BikeUser#bu_1",
   "bike": "resource:org.bikesharing.biznet.Bike#b_1",
   "time": "2018-04-20T18:00:01+08:00"
}
  • 在 System 中使用 GET system/historian,获得一系列系统操作历史,其中有关于这个交易的详细情况如下:
1
2
3
4
5
6
7
8
9
10
{
     "$class": "
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值