钱包授权
准备工作
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 端的应用授权。该模式整体流程为:
- 第三方应用发起钱包授权登录请求,根据授权请求参数跳转至 iNF 授权页面
- iNF 钱包用户允许授权第三方应用后,会重定向到第三方网站,并且带上授权临时票据code参数
- 通过 code 获取 access_token
- 通过 access_token 进行接口调用,获取用户基本数据资源或帮助用户实现基本操作
获取 access_token 时序图:
获取 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 位中国手机号码 |
restricted | 否 | 0 或不传:不限制,用户每次授权可选取不同的区块链地址 1: 限制用户区块链授权地址,用户在第一次授权完成后,后续 |
返回说明
用户允许授权后,将会重定向到 redirect_uri 的网址上,并且带上 code 和 state 参数
redirect_uri?code=CODE&state=STATE
若用户禁止授权,则不会发生重定向。
PC 端网页授权
PC 授权需接入 SDK, 使用 iNF App 扫码授权
引入JS SDK
<script src="https://h5.inf.cool/inf.min%401.0.0.js"></script>
在合适位置放置页面容器
<div id="inf-oauth"></div>
提示
需设置容器大小及位置
调用 SDK 方法初始化
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 小程序授权
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
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 参数 |
响应
{
"res": {
"access_token": "ACCESS_TOKEN",
"expires_in": 7200,
"refresh_token": "REFRESH_TOKEN",
"openid": "OPENID",
"scope": "SCOPE"
},
"code": 200
}
参数说明
参数 | 必填 | 说明 |
---|---|---|
access_token | 是 | 接口调用凭证 |
expires_in | 是 | access_token 接口调用凭证超时时间,单位(秒) |
refresh_token | 是 | 用户刷新 access_token |
openid | 是 | 授权用户唯一标识 |
scope | 是 | 用户授权的作用域,使用逗号(,)分隔,详见授权 scope |
错误返回样例:
{
"msg": "invalid scope",
"code": 500 // 错误码
}
通过 access_token 获取用户信息
获取 access_token 后,进行接口调用,有以下前提:
- access_token 有效且未超时;
- 用户已授权给第三方应用帐号相应作用域(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 )。
其中,identity
和contact
分别对应用户实名信息和用户手机号信息敏感字段,返回结果会进行 AES 加密,AES 密钥在盯链开放平台中获取。
{
"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 |
响应
{
"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
参数 | 类型 | 说明 |
---|---|---|
openid | string | 授权用户唯一标识 |
walletAddress | string | 用户授权的区块链地址 |
chainId | string | 区块链 id,可选值 conflux/conflux_test |
nickName | string | 用户昵称 |
avatarUrl | string | 用户头像 url,可能为空字符串 |
authLevel | int | 用户是否实名, 0 未实名,1 已实名 |
identity
参数 | 类型 | 说明 |
---|---|---|
name | string | 用户姓名,需 AES 解密 |
idCard | string | 用户身份证号,需 AES 解密 |
contact
参数 | 类型 | 说明 |
---|---|---|
phoneNumber | string | 用户手机号,需 AES 解密 |