React Navigation 身份驗證流程

轉(zhuǎn)載于 何洲的個人博客

幾乎所有的應(yīng)用都需要進行身份驗證,今天我就來介紹一下如何通過 React Navigation 實現(xiàn)這一流程盟步。我將會使用 Express 構(gòu)建一個簡單的服務(wù)器使 Demo 看起來更加真實,驗證的過程基于 Token 實現(xiàn)纠屋。

Demo 的源碼請在 Github 上查看:https://github.com/hezhii/react-native-auth-example

概述

我們的 APP 將會是這樣子……

  1. 當(dāng)用戶第一次打開 APP 時將會進入到登錄頁面掸冤,在此頁面輸入正確的用戶名和密碼并點擊登錄后,將會進入到主頁浆洗。此時,除非用戶退出登錄集峦,否則無法回到登錄頁面伏社。

  2. 登錄頁面還提供了一個“新用戶注冊”按鈕,點擊此按鈕會進入到注冊頁面塔淤,用戶可以在此頁面注冊成為新用戶摘昌。

  3. 主頁由兩個標簽頁組成,用戶可以在“我的”頁面通過點擊“退出登錄”按鈕注銷登錄高蜂。注銷登錄后聪黎,除非用戶再次登錄,否則無法再回到主頁备恤。

  4. 如果用戶以前登錄過稿饰,那么當(dāng)用戶打開 APP 后,將會直接進入到主頁露泊。

rn_auth_demo.gif

界面及路由

考慮 APP 的概述喉镰,我們會用到 4 個界面,分別是:注冊惭笑、登錄侣姆、主頁、我的脖咐,其中“主頁”和“我的”是兩個標簽頁铺敌,它們組成了 APP 的主界面。因此屁擅,我們需要用到兩個導(dǎo)航器:TabNavigator 和 StackNavigator,其中 StackNavigator 用來完成注冊产弹、登錄和 APP 主界面的跳轉(zhuǎn)派歌,而 TabNavigator 則完成主頁和我的頁面的切換。

路由器的配置如下:

const Main = TabNavigator({
  Home: {
    screen: Home,
    navigationOptions: {
      headerTitle: '主頁'
    }
  },
  Profile: {
    screen: Profile,
    navigationOptions: {
      headerTitle: '我的'
    }
  }
}, {
  tabBarOptions: {
    labelStyle: {
      fontSize: 16
    }
  }
});

const AppNavigator = StackNavigator({
  Login: {
    screen: Login,
    navigationOptions: {
      headerTitle: '登錄'
    }
  },
  Main: {
    screen: Main
  },
  Register: {
    screen: Register,
    navigationOptions: {
      headerTitle: '注冊'
    }
  }
});

export default AppNavigator;

接著痰哨,我們在應(yīng)用入口點(App.js)使用 AppNavigator:

import React, { Component } from 'react';
import {
  StyleSheet,
  View
} from 'react-native';

import AppNavigator from './AppNavigator';

class App extends Component {
  render() {
    return (
      <View style={styles.container}>
        <AppNavigator />
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1
  }
});

export default App;

各個界面及后臺服務(wù)的代碼這里就不貼出來了胶果,請查看相應(yīng)源碼:https://github.com/hezhii/react-native-auth-example/tree/step1

這一步主要完成的工作如下:

  • 后臺服務(wù)及各界面的 UI。
  • 簡單的封裝了 fetch API斤斧。
  • 點擊注冊按鈕時早抠,使用 navigation.navigate('Register') 跳轉(zhuǎn)到注冊界面。
  • 登錄請求成功后撬讽,利用 NavigationActions.reset()navigation.dispatch(resetAction) 跳轉(zhuǎn)到 APP 主界面并 Reset 路由蕊连。
  • 點擊登出按鈕時悬垃,同樣 Reset 路由并跳轉(zhuǎn)到登錄頁面。

這一步實現(xiàn)的效果就和上圖中一樣甘苍,完成了用戶注冊尝蠕、登錄、登出這一流程载庭。

記住登錄狀態(tài)

完成第一步之后看彼,我們實現(xiàn)了 APP 概述中提到了第 1、第 2 和第 3 個功能點囚聚。接下來靖榕,我們需要實現(xiàn)第 4 個功能點,也就是實現(xiàn)一個記住登錄狀態(tài)的功能顽铸。

