用uni-app開發app應用登陸

著了迷發表於2019-03-13

後端程式

我使用的是laravel框架作為app的介面,前後端分離就涉及到登陸這個問題了,uni-app不支援讀寫cookie,所以不能使用cookie來儲存登陸狀態.後端我使用的是基於OAuth的擴充套件包Passport擴充套件包,這裡就不細寫安裝這個擴充套件包的過程了.詳情可以參考學院君的文章.

uni-app傳送登陸請求

預設的uni-app是一個使用 Vue.js.竟然這裡登陸狀態沒有cookie了,那麼我們咋麼儲存登陸狀態呢,我們是通過vuex儲存登陸狀態的.

const store = new Vuex.Store({
    state: {
        /**
         * 是否需要強制登入
         */
        forcedLogin: false,
        hasLogin: false,
        userInfo:{},
    },
    mutations: {
        login(state, provider) {
			state.hasLogin = true;
            state.userInfo.access_token = provider.access_token,  //access_token 是授權令牌,接下來訪問後端的介面都帶上token
            state.userInfo.token_type = provider.token_type,      //token_type 表示認證型別是 Bearer,
			                                                      //我們可以將這個 access_token 值設定到 Bearer Authentication 請求頭去請求需要認證的後端 API 介面
			uni.setStorage({
				key:'userInfo',
				data:provider,
			})
        },
        logout(state) {
            state.hasLogin = false;
			state.userinfo={};
			uni.removeStorage({
				key:'userInfo'
			})
        }
    }
})

export default store
複製程式碼

登陸頁面

 bindLogin() {
				
                /**
                 * 客戶端對賬號資訊進行一些必要的校驗。
                 * 實際開發中,根據業務需要進行處理,這裡僅做示例。
                 */
                if (this.account.length < 5) {
                    uni.showToast({
                        icon: 'none',
                        title: '賬號最短為 5 個字元'
                    });
                    return;
                }
                if (this.password.length < 6) {
                    uni.showToast({
                        icon: 'none',
                        title: '密碼最短為 6 個字元'
                    });
                    return;
                }
				
                /**
                 * 下面簡單模擬下服務端的處理
                 * 檢測使用者賬號密碼是否在已註冊的使用者列表中
                 * 實際開發中,使用 uni.request 將賬號資訊傳送至服務端,客戶端在回撥函式中獲取結果資訊。
                 */
                const data = {
					grant_type:'password',
					client_id: 1,   
					client_secret: '資料庫中client_secret',//同上
					username: this.account,
					password: this.password,
                };
//                 const validUser = service.getUsers().some(function (user) {
//                     return data.account === user.account && data.password === user.password;
//                 });

                uni.request({
                	url:'http://guohang.test/oauth/token', //獲取訪問令牌
					data:
					{
						grant_type:'password',
						client_id: 1,   //安裝passport,完成間授權註冊,資料庫生成的
						client_secret: '資料庫中client_secret',//同上
						username: this.account,
						password: this.password,
					},
					method:'POST',
					header:{
						'Access-Control-Allow-Origin': '*',  //跨域加上頭
						'Content-Type': 'application/json; charset=UTF-8'
					},
					
					success:(res)=> {     檢驗成功返回狀態碼,訪問令牌等引數,使用vuex儲存狀態,後面請求伺服器介面都要帶上
						const info={      
							access_token:res.data.access_token,
							token_type:res.data.token_type,
						};
					
						if(res.statusCode==200){
							this.login(info);
									 uni.reLaunch({
									 url:'../main/main',
									 });
						}else{
							uni.showToast({
							    icon: 'none',
							    title: '使用者賬號或密碼不正確',
							});
						}	
							
					}, 
                })
				

            },...mapMutations(['login']) , 
複製程式碼

認證的頁面

因為頁面有些是需要登陸之後才能進行操作的,所以我們應該有個攔截器來進行判斷是否登陸,沒有登陸就跳轉登陸頁面,

 import {
        mapState,
		mapMutations
    } from 'vuex'

    export default {
        computed: mapState(['forcedLogin', 'hasLogin', 'userName']),
        onLoad() {
            if (!this.hasLogin) {
                uni.showModal({
                    title: '未登入',
                    content: '您未登入,需要登入後才能繼續',
                    /**
                     * 如果需要強制登入,不顯示取消按鈕
                     */
                    showCancel: !this.forcedLogin,
                    success: (res) => {
                        if (res.confirm) {
							/**
							 * 如果需要強制登入,使用reLaunch方式
							 */
                            if (this.forcedLogin) {
                                uni.reLaunch({
                                    url: '../login/login'
                                });
                            } else {
                                uni.navigateTo({
                                    url: '../login/login'
                                });
                            }
                        }
                    }
                });
            }
        }
    }
複製程式碼

這只是一個很小的輪子,給你提供思路,最近自己在用這個做混合開發,所以做個並不是很細的筆記.

相關文章