首頁>技術>

我遇到一個場景,該場景需要在React 應用中實現“使用Github登入”功能。雖然這聽起來很簡單,但在嘗試做這件事時,你可能會遇到一些麻煩。因此,本文的目的是提供一個指南,幫助你在你的應用程式中實現這樣的功能。讓我們現在就開始吧!

步驟1:在Github上建立OAuth應用

按照此處提供的步驟登入到你的Github帳戶並建立OAuth應用。注意:對於本例,在建立OAuth應用時,如果你在本地執行應用,可以將主頁URL設定為http://localhost:3000/,將授權回撥URL設定為http://localhost:3000/login。在根目錄下建立一個 .env 檔案,並設定這些變數:

REACT_APP_CLIENT_ID=你的Client IDREACT_APP_CLIENT_SECRET=你的Client SecretREACT_APP_REDIRECT_URI=http://localhost:3000/login
步驟2:建立React應用

繼續使用你的首選來建立你的react應用程式,在這個例子中,我們將使用Create-React-App。如果你使用這種模式,你必須刪除index.css、App.css、App.test.js和serviceWorker.js等檔案。編輯index.js,確保它看起來像這樣:

import React from 'react';import ReactDOM from 'react-dom';import App from './App';ReactDOM.render(<App />, document.getElementById('root'));

另外,編輯App.js,確保它看起來像這樣:

import React, { createContext, useReducer } from 'react';import { BrowserRouter as Router, Route, Switch } from "react-router-dom";import Home from "./components/Home";import Login from "./components/Login";import { initialState, reducer } from "./store/reducer";export const AuthContext = createContext();function App() {  const [state, dispatch] = useReducer(reducer, initialState);  return (    <AuthContext.Provider      value={{        state,        dispatch      }}    >    <Router>      <Switch>        <Route path="/login" component={Login}/>        <Route path="/" component={Home}/>      </Switch>    </Router>    </AuthContext.Provider>  );}export default App;

在App.js檔案中,匯入2個元件(Home.jsLogin.js )。要建立這2個元件,進入src資料夾,建立一個名為component的資料夾,裡面有2個檔案(Home.js和Login.js)。在根資料夾中,你可以在下面執行此命令來建立它們。

mkdir -p src/components && cd src/components && touch Home.js Login.js

接下來,你會觀察到,我們從store匯入了狀態和reducer,繼續並設定一個簡單的store,它將保持應用程式狀態。要做到這一點,導航到src資料夾中,並建立一個名為store的資料夾,在它裡面建立一個名為reducer的子資料夾,並在reducer資料夾裡面建立一個index.js檔案。在根目錄下,你可以執行下面這個命令來建立它們。

mkdir -p src/store/reducer && cd src/store/reducer && touch index.js

Store中index.js檔案的內容應如下所示。

export const initialState = {  isLoggedIn: JSON.parse(localStorage.getItem("isLoggedIn")) || false,  user: JSON.parse(localStorage.getItem("user")) || null,  client_id: process.env.REACT_APP_CLIENT_ID,  redirect_uri: process.env.REACT_APP_REDIRECT_URI,  client_secret: process.env.REACT_APP_CLIENT_SECRET,  proxy_url: process.env.REACT_APP_PROXY_URL};export const reducer = (state, action) => {  switch (action.type) {    case "LOGIN": {      localStorage.setItem("isLoggedIn", JSON.stringify(action.payload.isLoggedIn))      localStorage.setItem("user", JSON.stringify(action.payload.user))      console.log(action.payload.isLoggedIn)      return {        ...state,        isLoggedIn: action.payload.isLoggedIn,        user: action.payload.user      };    }    case "LOGOUT": {      localStorage.clear()      return {        ...state,        isLoggedIn: false,        user: null      };    }    default:      return state;  }};

它包含InitialState物件和一個reducer函式,該函式包含派發的動作以突變狀態。

我們匯入並利用AuthContext使Store中的全域性狀態和操作可在此元件中使用。當用戶點選“用Github登入”按鈕時,會向Github API提出請求,對我們的應用進行授權。如果成功的話,Github就會重定向回我們的應用(授權回撥URL),並在URL中加入“code”。我們利用useEffect hook偵聽此“code”何時可用。然後我們從url中收集它,使用code和其他資料,如:client_id,redirect_uri,client_secret,繼續透過我們的proxy server(代理伺服器)向Github APIs發出請求(一個簡單的快遞應用,幫助我們繞過CORS錯誤)。下一步,我將詳細討論代理伺服器。如果透過代理伺服器的認證返回有效的響應,我們就會排程“LOGIN”事件,在我們的儲存中設定使用者資料和isLoggedIn有效載荷。

讓我們更新Home.js元件以顯示一些使用者資料,例如(頭像,姓名,關注者人數等)

... ...

19
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 壹拓網科技答疑第二十三期