在 APP 中通常使用 Token 機制來完成身份驗證序矩,這里參考 OAuth2.0 來實現(xiàn)這樣的一個機制:

當(dāng)用戶登錄成功后,服務(wù)器會返回這樣的 JSON 數(shù)據(jù):

{
  access_token: 'xxxx',
  refresh_token: 'xxxx',
  expires_in: 7200 // 有效時長為 2 小時
}

其中 access_token 用來鑒定用戶身份跋破,請求需要權(quán)限的接口時需要帶上該信息簸淀;expires_in 表示 access_token 的有效時長,單位為秒毒返;因為 access_token 的有效時長只有 2 小時租幕,為了避免用戶需要再次登錄,當(dāng) access_token 過期后拧簸,可以調(diào)用后臺接口刷新 token劲绪,該接口需要驗證 refresh_token,驗證通過后盆赤,服務(wù)器會返回一組新的 token贾富。

當(dāng)用戶登錄成功后,APP 需要緩存下用戶的 token 信息牺六,在請求敏感信息時颤枪,帶上 access_token,而當(dāng) access_token 過期時淑际,則利用 refresh_token 刷新 token畏纲。同時,當(dāng)用戶打開 APP 后春缕,讀取 refresh_token 并刷新 token盗胀,如果這一操作成功,那么就可以認為用戶已經(jīng)登錄锄贼,直接進入到 APP 主界面票灰,否則則進入到登錄界面。當(dāng)用戶登出時,我們則需要清除本地和服務(wù)器上的緩存屑迂。

這里涉及到兩個關(guān)鍵點:一是如何緩存和讀取 token浸策,二是如何根據(jù)刷新 token 的結(jié)果跳轉(zhuǎn)到指定界面。

緩存和讀取 token 推薦使用 react-native-storage,它提供了豐富的 API 幫助我們實現(xiàn)緩存機制屈糊。

初始頁面的跳轉(zhuǎn)可以通過 initialRouteName 指定的榛,如果刷新 token 成功,則設(shè)置為 'Main',否則設(shè)置為 'Login'逻锐。

這一部分的源碼:https://github.com/hezhii/react-native-auth-example/tree/step2

實現(xiàn)的效果如下圖所示夫晌。

rn_auth_demo1.gif

從圖中可以看到,當(dāng)?shù)卿洺晒竺劣眨匦录虞d時會進入到主界面而不是登錄界面晓淀,而登出后,則會進入到登錄界面盏档。

總結(jié)

以上就是基于 React Navigation 和 Token 緩存機制實現(xiàn)的身份驗證流程凶掰,主要涉及到的是 react-navigation 和 react-native-storage 這兩個庫的使用和 Token 鑒權(quán)機制。這只是一種實現(xiàn)思路蜈亩,更完美的方案我也還在摸索中懦窘,期待下次相遇。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末稚配,一起剝皮案震驚了整個濱河市畅涂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌道川,老刑警劉巖午衰,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異冒萄,居然都是意外死亡臊岸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門尊流,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帅戒,“玉大人,你說我怎么就攤上這事奠旺≈├剑” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵响疚,是天一觀的道長。 經(jīng)常有香客問我瞪醋,道長忿晕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任银受,我火速辦了婚禮践盼,結(jié)果婚禮上鸦采,老公的妹妹穿的比我還像新娘。我一直安慰自己咕幻,他們只是感情好渔伯,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肄程,像睡著了一般锣吼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蓝厌,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天玄叠,我揣著相機與錄音,去河邊找鬼拓提。 笑死读恃,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的代态。 我是一名探鬼主播寺惫,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蹦疑!你這毒婦竟也來了西雀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤必尼,失蹤者是張志新(化名)和其女友劉穎蒋搜,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體判莉,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡豆挽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了券盅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帮哈。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖锰镀,靈堂內(nèi)的尸體忽然破棺而出娘侍,到底是詐尸還是另有隱情,我是刑警寧澤泳炉,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布憾筏,位于F島的核電站,受9級特大地震影響花鹅,放射性物質(zhì)發(fā)生泄漏氧腰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望古拴。 院中可真熱鬧箩帚,春花似錦、人聲如沸黄痪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桅打。三九已至是嗜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間油额,已是汗流浹背叠纷。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留潦嘶,地道東北人涩嚣。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像掂僵,于是被迫代替她去往敵國和親航厚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

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