提交 5c12560e 编写于 作者: Q qiang

docs: 增加一键登录文档

上级 2fa532bf
# 一键登录(univerify) 使用指南
## 一 概述
### 1.1 简介
一键登录是DCloud联合个推公司推出的,整合了三大运营商网关认证能力的服务。
通过与运营商,个验深度合作,实现APP用户无需输入帐号密码,即可使用本机手机号码自动登录的能力。
一键登录 是替代短信验证登录的下一代登录验证方式,能消除现有短信验证模式等待时间长、操作繁琐和容易泄露的痛点。
+ 支持项目类型:uni-app,5+ App,Wap2App
+ 支持系统平台: Android,iOS
+ 支持运营商: 移动,联通,电信
[attach]64141[/attach]
### 1.2 原理
在用户同意授权的操作前提下,访问运营商网关鉴权,获取当前设备access_token等信息。
通过uniCloud 将access_token信息 置换为当前设备的真实手机号码
前置条件:
+ 手机安装有sim卡
+ 手机开启数据流量
+ 开通uniCloud服务
[attach]64512[/attach]
### 1.3 产品优势
- ** 便捷 **
优化了现有短信验证方式,免短信验证一键免密登录APP,耗时极短,减轻用户记忆负担,能有效降低用户流失率,提升运营效果
- ** 安全 **
采用运营商网关认证,避免短信劫持,有效提升安全性
## 二 集成步骤
### 2.1 开通服务
请参考:[开通一键登录指南](https://ask.dcloud.net.cn/article/37965)
### 2.2 集成模块
+ 云端打包
manifest-->OAuth配置-->univerify配置
+ 离线打包
[android/ios 离线打包文档](https://nativesupport.dcloud.net.cn/AppDocs/README)
### 2.3 开通uniCloud服务
一键登录,token换取手机号码需要基于uniCloud服务。
对于uni-app 应用:
直接开通当前应用的uniCloud服务,即可使用。
对于5+ 应用:
需要新建一个uni-app 应用,且开通uniCloud服务。
虽然一键登陆需要uniCloud,但并不要求开发者把所有的后台服务都迁移到uniCloud。
在uniCloud的云函数中拿到手机号后,可以再转给传统服务器,也可以通过云函数url方式生成普通的http接口给5+app使用。
开通uniCloud是免费的,其中阿里云是全免费,腾讯云是提供一个免费服务空间。
关于uniCloud的介绍和使用: [uniCloud说明文档](https://uniapp.dcloud.io/uniCloud/README)
### 2.3 代码实现 for uni-app
#### 2.3.1 获取服务提供商
一键登录对应的服务提供商ID
- id 为 'univerify'
```
uni.getProvider({
service: 'oauth',
success: function (res) {
console.log(res.provider)// univerify
}
});
```
#### 2.3.2 预登录
(可选) 进行预登录操作,在预登录成功后有效时间内,进行登录操作 速度会显著提升
`uni.preLogin(options)`
```
uni.preLogin({
provider: 'univerify'
success(){
// 成功
},
fail(res){
// 失败
console.log(res.errCode)
console.log(res.errMsg)
}
})
```
#### 2.3.3 关闭一键登录页面
```
uni.closeAuthView()
```
#### 2.3.4 请求登录认证
弹出用户授权界面。根据用户操作及授权结果返回对应的回调
`uni.login(options);`
```
uni.login({
provider: 'univerify',
// 自定义样式
univerifyStyle: {},
success(res){
console.log(res.authResult)// {openid:'deviceIDlength+deviceID+gyuid',access_token:'接口返回的 token'}
},
fail(res){
// 失败
console.log(res.errCode)
console.log(res.errMsg)
}
})
```
univerifyStyle 数据结构
```
{
"backgroundColor": "页面背景颜色,默认白色 #ffffff",
"icon": {
"path": "可选 自定义本地图片 默认显示logo ",
"width": "可选 宽度 默认60",
"height": "可选 高度 默认60"
},
"phoneNum": {
"color": "字体颜色 默认黑色 #000000",
"fontSize": "字体大小 默认 18加粗"
},
"slogan": {
"color": "字体颜色 默认 #8a8b90",
"fontSize": "字体大小 默认 12"
},
"authButton": {
"normalColor": "正常状态颜色 #3479f5",
"highlightColor": "按下状态颜色 #2861c5",
"disabledColor": "不可点击时颜色 #73aaf5",(仅ios支持)
"width": "宽度 默认 设备屏幕宽度左右各留 32px",
"height": "高度 默认 94px",
"textColor": "#ffffff",
"title": "本机号码一键登录"
},
"otherLoginButton": {
"visible": "true 是否显示其他登录按钮,默认显示"
"normalColor": "正常状态颜色 #f8f8f8",
"highlightColor": "按下状态颜色 #dedede",
"width": "宽度 默认 设备屏幕宽度左右各留 32px",
"height": "高度 默认 94px",
"textColor": "#000000",
"title": "其他登录方式",
"borderWidth": "边框宽度 1px",(仅ios支持)
"borderColor": "边框颜色 #c5c5c5"(仅ios支持)
},
"privacyTerms": {
"textColor": "#8a8b90 文字颜色",
"termsColor": "#1d4788 协议文字颜色"
"prefix": "我已阅读并同意",
"suffix": "并使用本机号码登录",
"fontSize": 12号字体,
"privacyItems": [
{
"url": "https://",
"title": "用户服务协议"
}
]
}
}
```
返回数据示例
```
{
"errMsg": "login:ok",
"authResult": {
"openid": "208E2FBE6EF64DF3B2D377D886EF2A14124262bfd7ae16465ea0f0634554dcee7636",
"access_token": "ZGI4NjkxZWE4YjAyNGUzMjhiMmZiNDcwODBjYjc5MDF8fDJ8djJ8Mg=="
}
}
```
### 2.4 代码实现 for 5+ App、Wap2App
#### 2.4.1 获取 AuthService
一键登录对应的 AuthService 对象
- id 为 'univerify'
- description 为 '一键登录'
```
var auth = null
plus.oauth.getServices(function(services) {
if (server.id = 'univerify'){
auth = server;
//server.id = 'univerify'
//server.description = "一键登录"
}
}
```
#### 2.4.2 预登录
(可选) 进行预登录操作,在预登录成功后有效时间内,进行登录操作 速度会显著提升
`auth.preLogin(successCallback,errorCallback)`
```
auth.preLogin(function(){
// 成功
},function(error){
// 失败
error.status
error.message
})
```
#### 2.4.3 关闭一键登录页面
```
auth.closeAuthView()
```
#### 2.4.4 请求登录认证
弹出用户授权界面。根据用户操作及授权结果返回对应的回调
`auth.login(successCallback, errorCallback, AuthOptions);`
```
auth.login(function(event){
{
openid : 'deviceIDlength+deviceID+gyuid',
access_token: '接口返回的 token',
}
},function(error){
// 失败
error.status
error.message
},{
// 自定义页面参数
AuthOptions : {
}
})
```
AuthOptions 数据结构
```
{
"backgroundColor": "页面背景颜色,默认白色 #ffffff",
"icon": {
"path": "可选 自定义本地图片 默认显示logo ",
"width": "可选 宽度 默认60",
"height": "可选 高度 默认60"
},
"phoneNum": {
"color": "字体颜色 默认黑色 #000000",
"fontSize": "字体大小 默认 18加粗"
},
"slogan": {
"color": "字体颜色 默认 #8a8b90",
"fontSize": "字体大小 默认 12"
},
"authButton": {
"normalColor": "正常状态颜色 #3479f5",
"highlightColor": "按下状态颜色 #2861c5",
"disabledColor": "不可点击时颜色 #73aaf5",(仅ios支持)
"width": "宽度 默认 设备屏幕宽度左右各留 32px",
"height": "高度 默认 94px",
"textColor": "#ffffff",
"title": "本机号码一键登录"
},
"otherLoginButton": {
"visible": "true 是否显示其他登录按钮,默认显示"
"normalColor": "正常状态颜色 #f8f8f8",
"highlightColor": "按下状态颜色 #dedede",
"width": "宽度 默认 设备屏幕宽度左右各留 32px",
"height": "高度 默认 94px",
"textColor": "#000000",
"title": "其他登录方式",
"borderWidth": "边框宽度 1px",(仅ios支持)
"borderColor": "边框颜色 #c5c5c5"(仅ios支持)
},
"privacyTerms": {
"textColor": "#8a8b90 文字颜色",
"termsColor": "#1d4788 协议文字颜色"
"prefix": "我已阅读并同意",
"suffix": "并使用本机号码登录",
"fontSize": 12号字体,
"privacyItems": [
{
"url": "https://",
"title": "用户服务协议"
}
]
}
}
```
返回数据示例
```
{
"target": {
"id": "univerify",
"description": "一键登录",
"authResult": {
"openid": "208E2FBE6EF64DF3B2D377D886EF2A14124262bfd7ae16465ea0f0634554dcee7636",
"access_token": "ZGI4NjkxZWE4YjAyNGUzMjhiMmZiNDcwODBjYjc5MDF8fDJ8djJ8Mg=="
}
}
}
```
### 2.5 换取手机号码
通过uniCloud api 将返回的access_token置换为真实的手机号码。
** 重要提示:正常情况下,用户的手机号码信息不应该返回给客户端 !!! **
#### 2.5.1 对于uni-app:
支持两种调用方式:
1 直接调用云函数(推荐)
2 将云函数 http服务化,然后调用http服务
我们这里以调用云函数为例:
直接新建云函数上传部署即可,代码实现可以参考:
[attach]65024[/attach]
#### 2.5.2 对于5+ App:
只支持一种调用方式,即: 云函数 http服务化
前置条件:已创建一个uni-app 应用,且开通uniCloud服务。
操作步骤:
+ 新建云函数,实现一键登录功能并上传部署。
创建云函数,代码参考uni-app 实现
[attach]65033[/attach]
+ 将刚才上传的云函数,开通http服务状态。
[attach]65031[/attach]
+ 5+ 应用访问uni-app 应用的 http 服务
[attach]65039[/attach]
返回数据示例
```
{
"data": {
"code": 0,
"success": true,
"phoneNumber": "166xxxx6666"
},
"statusCode": 200,
"header": {
"Content-Type": "application/json; charset=utf-8",
"Connection": "keep-alive",
"Content-Length": "53",
"Date": "Fri, 06 Nov 2020 08:57:21 GMT",
"X-CloudBase-Request-Id": "xxxxxxxxxxx",
"ETag": "xxxxxx""
},
"errMsg": "request:ok"
}
```
[关于uniCloud对一键登录功能的详细说明](https://uniapp.dcloud.net.cn/uniCloud/univerify)
## Q&A
### 常见错误代码
| 错误码 | 错误描述 |
| -:- | -:- |
| 1000 | 当前 uniAppid 尚未开通一键登录 |
| 1001 | 应用所有者账号信息异常,请检查账号一键登录服务是否正常 |
| 1002 | 应用所有者账号信息异常,请检查账号余额是否充足 |
| 4001 | 请求参数异常 |
|30001 |当前网络环境不适合执行该操作|
|30002 |用户点击了其他登录方式|
|30003 |用户关闭验证界面|
|30004 |其他错误|
|30005 |预登录失败|
|30006 |一键登录失败|
|30007 |获取本机号码校验token失败|
|40047 |一键登录取号失败|
|40053 |手机号校验失败|
### 提示 非移动网关ip地址
大多数情况 是因为部分特定设备,不支持双卡双待的网络环境导致
### 代码 40201 提示 源IP鉴权失败
检查一下手机卡类型是否是正常运营商手机卡,关闭飞行模式后重新尝试
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册