Gatsby + contentful + Netlify 的私人/登录部分

Posted

技术标签:

【中文标题】Gatsby + contentful + Netlify 的私人/登录部分【英文标题】:Private/login section of Gatsby + contentful + Netlify 【发布时间】:2020-05-29 11:28:48 【问题描述】:

我希望我的内容 + Gatsby + Netlify 网站的一部分仅对某些人开放。由于内容丰富,我不确定如何使用these instructions 设置私有路由——这些例程是在构建时动态创建的。我不知道如何只设置一个或两个部分来登录并让所有其他部分公开。有人可以提出建议或给我指点指南吗?

【问题讨论】:

【参考方案1】:

这是您链接的教程中的important bit。

我不知道如何只设置一个或两个部分来登录并让所有其他部分公开。有人可以提出建议或给我指点指南吗?

选择一条您想设为私有的路由,例如/app/profile。这可以完全在 React 中完成:

//src/components/privateRoute.js

import React,  Component  from "react"
import  navigate  from "gatsby"
import  isLoggedIn  from "../services/auth"
const PrivateRoute = ( component: Component, location, ...rest ) => 
  if (!isLoggedIn() && location.pathname !== `/app/login`) 
    navigate("/app/login")
    return null
  
  return <Component ...rest />

export default PrivateRoute

您需要在某处存储登录凭据。我建议将 React 内容与您的身份验证 API 一起使用。这是一个question,可能会对您有所帮助。

// AuthContextProvider class:

import React from "react";

export const AuthContext = React.createContext();

export class AuthContextProvider extends React.Component 
  state = 
    authenticated: false,
    toggleLogin: () => ,
    userid: null,
  ;

  render() 
    return (
      <AuthContext.Provider
        value=
          authenticated: this.state.authenticated,
          userid: this.state.userid,
          toggleLogin: () => 
            const previousValueState = this.state.authenticated;
            this.setState(state => (
              authenticated: !previousValueState,
              userid: 2,
            ));
          ,
        
      >
        this.props.children
      </AuthContext.Provider>
    );
  

现在您可以编辑您的路由器以使用 PrivateRoute 组件:

//src/pages/app.js

import React from "react"
import  Router  from "@reach/router"
import Layout from "../components/layout"
import PrivateRoute from "../components/privateRoute"
import Profile from "../components/profile"
import Login from "../components/login"
const App = () => (
  <Layout>
    <Router>
      <PrivateRoute path="/app/profile" component=Profile />
      <Login path="/app/login" />
    </Router>
  </Layout>
)
export default App

我建议不要担心 Contentful。私有路由的概念由 Gatsby 和 React 处理。像 Contentful 这样的 CMS 与私有路由无关。如果您想对此部分有更详细的答案,您需要更具体地回答您的问题。

【讨论】:

以上是关于Gatsby + contentful + Netlify 的私人/登录部分的主要内容,如果未能解决你的问题,请参考以下文章

自定义 Gatsby / Contentful Schema

Gatsby + contentful + Netlify 的私人/登录部分

在 Gatsby 和 Contentful 中按日期过滤

使用 Gatsby/Contentful 从 Graphql 获取参考数据

使用 Gatsby Contentful 显示所有博客文章

Gatsby Contentful - GraphQL 查询错误:未知类型“ContentfulFixed”