在 React 项目中使用 Auth0 并集成到后端服务的配置步骤

在 React 项目中使用 Auth0 并集成到后端服务的配置步骤如下:

1. 在 Auth0 创建应用程序

  1. 登录到 Auth0 Dashboard.
  2. 导航到 “Applications” (应用程序) 部分并点击 “Create Application” (创建应用程序).
  3. 为您的应用程序命名并选择应用类型为 “Single Page Web Applications” (单页 Web 应用).
  4. 点击 “Create” (创建).

2. 配置 Auth0 应用程序

  1. 在应用程序的设置页面, 设置以下字段:
    • Allowed Callback URLs: http://localhost:3000/callback (开发环境的本地地址)
    • Allowed Logout URLs: http://localhost:3000 (开发环境的本地地址)
    • Allowed Web Origins: http://localhost:3000 (开发环境的本地地址)
  2. 保存更改。

3. 在 React 项目中安装 Auth0 SDK

在 React 项目根目录下,打开终端并运行:

npm install @auth0/auth0-react

4. 在 React 项目中配置 Auth0

  1. 创建一个名为 auth_config.json 的文件,包含以下内容:
{
  "domain": "YOUR_AUTH0_DOMAIN",
  "clientId": "YOUR_AUTH0_CLIENT_ID",
  "audience": "YOUR_API_IDENTIFIER"
}
  1. src 目录下创建一个名为 auth0-provider-with-history.js 的文件:
import React from "react";
import { useNavigate } from "react-router-dom";
import { Auth0Provider } from "@auth0/auth0-react";
import config from "./auth_config.json";

const Auth0ProviderWithHistory = ({ children }) => {
  const navigate = useNavigate();

  const onRedirectCallback = (appState) => {
    navigate(appState?.returnTo || window.location.pathname);
  };

  return (
    <Auth0Provider
      domain={config.domain}
      clientId={config.clientId}
      audience={config.audience}
      redirectUri={window.location.origin}
      onRedirectCallback={onRedirectCallback}
    >
      {children}
    </Auth0Provider>
  );
};

export default Auth0ProviderWithHistory;
  1. src/index.js 文件中使用 Auth0ProviderWithHistory 包裹应用程序:
import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter } from 'react-router-dom';
import Auth0ProviderWithHistory from './auth0-provider-with-history';
import App from './App';

ReactDOM.render(
  <BrowserRouter>
    <Auth0ProviderWithHistory>
      <App />
    </Auth0ProviderWithHistory>
  </BrowserRouter>,
  document.getElementById('root')
);

5. 在 React 组件中使用 Auth0

  1. 使用 useAuth0 钩子访问 Auth0 认证状态:
import React from "react";
import { useAuth0 } from "@auth0/auth0-react";

const Profile = () => {
  const { user, isAuthenticated, isLoading } = useAuth0();

  if (isLoading) {
    return <div>Loading...</div>;
  }

  return (
    isAuthenticated && (
      <div>
        <img src={user.picture} alt={user.name} />
        <h2>{user.name}</h2>
        <p>{user.email}</p>
      </div>
    )
  );
};

export default Profile;
  1. 创建登录和登出按钮:
import React from "react";
import { useAuth0 } from "@auth0/auth0-react";

const LoginButton = () => {
  const { loginWithRedirect } = useAuth0();

  return <button onClick={() => loginWithRedirect()}>Log In</button>;
};

const LogoutButton = () => {
  const { logout } = useAuth0();

  return <button onClick={() => logout({ returnTo: window.location.origin })}>Log Out</button>;
};

export { LoginButton, LogoutButton };

6. 集成到后端服务

  1. 在后端服务中验证 JWT 令牌。以 Go 为例,使用 github.com/auth0/go-jwt-middlewaregithub.com/form3tech-oss/jwt-go
package main

import (
  "net/http"
  "github.com/auth0/go-jwt-middleware"
  "github.com/dgrijalva/jwt-go"
  "github.com/gorilla/mux"
)

