提示:手机号一键登录有两种方式。
第一种通过调用自有服务器,然后服务器调用云函数登录。
第二种可以前端直接调用云函数进行登录(暂不介绍)。
提示:在我的项目中使用的是自由服务器登录,下面的案例可供参考
一、自有服务器等录
1.uni-app开通账号权限
使用开发者账号登录开发者中心,在左侧导航选择“一键登录”。在使用此功能前需要先完成邮箱及手机号验证,根据开发者中心页面提示完成验证即可。验证后,点击页面上的“同意协议并开通”,便可开通账号一键登录服务。(该功能收费:成功请求0.02元,失败不计费)
到添加应用时注意生成SHA256加密的签名时一定要使用1.8的jdk!!!!
具体流程:https://ask.dcloud.net.cn/article/37965
2.部署云函数
在项目中创建云函数,选择一个云环境。
然后创建函数,我这里用的是腾讯云。
在index.js中写下以下代码。服务器端代码可以参考:https://blog.csdn.net/kevlin_V/article/details/112789828
// 云函数验证签名,此示例中以接受GET请求为例作演示
const crypto = require('crypto')
module.exports = async(event){
const secret = 'your-secret-string' // 自己的密钥不要直接使用示例值,且注意不要泄露
const hmac = crypto.createHmac('sha256', secret);
let params = event.queryStringParameters
const sign = params.sign
delete params.sign
const signStr = Object.keys(params).sort().map(key => {
return `${key}=${params[key]}`
}).join('&')
hmac.update(signStr);
//hmac.digest('hex')调用第一次有结果,随后的都为空,如果想console.log看的这个后面再用一定会报错的。
if(sign!==hmac.digest('hex')){
throw new Error('非法访问')
}
const {
access_token,
openid
} = params
const res = await uniCloud.getPhoneNumber({
provider: 'univerify',
appid: 'xxx', // DCloud appid,不同于callFunction方式调用,使用云函数Url化需要传递DCloud appid参数
apiKey: 'xxx', // 在开发者中心开通服务并获取apiKey
apiSecret: 'xxx', // 在开发者中心开通服务并获取apiSecret
access_token: access_token,
openid: openid
})
// 返回手机号给自己服务器
return res
}
3.APP端代码
tellogin(){
uni.preLogin({
provider: 'univerify',
success:()=>{
uni.login({
provider: 'univerify',
univerifyStyle: { // 自定义登录框样式
},
success:(res)=>{ // 登录成功
let loginRes = res.authResult
// loginRes : {openid:'deviceIDlength+deviceID+gyuid',access_token:'接口返回的 token'}
// 自己的后台登录请求逻辑
// 配合后台伙伴请求DCloud云函数来获取手机号码
},
fail(res){ // 登录失败
uni.closeAuthView()//关闭一键登录弹出窗口
},
complete: () => {
uni.closeAuthView()
}
})
},
fail(res){
// 预登录失败
//如果手机没有插入有效的sim卡,或者手机蜂窝数据网络关闭,
//都有可能造成预登录校验失败。
}
})
},