PRESS.one 开发者社区

PRESS.one 开发者社区

  • 文档
  • 博客
  • 开发者论坛

›REST API 文档

指南

  • 简介
  • DApp 开发流程
  • 创建 DApp
  • 数字签名相关知识
  • PRS 协议

REST API 文档

  • 概述
  • API 鉴权
  • 用户授权
  • 获取数字签名
  • 签名文件相关
  • 合约相关
  • 钱包相关

Node.js SDK 文档

  • SDK 安装
  • 用户授权
  • 签名文件相关
  • 合约相关
  • 钱包相关

API 鉴权

PRS 提供两种鉴权方式,验证 Token和验证用户签名,都是通过 HTTP header 进行。

通过验证 Token 鉴权

HTTP header 里加 Authorization:

Authorization: Bearer ${token}
  • token: 用户授权之后获取到的 access token。

Example:

假设 DApp 经过授权之后,获取到对应的 token。

tokeneyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1NTExOTU5MzYsImp0aSI6IjhkNWNjYzFmLWRmYjEtNDZjMC04MDc2LWNkMGE1ZDVmNWQ5MSIsImRhdGEiOnsiYXV0aEFkZHJlc3MiOiIyMTQ1ZWZkZDA0ZjJiZmIyNjhmZjIxNDY0MjE4NDE4MTYzZWJkNjBkIn0sInByb3ZpZGVyIjoiZGFwcCIsImV4cCI6MTU1MTQ1NTEzNn0.-z9atlcBRsB5Z7M7joOMLvD5UaNhy-15hycLpV0XpUw

调用获取指定签名文件 API 为:

curl -X GET https://${host}/api/v2/files/a23b19df1264d406ac81094af463d6fc03caafb997d8d8f64759340752dd21ad \
  -H "Accept: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1NTExOTU5MzYsImp0aSI6IjhkNWNjYzFmLWRmYjEtNDZjMC04MDc2LWNkMGE1ZDVmNWQ5MSIsImRhdGEiOnsiYXV0aEFkZHJlc3MiOiIyMTQ1ZWZkZDA0ZjJiZmIyNjhmZjIxNDY0MjE4NDE4MTYzZWJkNjBkIn0sInByb3ZpZGVyIjoiZGFwcCIsImV4cCI6MTU1MTQ1NTEzNn0.-z9atlcBRsB5Z7M7joOMLvD5UaNhy-15hycLpV0XpUw"

通过验证签名鉴权

HTTP header 里加 X-Po-Auth-Address、X-Po-Auth-Msghash、X-Po-Auth-Sig。

KeyValue
X-Po-Auth-Address当前用户的 Address
X-Po-Auth-Msghash请求消息体的 hash 值
X-Po-Auth-Sig使用私钥对消息体 hash 进行椭圆加密值得到的数字签名

Example:

POST /api/v2/apps/${address}/authenticate

我们用换取 token 的接口来举例,假设 DApp 创建成功之后,获取到 DApp 的私钥以及地址。用户经过 Web 授权返回了 code。

address6b16c956d963e2c38e07d49af37b66a1de490a97
privateKey8f8aa65494a9880130842fcec4208ce9ae6667d38422c36e832564408bc1fad5
codeeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1NTExOTU5MTUsImp0aSI6Ijg5M2NiMjAwLTNiNTQtNDYzNC1hODNlLWU3ZmJmNzQ3YjVjNiIsImRhdGEiOnsidXNlckFkZHJlc3MiOiJjYjdiNzUxMDNjNzMzY2M1NzQzYTM5MGZhZjdiZGVkYzYxNzg2ZTI5IiwiYXBwQWRkcmVzcyI6IjZiMTZjOTU2ZDk2M2UyYzM4ZTA3ZDQ5YWYzN2I2NmExZGU0OTBhOTciLCJ0eXBlIjoicGhvbmUifSwicHJvdmlkZXIiOiJwcmVzc29uZSIsImV4cCI6MTU1MTQ1NTExNX0.KQeimVWpEnTs-8FyvDYh-mppG1_kMKiPGZOf8mY3pfA