var myJwtMiddleware = jwtmiddleware.New(jwtmiddleware.Options{
  ValidationKeyGetter: func(token *jwt.Token) (interface{}, error) {
    audience := "YOUR_API_IDENTIFIER"
    checkAud := token.Claims.(jwt.MapClaims).VerifyAudience(audience, false)
    if !checkAud {
      return token, fmt.Errorf("invalid audience")
    }
    iss := "https://YOUR_AUTH0_DOMAIN/"
    checkIss := token.Claims.(jwt.MapClaims).VerifyIssuer(iss, false)
    if !checkIss {
      return token, fmt.Errorf("invalid issuer")
    }

    cert, err := getPemCert(token)
    if err != nil {
      return nil, err
    }

    return jwt.ParseRSAPublicKeyFromPEM([]byte(cert))
  },
  SigningMethod: jwt.SigningMethodRS256,
})

func main() {
  r := mux.NewRouter()

  r.Handle("/api/private", myJwtMiddleware.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("This is a private endpoint"))
  })))

  http.ListenAndServe(":8080", r)
}

func getPemCert(token *jwt.Token) (string, error) {
  // Implementation to get the PEM certificate
}
  1. 在 React 项目中,使用 getAccessTokenSilently 方法获取访问令牌并将其添加到 API 请求的 Authorization 头部:
import React from "react";
import { useAuth0 } from "@auth0/auth0-react";
import axios from "axios";

const CallApi = () => {
  const { getAccessTokenSilently } = useAuth0();

  const callApi = async () => {
    try {
      const token = await getAccessTokenSilently();
      const response = await axios.get("http://localhost:8080/api/private", {
        headers: {
          Authorization: `Bearer ${token}`,
        },
      });

      console.log(response.data);
    } catch (error) {
      console.error(error);
    }
  };

  return <button onClick={callApi}>Call API</button>;
};

export default CallApi;

通过以上步骤,您可以将 Auth0 集成到 React 项目并与后端服务交互。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,在React,你需要使用 `axios` 或者 `fetch` 等库来发起 AJAX 请求。 1. 安装 `axios` 库 在终端运行以下命令来安装 `axios` 库: ``` npm install axios ``` 2. 发起 AJAX 请求 在 React 组件,你可以在表单提交时发起 AJAX 请求。例如: ```jsx import React, { useState } from 'react'; import axios from 'axios'; function Form() { const [formData, setFormData] = useState({ name: '', email: '', message: '' }); const handleSubmit = async (e) => { e.preventDefault(); try { const response = await axios.post('/api/contact', formData); console.log(response.data); } catch (err) { console.error(err); } } const handleChange = (e) => { setFormData({ ...formData, [e.target.name]: e.target.value }); } return ( <form onSubmit={handleSubmit}> <div> <label htmlFor="name">Name:</label> <input type="text" name="name" id="name" value={formData.name} onChange={handleChange} /> </div> <div> <label htmlFor="email">Email:</label> <input type="email" name="email" id="email" value={formData.email} onChange={handleChange} /> </div> <div> <label htmlFor="message">Message:</label> <textarea name="message" id="message" value={formData.message} onChange={handleChange}></textarea> </div> <button type="submit">Submit</button> </form> ); } export default Form; ``` 这里我们定义了一个表单组件,其包含 `name`,`email` 和 `message` 三个表单项。在 `handleSubmit` 函数,我们使用 `axios.post` 发起 POST 请求,将表单数据作为请求体传递给后端 `/api/contact` 接口。如果请求成功,我们在控制台打印服务器返回的数据。 3. 处理后端请求 在后端,你需要使用一个路由处理 POST 请求,并将表单数据存储到数据库。例如,如果你使用 Node.js 和 Express 构建后端,可以使用以下代码: ```javascript const express = require('express'); const bodyParser = require('body-parser'); const app = express(); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); app.post('/api/contact', (req, res) => { const { name, email, message } = req.body; // 这里可以连接数据库,将表单数据存储到数据库 // ... res.status(200).json({ success: true }); }); app.listen(3000, () => console.log('Server is running on port 3000')); ``` 这里我们使用 `body-parser` 间件来解析请求体JSON 数据。在 `/api/contact` 路由,我们从请求体获取表单数据,并将其存储到数据库。如果存储成功,我们返回一个包含 `success: true` 的 JSON 响应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值