Skip to content
On this page

钱包授权

准备工作

iNF 钱包登录是基于OAuth2.0 协议标准构建的 OAuth2.0 授权登录系统。 在进行 OAuth2.0 授权登录接入之前,在盯链平台注册开发者帐号,并拥有一个已审核通过的应用,并获得相应的 AppID 和 AppSecret,可开始接入流程。

授权流程说明

OAuth2.0 授权登录让用户使用 iNF 钱包上的区块链身份安全登录第三方应用或网站,在用户授权登录已接入 iNF 钱包 OAuth2.0 的第三方应用后,第三方可以获取到用户的接口调用凭证access_token,通过access_token可以进行盯链开放平台授权关系接口调用,从而可实现获取 iNF 钱包 用户基本开放信息和帮助用户实现基础开放功能等。

iNF 钱包 OAuth2.0 授权登录目前支持 authorization_code 模式,适用于拥有 server 端的应用授权。该模式整体流程为:

  1. 第三方应用发起钱包授权登录请求,根据授权请求参数跳转至 iNF 授权页面
  2. iNF 钱包用户允许授权第三方应用后,会重定向到第三方网站,并且带上授权临时票据code参数
  3. 通过 code 获取 access_token
  4. 通过 access_token 进行接口调用,获取用户基本数据资源或帮助用户实现基本操作

获取 access_token 时序图:

null

获取 code

H5 网页授权

在 H5 网页端进行重定向,跳转至以下地址:

https://redirect.inf.cool/loading?appid=APPID&chain_id=CHAINID&scope=SCOPE&redirect_uri=REDIRECT_URI&type=oauth&state=STATE&phone_number=PHONE_NUMBER&restricted=RESTRICTED

参数说明

参数
必填
说明
appid应用唯一标识
chain_id区块链 id
scope应用授权作用域,拥有多个作用域用逗号(,)分隔,详见授权 scope
redirect_uri授权后会将 code 作为 query 参数拼接后重定向到此地址
type授权固定为 oauth
state用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止 csrf 攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加 session 进行校验
phone_number指定用户授权手机号,只支持 11 位中国手机号码
restricted0 或不传:不限制,用户每次授权可选取不同的区块链地址
1: 限制用户区块链授权地址,用户在第一次授权完成后,后续

返回说明

用户允许授权后,将会重定向到 redirect_uri 的网址上,并且带上 code 和 state 参数

redirect_uri?code=CODE&state=STATE

若用户禁止授权,则不会发生重定向。

PC 端网页授权

PC 授权需接入 SDK, 使用 iNF App 扫码授权

引入JS SDK

html
<script src="https://h5.inf.cool/inf.min%401.0.0.js"></script>

在合适位置放置页面容器

html
<div id="inf-oauth"></div>

提示

需设置容器大小及位置

调用 SDK 方法初始化

js
inf.authorize({
  selector: "#inf-oauth",
  width: "300px",
  height: "400px",
  background_color: "#fff",
  type: "oauth",
  color: "#000",
  appid: "APPID",
  redirect_uri: "REDIRECT_URI",
  state: "STATE",
  restricted: "RESTRICTED",
  scope: "SCOPE",
  chain_id: "CHAIN_ID",
  phone_number: "PHONE_NUMBER",
});

参数说明

仅列出 PC 端 授权 独有参数,其他参数与 H5 网页授权相同

参数
必填
说明
selector页面容器选择器
width容器宽度
height容器高度
background_color页面背景
color页面文字颜色

返回说明

用户允许授权后,将会重定向到 redirect_uri 的网址上,并且带上 code 和 state 参数

redirect_uri?code=CODE&state=STATE

若用户禁止授权,则不会发生重定向。

小程序授权

打开 iNF 小程序授权

js
wx.openEmbeddedMiniProgram({
  appId: "wx5fbc0f1bcdc0193a",
  path: "pages/oauth/index?appid=APPID&chain_id=CHAINID&scope=SCOPE&redirect_uri=REDIRECT_URI&type=oauth&state=STATE&phone_number=PHONE_NUMBER&restricted=RESTRICTED",
});

参数说明

与 H5 网页授权相同

返回说明

授权后在 App onShow 生命周期回调 中可获取 code 及 state

js
onShow(e){
  const { code, state } = e?.referrerInfo?.extraData || {}
  console.log(code, state)
}

通过 code 获取 access_token

  • 请求

通过 code 获取 access_token:

https://inf-api.dingblock.tech/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE

参数说明

参数
必填
说明
appid应用唯一标识
secret应用密钥 AppSecret
code填写第一步获取的 code 参数
  • 响应

json
{
  "res": {
    "access_token": "ACCESS_TOKEN",
    "expires_in": 7200,
    "refresh_token": "REFRESH_TOKEN",
    "openid": "OPENID",
    "scope": "SCOPE"
  },
  "code": 200
}

参数说明

参数
必填
说明
access_token接口调用凭证
expires_inaccess_token 接口调用凭证超时时间,单位(秒)
refresh_token用户刷新 access_token
openid授权用户唯一标识
scope用户授权的作用域,使用逗号(,)分隔,详见授权 scope

错误返回样例:

json
{
  "msg": "invalid scope",
  "code": 500 // 错误码
}

通过 access_token 获取用户信息

获取 access_token 后,进行接口调用,有以下前提:

  1. access_token 有效且未超时;
  2. 用户已授权给第三方应用帐号相应作用域(scope)。

此接口用于获取用户个人信息。开发者可通过 openid 来获取用户基本信息。

  • 请求 GET

https://inf-api.dingblock.tech/oauth2/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&scope=SCOPE

参数说明

参数
必填
说明
access_token获取 access_token中得到的 access_token
openid获取 access_token中得到的 openid
scope用户授权的作用域,使用逗号(,)分隔,不传则返回 access_token 中对应的全部作用域
  • 响应

    响应的数据由用户对第三方应用授权时的 scope 参数和请求参数中的 scope 决定,scope 作用域详见授权 scope )。

其中,identitycontact分别对应用户实名信息和用户手机号信息敏感字段,返回结果会进行 AES 加密,AES 密钥在盯链开放平台中获取。

json
{
  "res": {
    // scope含baseInfo时返回
    "baseInfo": {
      "openid": "OPENID",
      "walletAddress": "0x111111111111111111",
      "chainId": "conflux",
      "nickName": "昵称",
      "authLevel": 0
    },
    // scope含identity时返回
    "identity": {
      "name": "AES(姓名)",
      "idCard": "AES(身份证号)"
    },
    // scope含contact时返回
    "contact": {
      "phoneNumber": "AES(手机号)"
    }
  },
  "code": 200
}

刷新 access_token

access_token 是调用授权关系接口的调用凭证,由于 access_token 有效期(目前为 2 个小时)较短,当 access_token 超时后,可以使用 refresh_token 进行刷新。

refresh_token 有效期

refresh_token 拥有较长的有效期(30 天),当 refresh_token 失效的后,需要用户重新授权。

  • 请求

    请求以下链接进行 refresh_token:
https://inf-api.dingblock.tech/oauth2/refresh_token?appid=APPID&refresh_token=REFRESH_TOKEN

参数说明

参数
必填
说明
appid应用唯一标识
refresh_token获取 access_token中得到的 refresh_token
  • 响应

json
{
  "access_token": "ACCESS_TOKEN",
  "expires_in": 7200,
  "refresh_token": "REFRESH_TOKEN",
  "openid": "OPENID",
  "scope": "SCOPE"
}

响应参数及错误情况同上

注意:

1、appsecret 是应用接口使用密钥,泄漏后将可能导致应用数据泄漏、应用的用户数据泄漏等高风险后果;存储在客户端,极有可能被恶意窃取(如反编译获取 Appsecret)

2、access_token 为用户授权第三方应用发起接口调用的凭证(相当于用户登录态),存储在客户端,可能出现恶意获取 access_token 后导致的用户数据泄漏、相关接口功能被恶意发起等行为;

3、refresh_token 为用户授权第三方应用的长效凭证,仅用于刷新 access_token,但泄漏后相当于 access_token 泄漏,风险同上。

建议将 secret、用户数据(如 access_token)放在 App 云端服务器,由云端中转接口调用请求。

授权 Scope

baseInfo

参数类型说明
openidstring授权用户唯一标识
walletAddressstring用户授权的区块链地址
chainIdstring区块链 id,可选值 conflux/conflux_test
nickNamestring用户昵称
avatarUrlstring用户头像 url,可能为空字符串
authLevelint用户是否实名, 0 未实名,1 已实名

identity

参数类型说明
namestring用户姓名,需 AES 解密
idCardstring用户身份证号,需 AES 解密

contact

参数类型说明
phoneNumberstring用户手机号,需 AES 解密