uniapp app 阿里云一鍵登錄功能實現(xiàn)

一鍵登錄功能

官網(wǎng)文檔 https://uniapp.dcloud.net.cn/uniCloud/univerify.html#univerify
univerify 是DCloud 推出的一鍵登錄產(chǎn)品,通過與運營商深度合作,實現(xiàn)APP用戶無需輸入帳號密碼,即可使用本機手機號碼自動登錄的能力。
注意:一鍵登錄必須是手機使用流量的前提下才能獲取到手機號碼,用Wi-Fi聯(lián)網(wǎng)時無法獲取到手機號碼,同時如果是雙卡手機,獲取到的手機號碼是默認移動數(shù)據(jù)的那個手機卡的號碼。

uni-app賬號準備

1、uni-app官網(wǎng)注冊賬號,并且在DCloud開發(fā)者中心創(chuàng)建應(yīng)用
2、開通一鍵登錄服務(wù) 保管好ApiKey 和 ApiSecret


ApiKey.png

3、點擊上圖基礎(chǔ)配置頁面右下角添加應(yīng)用(開通一鍵登錄服務(wù)的應(yīng)用)


添加開啟一鍵登錄服務(wù)的應(yīng)用.jpg

開始踩坑了
坑一:關(guān)于如何獲取Android應(yīng)用簽名MD5和SHA256,需要安裝jre環(huán)境,新版JRE環(huán)境下已不支持生成MD5,具體操作可參考https://ask.dcloud.net.cn/article/35777,自己電腦中裝了新版只拿到了SHA256,MD5半天沒弄好,嫌麻煩,隨便找了一個,也能用,后面公司開發(fā)項目的時候,這兩個簽名需要問公司要哦;

4、添加服務(wù)空間


安全配置.png

uni-app 開通一鍵登錄服務(wù)

1、項目開通uniCloud 服務(wù)

關(guān)聯(lián)云空間選擇阿里云或者騰訊云都可以,這里選擇阿里云;

項目關(guān)聯(lián)云空間.jpg

2、新建云函數(shù)


新建云函數(shù).jpg

3、新建云函數(shù)后會有一個index.js生成,粘貼一下代碼

    'use strict';
    const crypto = require('crypto')
    exports.main = async (event, context) => {
        //event為客戶端上傳的參數(shù)
        console.log('event : ', event,5);
        console.log('參數(shù)', event.queryStringParameters);
        // event里包含著客戶端提交的參數(shù)
        const res = await uniCloud.getPhoneNumber({
            appid: '__UNI__FF1F966', // 替換成自己開通一鍵登錄的應(yīng)用的DCloud appid,使用callFunction方式調(diào)用時可以不傳(會自動取當前客戶端的appid),如果使用云函數(shù)URL化的方式訪問必須傳此參數(shù)
            provider: 'univerify',
            apiKey: '84d1e1cf1730cb52870d5df100501226', // 在開發(fā)者中心開通服務(wù)并獲取apiKey
            apiSecret: '26f1c69122a10ad0e103e5e7a157a407', // 在開發(fā)者中心開通服務(wù)并獲取apiSecret
            access_token: event.access_token,
            openid: event.openid
        })
        console.log('res',res); // res里包含手機號
        // 執(zhí)行用戶信息入庫等操作,正常情況下不要把完整手機號返回給前端
        // 如果數(shù)據(jù)庫在uniCloud上,可以直接入庫
        // 如果數(shù)據(jù)庫不在uniCloud上,可以通過 uniCloud.httpclient API,將手機號通過http方式傳遞給其他服務(wù)器的接口,詳見:https://uniapp.dcloud.net.cn/uniCloud/cf-functions?id=httpclient
        
        return {
            code: 0,
            message: '獲取手機號成功',
            data: res
        }
    };

坑二:
云函數(shù)中event參數(shù)中的access_token和openid 直接使用event.access_token,event.openid,使用event.queryStringParameters.access_token,
event.queryStringParameters.openid 會報錯;