接下来我们来调用这个接口

  1. 根据 path 与 payload 计算出 msghash。
  • path: 是 Api 的路径,这里是 '/apps/${address}/authenticate'
  • payload: 是请求 body。
{
  "payload":{
    "code": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1NTExOTU5MTUsImp0aSI6Ijg5M2NiMjAwLTNiNTQtNDYzNC1hODNlLWU3ZmJmNzQ3YjVjNiIsImRhdGEiOnsidXNlckFkZHJlc3MiOiJjYjdiNzUxMDNjNzMzY2M1NzQzYTM5MGZhZjdiZGVkYzYxNzg2ZTI5IiwiYXBwQWRkcmVzcyI6IjZiMTZjOTU2ZDk2M2UyYzM4ZTA3ZDQ5YWYzN2I2NmExZGU0OTBhOTciLCJ0eXBlIjoicGhvbmUifSwicHJvdmlkZXIiOiJwcmVzc29uZSIsImV4cCI6MTU1MTQ1NTExNX0.KQeimVWpEnTs-8FyvDYh-mppG1_kMKiPGZOf8mY3pfA"
  }
}
calcRequestHash(path, payload) 
= 7b61f7ee90d333017e4fc822adf196030ef8ae457c6f8d7b2f6b8776a6a50c6e
  1. 使用私钥对 msghash 签名。
const { signature } = signByMsghash(hash, privateKey) => {
  return signByMsghash(hash, privateKey);
};

signByMsghash(hash, privateKey)
= signByMsghash('7b61f7ee90d333017e4fc822adf196030ef8ae457c6f8d7b2f6b8776a6a50c6e', '8f8aa65494a9880130842fcec4208ce9ae6667d38422c36e832564408bc1fad5')
= 7a405ca5a2f8d925e70be5346b7b3974a8f9b172c755555ba149cca8cc9c737e6c3e7d35e17893ea5893fb0515d0c5019f3ddd5ce716e813506a4f146eeefd9a1
  1. 将 address、msghash、signature 添加到 HTTP header 中即可。
curl -X POST https://beta.press.one/api/v2/apps/6b16c956d963e2c38e07d49af37b66a1de490a97/authenticate \
  -H "Content-Type: application/json" \
  -H "X-Po-Auth-Address: 6b16c956d963e2c38e07d49af37b66a1de490a97" \
  -H "X-Po-Auth-Msghash: 7b61f7ee90d333017e4fc822adf196030ef8ae457c6f8d7b2f6b8776a6a50c6e" \
  -H "X-Po-Auth-Sig: 7a405ca5a2f8d925e70be5346b7b3974a8f9b172c755555ba149cca8cc9c737e6c3e7d35e17893ea5893fb0515d0c5019f3ddd5ce716e813506a4f146eeefd9a1" \
  -d '{ "payload": { "code": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1NTExOTU5MTUsImp0aSI6Ijg5M2NiMjAwLTNiNTQtNDYzNC1hODNlLWU3ZmJmNzQ3YjVjNiIsImRhdGEiOnsidXNlckFkZHJlc3MiOiJjYjdiNzUxMDNjNzMzY2M1NzQzYTM5MGZhZjdiZGVkYzYxNzg2ZTI5IiwiYXBwQWRkcmVzcyI6IjZiMTZjOTU2ZDk2M2UyYzM4ZTA3ZDQ5YWYzN2I2NmExZGU0OTBhOTciLCJ0eXBlIjoicGhvbmUifSwicHJvdmlkZXIiOiJwcmVzc29uZSIsImV4cCI6MTU1MTQ1NTExNX0.KQeimVWpEnTs-8FyvDYh-mppG1_kMKiPGZOf8mY3pfA" } }'

hash、加密算法的具体实现请参考数字签名。

← 概述用户授权 →
  • 通过验证 Token 鉴权
  • 通过验证签名鉴权
文档
介绍基础知识创建 DApp创建合约
社区
TwitterMedium微信公众号开发者论坛
更多
官方博客GitHub
Copyright © 2023 PRESSone