一、整理思路
un-app官網提供多種實現一鍵登錄的方法,這里的選擇是 自有服務器調用
二、uni-app准備賬號
1、un-app官網注冊賬號,並在dcloud開發者中心創建應用
2、開通一鍵登錄服務 保管好 ApiKey 和 ApiSecret
3、點擊右下角的添加應用並提交申請
4、添加服務空間
三、uni-app開通一鍵登錄
1、uni-app項目開通uniCloud服務
關聯雲空間選擇阿里雲或騰訊雲均可
2、新建雲函數
3、新建雲函數后會有一個index.js生成,粘貼以下代碼
'use strict';
const crypto = require('crypto')
exports.main = async (event, context) => {
//event為客戶端上傳的參數
console.log('event : ', event);
console.log('參數', event.queryStringParameters);
// event里包含着客戶端提交的參數
const res = await uniCloud.getPhoneNumber({
appid: '###', // 替換成自己開通一鍵登錄的應用的DCloud appid,使用callFunction方式調用時可以不傳(會自動取當前客戶端的appid),如果使用雲函數URL化的方式訪問必須傳此參數
provider: 'univerify',
apiKey: '###, // 在開發者中心開通服務並獲取apiKey
apiSecret: '###', // 在開發者中心開通服務並獲取apiSecret
access_token: event.queryStringParameters.access_token,
openid: event.queryStringParameters.openid
})
console.log('res',res); // res里包含手機號
// 執行用戶信息入庫等操作,正常情況下不要把完整手機號返回給前端
// 如果數據庫在uniCloud上,可以直接入庫
// 如果數據庫不在uniCloud上,可以通過 uniCloud.httpclient API,將手機號通過http方式傳遞給其他服務器的接口,詳見:https://uniapp.dcloud.net.cn/uniCloud/cf-functions?id=httpclient
return {
code: 0,
message: '獲取手機號成功',
data:res
}
};
4、保存后上傳部署到雲空間
5、勾選一鍵登錄(項目中的 manifest.json)
四、項目編碼
1、調取一鍵登錄
官方有示例代碼 查看
uni.login({
provider: 'univerify',
success(res) { // 登錄成功
console.log(res.authResult); // {openid:'登錄授權唯一標識',access_token:'接口返回的 token'}
res.authResult.accessToken = res.authResult.access_token
return that.$request({
method: 'POST',
url: '后台做具體邏輯的接口',
data: res.authResult
}).then(res => {
uni.closeAuthView() //成功關閉授權頁面
console.log('登錄成功', res)
if (res.code) return
that.$store.commit('setToken', res.data)
that.$util.msg('登錄成功')
setTimeout(() => {
uni.redirectTo({
url: '登陸成功跳轉的目標頁面'
})
}, 500)
})
},
fail(res) { // 登錄失敗
console.log(res.errCode)
console.log(res.errMsg)
}
})
2、日志可以再雲函數列表查看
雲函數可在雲函數列表查看
3、雲函數url化
在雲函數列表點擊詳情,下拉到底部點擊編輯設置一個url
4、后台寫具體邏輯
5、需要的工具類
1、HeaUtil.java
public class HeaUtil {
/**
* sha256_HMAC加密
*
* @param message 消息
* @param secret 秘鑰
* @return 加密后字符串
*/
public static String sha256_HMAC(String message, String secret) {
String hash = "";
try {
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
sha256_HMAC.init(secret_key);
byte[] bytes = sha256_HMAC.doFinal(message.getBytes());
hash = byteArrayToHexString(bytes);
} catch (Exception e) {
System.out.println("Error HmacSHA256 ===========" + e.getMessage());
}
return hash;
}
/**
* 將加密后的字節數組轉換成字符串
*
* @param b 字節數組
* @return 字符串
*/
private static String byteArrayToHexString(byte[] b) {
StringBuilder hs = new StringBuilder();
String stmp;
for (int n = 0; b != null && n < b.length; n++) {
stmp = Integer.toHexString(b[n] & 0XFF);
if (stmp.length() == 1)
hs.append('0');
hs.append(stmp);
}
return hs.toString().toLowerCase();
}
}