4、保存后上傳部署到云空間


上傳部署云函數(shù).jpg

5、勾選項目中一鍵登錄(項目中manifest.json)


manifest勾選.jpg

項目編輯

1、項目中新建common文件夾并且新建my_serve.js文件,創(chuàng)建預(yù)登錄以及一鍵快速登錄函數(shù),并且導(dǎo)出

export default {   
    /**     * 一鍵登錄預(yù)登錄檢查     * @return {boolean} 是否支持一鍵登錄       */    
    pre_login(){        
        uni.getProvider({ 
            //獲取可用的服務(wù)提供商            
            service: 'oauth',            
            success: function(res) {                
                console.log(res.provider) // ['weixin', qq', 'univerify']           
                },
            });        
            return new Promise((resolve, reject)=>{            
                uni.preLogin({ 
                    //預(yù)登錄                
                    provider: 'univerify', //用手機號登錄                
                    success() {   
                        console.log('預(yù)登錄成功,16')
                        resolve(true)                
                        },                
                    fail(err) { 
                        //預(yù)登錄失敗                    
                        console.log(`預(yù)登錄失敗(${err.errCode})`, err.errMsg)                    
                        resolve(false)                
                        }           
                    })       
                })    
            },   
             /**  * 本機號碼一鍵登錄     */    
             async fast_login(){        
                 return new Promise((resolve, reject)=>{            
                     uni.login({ 
                     //正式登錄,彈出授權(quán)窗                
                     provider: 'univerify',                
                     univerifyStyle: { 
                         // 自定義登錄框樣式                    
                         "fullScreen": true, // 是否全屏顯示,true表示全屏模式,false表示非全屏模式,默認值為false。                    
                         "backgroundColor": "#ffffff", // 授權(quán)頁面背景顏色,默認值:#ffffff                    
                          "phoneNum": {                        
                              "color": "#000000", // 手機號文字顏色 默認值:#000000                       
                              },                    
                          "authButton": {                        
                              "normalColor": "#3479f5", // 授權(quán)按鈕正常狀態(tài)背景顏色 默認值:#3479f5                          
                              "highlightColor": "#2861c5", // 授權(quán)按鈕按下狀態(tài)背景顏色 默認值:#2861c5(僅ios支持)                          
                              "disabledColor": "#73aaf5", // 授權(quán)按鈕不可點擊時背景顏色 默認值:#73aaf5(僅ios支持) 
                              "textColor": "#ffffff", // 授權(quán)按鈕文字顏色 默認值:#ffffff                          
                              "title": "本機號碼一鍵登錄" ,// 授權(quán)按鈕文案 默認值:“本機號碼一鍵登錄”                     
                              },
                              "buttons": {
                                  "iconWidth": "30px",
                                  "list": [
                                      {
                                          "provider": "sinaweibo",
                                          "iconPath": "/static/sina.png"
                                      }, 
                                      {
                                          "provider": "weixin",
                                             "iconPath": "/static/wechat.png"
                                      }, 
                                      {
                                          "provider": "qq",
                                             "iconPath": "/static/qq.png"
                                      }
                                     ]
                                  },
                            },               
                         success(res) { 
                             // 正式登錄成功  
                             console.log(111)
                             console.log(res.authResult,50); 
                            //  {
                            //   openid:'登錄授權(quán)唯一標識',
                            //   access_token:'接口返回的 token'
                            // }                    
                          resolve(res.authResult) 
                          // 在得到access_token后,通過callfunction調(diào)用云函數(shù)              
                           uniCloud.callFunction({                   
                                   name: 'oneLogin', // 云函數(shù)名稱                    
                                   data: { //傳給云函數(shù)的參數(shù)                    
                                   'access_token': res.authResult.access_token, //客戶端一鍵登錄接口返回的access_token                    
                                   'openid': res.authResult.openid // 客戶端一鍵登錄接口返回的openid                    
                                   },                   
                                   success(callRes) {                   
                                       console.log('調(diào)用云函數(shù)成功' + callRes + '獲取手機號成功')
                                       uni.navigateTo({
                                        url:"/pages/my/my"
                                       }) 
                                                        
                                   },                   
                                   fail(callErr) {                
                                       console.log('調(diào)用云函數(shù)出錯' + callErr)                 
                                   },                  
                                   complete() {                  
                                       uni.closeAuthView() //關(guān)閉授權(quán)登錄界面                   
                                   }                    
                               })                    
                            uni.closeAuthView() //關(guān)閉授權(quán)登錄界面               
                        },                
                        fail(err) { 
                        // 正式登錄失敗                    
                        console.log(`一鍵登錄失敗(${err.errCode})`, err.errMsg)                    
                        reject(err)                    
                        // uni.closeAuthView() 
                        //關(guān)閉授權(quán)登錄界面              
                         }           
                    })       
                })  
            }
}

