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)用失斦铡:access_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)系作者
  • 序言:七十年代末绑雄,一起剝皮案震驚了整個濱河市展辞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绳慎,老刑警劉巖纵竖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異杏愤,居然都是意外死亡靡砌,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門珊楼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來通殃,“玉大人,你說我怎么就攤上這事』啵” “怎么了堕担?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長曲聂。 經(jīng)常有香客問我霹购,道長,這世上最難降的妖魔是什么朋腋? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任齐疙,我火速辦了婚禮,結(jié)果婚禮上旭咽,老公的妹妹穿的比我還像新娘贞奋。我一直安慰自己,他們只是感情好穷绵,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布轿塔。 她就那樣靜靜地躺著,像睡著了一般仲墨。 火紅的嫁衣襯著肌膚如雪勾缭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天宗收,我揣著相機與錄音漫拭,去河邊找鬼。 笑死混稽,一個胖子當著我的面吹牛采驻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播匈勋,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼礼旅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了洽洁?” 一聲冷哼從身側(cè)響起痘系,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饿自,沒想到半個月后汰翠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡昭雌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年复唤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烛卧。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡佛纫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呈宇,我是刑警寧澤好爬,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站甥啄,受9級特大地震影響存炮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜型豁,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一僵蛛、第九天 我趴在偏房一處隱蔽的房頂上張望尚蝌。 院中可真熱鬧迎变,春花似錦、人聲如沸飘言。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姿鸿。三九已至谆吴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間苛预,已是汗流浹背句狼。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留热某,地道東北人腻菇。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像昔馋,于是被迫代替她去往敵國和親筹吐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容