2、在項目index頁面測試

import service from '../../common/my_serve.js'
//在onLoad(){}鉤子中調(diào)用預(yù)登錄函數(shù)
async onLoad() {   
            const can_login = await service.pre_login()    
            if(can_login){        
                this.fast_login()    
             }
        },
methods: {    
            async fast_login() {       
                try{            
                    const { access_token, openid } = await service.fast_login()            
                    console.log("uniapp一鍵登錄", access_token, openid,29)            // 登錄操作,獲取token和用戶信息等操作        
                }catch(e){            
                    console.log('一鍵登錄失敗', e)        
                    }    
                },
            },

代碼生成效果如下:


一鍵登錄全屏頁面.jpg

坑三:
真機調(diào)試報錯 -20202是非流量的問題,需要開啟手機流量

坑四:
預(yù)登錄失敗 perLogin: fail
-當前客戶端和HBuilderX不在同一局域網(wǎng)下(或其他網(wǎng)絡(luò)原因無法連接HBuilderX),uniCloud本地調(diào)試服務(wù)不對當前客戶端生效。
-如果不使用uniCloud本地調(diào)試服務(wù),請直接忽略此信息。
-如需使用uniCloud本地調(diào)試服務(wù),請將客戶端與主機連接到同一局域網(wǎng)下并重新運行到客戶端。
-如果在HBuilderX開啟的狀態(tài)下切換過網(wǎng)絡(luò)環(huán)境,請重啟HBuilderX后再試
-檢查系統(tǒng)防火墻是否攔截了HBuilderX自帶的nodejs
早上調(diào)試還是正常的,晚上后就報這個錯,目前基本還沒找到切實可行的解決方案,官方有聲明說在3.6.4中修復(fù)了這個bug,但我3.6.4還是出現(xiàn)這個問題,更換版本,重新安裝手機調(diào)試基座都試過,無用,第二天早上換了幾次HBuilderX版本后莫名奇妙的好了,無語。。。

坑五:
報錯云函數(shù)調(diào)用失?。篴ccess_token undefined, 要在https://dev.dcloud.net.cn/uniLogin 的一鍵登錄中充一點錢, 就成功了

預(yù)登錄以及一鍵登錄獲取手機號成功.png

其他補充

通過傳統(tǒng)服務(wù)器連接uniCloud云函數(shù)

開發(fā)者也可以在客戶端獲取到access_token等信息后,傳給自己的傳統(tǒng)服務(wù)器。然后由自己的傳統(tǒng)服務(wù)器,訪問uniCloud的云函數(shù)(需將云函數(shù)URL化)。
參考官方文檔https://uniapp.dcloud.net.cn/univerify.html#%E7%94%A8access-token%E6%8D%A2%E6%89%8B%E6%9C%BA%E5%8F%B7 說的挺詳細的;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容