Next.js 集成 Auth0 登入和自定义登入页面

news2024/9/25 1:16:41

Next.js 集成 Auth0 和自定义登入页面

      • 注册账号和基本配置
        • 进入 auth0 官网注册账号并登入
        • 进入控制台后访问 ` Applications/Applications`
        • 进入程序配置页面添加配置
      • 在 Next.js 使用
        • 在项目中集成
      • 通过 Auth0Lock 配置方式自定义登入页面
        • 效果展示
        • 实现过程

注册账号和基本配置

进入 auth0 官网注册账号并登入

Auth0: Secure access for everyone. But not just anyone.

进入控制台后访问 Applications/Applications

image.png

image.png

进入程序配置页面添加配置

创建完成后,会跳转到应用配置界面,如果不小心关闭,可以在 Applications 找到对应的程序并进入:
image.png
跳转后的程序配置页面:
image.png
下滑找到 **Application URIs **配置项:

  • 设置 Allowed Callback URLshttp://localhost:3000/api/auth/callback
  • 设置 Allowed Logout URLshttp://localhost:3000/

image.png

在 Next.js 使用

打开 Next.js 项目,安装 auth0 依赖:

npm install @auth0/nextjs-auth0

新建 .env.local 文件,并添加环境变量,auth0 会自定验证你配置的 env 文件

# A long secret value used to encrypt the session cookie.
# node -e "console.log(crypto.randomBytes(32).toString('hex'))"
AUTH0_SECRET='4d98dac96fb455a6003547a9ffb1e56239598789a5ed7eb1ec34d0834d00c71e'

# The base URL of your application
AUTH0_BASE_URL='http://localhost:3000'
# The URL of your Auth0 Application Domain (https://)
AUTH0_ISSUER_BASE_URL='https://dev-jkr****flrex.us.auth0.com'
# Your Auth0 application's Client ID
AUTH0_CLIENT_ID='pvYBK9T514********CEMaql12GhY'
#Your Auth0 application's Client Secret.
AUTH0_CLIENT_SECRET='gc2vtfBKqRKqWYdsZbteS1zXU1m7d_IJeEJs9E1cm7SUZgfbJeJNVZ6UMgunXqk0'

  • AUTH0_SECRET 是一个自定义密钥,理论上可以随意填写,但不建议,你可以通过终端使用下面命令生成一个32位的随机字符串,并拷贝到 .env.local 文件中
node -e "console.log(crypto.randomBytes(32).toString('hex'))"

image.png

  • AUTH0_BASE_URL 你开发的项目地址,Next.js 本地运行环境为3000端口, 所以这里设置为 http://localhost:3000
  • AUTH0_ISSUER_BASE_URL 对应在 auth0 创建的应用程序配置中的 Domain,参考下图, 注意在env文件配置时,开头需要加上 https://
  • AUTH0_CLIENT_ID 见下图,对应 Client ID
  • AUTH0_CLIENT_SECRET 见下图,对应 Client Secret

image.png

在项目中集成

Next.js 提供了详细文档和示例文件,帮助你快速集成 auth0,你可以下载示例文件,配置env 文件后快速体验

  • Auth0 Next.js SDK Quickstarts: Add Login to your Next.js application

image.png

根据提示配置:
image.png

其它参考链接:

  • Auth0 React SDK Quickstarts: Add Login to your React App

通过 Auth0Lock 配置方式自定义登入页面

效果展示

image.png

实现过程

登入 auth0 控制台后,进入 Branding/Universal Login 页面,下滑页面后找到 Advanced Options 选项,点击进入
image.png

进入后,默认会跳转到 Settings 选项页,不要看! 也别点击任何操作!这个页面完全就是混淆你的理解,且提供的两个模板都又丑又难改配置,设置个 logo 各种不符合要求,想设置个样式直接把你恶心死!

切换到 Login 选项页面:
image.png

然后我们愉快的写 HTML 文件就好了,终于——舒服了。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <title>Login - MontCache</title>
  <link rel="icon" href="https://www.montplex.com/favicon.ico" type="image/x-icon">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0" />
</head>
  <style>  
    body{
      margin: 0;
      padding: 0;
     
    }
    .auth0-lock.auth0-lock {
      font: inherit!important
    }

    .auth0-lock.auth0-lock .auth0-lock-center {
      font: inherit!important;
      padding: 0!important
    }

    .auth0-lock.auth0-lock .auth0-lock-header,.auth0-lock.auth0-lock .auth0-lock-terms {
      display: none!important
    }

    .auth0-lock.auth0-lock .auth0-lock-submit {
      padding: 2px!important;
      background: #111!important
    }

    .auth0-lock.auth0-lock .auth0-lock-submit .auth0-label-submit {
      display: inline-flex!important;
      align-items: center!important
    }

    .auth0-lock.auth0-lock .auth0-lock-submit span svg.icon-text {
      margin: 0 0 0 8px!important
    }

    .montcache-login-page {
      background-color: rgb(244 244 245);
      display: grid;
      min-height: 100vh;
      place-items: center;
      /*padding: 32px;*/
    }
    .montcache-login-page-logo {
      margin-bottom: 20px;
      display: flex;
      align-items: center;
      justify-content: center;
    }
    .montcache-login-page-privacy{
      margin-top: 24px;
      max-width: 640px;
      text-align: center;
      font-size: 14px;
    }
    .montcache-login-page-privacy p{
      color: rgb(63, 63, 70);
    }
    .montcache-login-page-privacy a{
      text-decoration-line: underline;
      color: rgb(63, 63, 70);
    }
    
    .montcache-login-page-privacy .alert{
      background-color: #fffbe6;
      border: 1px solid #ffe58f;
      margin-top:16px;
      box-sizing: border-box;
      padding: 8px 12px;
      font-size: 14px;
      line-height: 1.57;
      list-style: none;
      position: relative;
      display: flex;
      align-items: center;
      word-wrap: break-word;
      border-radius: 8px;
    }

  </style>
<body>
  
	<div class="montcache-login-page">
    <div>
      <div class="montcache-login-page-logo">
        <div style="display: flex; align-items: center;gap: 8px;">
		<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 256 256"><defs><linearGradient id="logosNextjsIcon0" x1="55.633%" x2="83.228%" y1="56.385%" y2="96.08%"><stop offset="0%" stop-color="#FFF"/><stop offset="100%" stop-color="#FFF" stop-opacity="0"/></linearGradient><linearGradient id="logosNextjsIcon1" x1="50%" x2="49.953%" y1="0%" y2="73.438%"><stop offset="0%" stop-color="#FFF"/><stop offset="100%" stop-color="#FFF" stop-opacity="0"/></linearGradient><circle id="logosNextjsIcon2" cx="128" cy="128" r="128"/></defs><mask id="logosNextjsIcon3" fill="#fff"><use href="#logosNextjsIcon2"/></mask><g mask="url(#logosNextjsIcon3)"><circle cx="128" cy="128" r="128"/><path fill="url(#logosNextjsIcon0)" d="M212.634 224.028L98.335 76.8H76.8v102.357h17.228V98.68L199.11 234.446a128.433 128.433 0 0 0 13.524-10.418"/><path fill="url(#logosNextjsIcon1)" d="M163.556 76.8h17.067v102.4h-17.067z"/></g></svg>
          <h3 style="font-size: 22px;">Next.js Auth0</h3>

        </div>
     
       
      </div>

      <div id="montcache-login-container"></div>
      <div class="montcache-login-page-privacy">
        <p style="color: rgb(63, 63, 70);">
          By clicking Log In, you agree to our
          <a
            href="/trust/terms.pdf"
            target="_blank"
            children="Terms of Service"
          >Terms of Service</a>
          and 
          <a
            href="/trust/privacy.pdf"
            target="_blank"
             >Privacy Policy</a>
          .
        </p>
        <div class="alert">
          <div style="color: rgba(124,45,18,.8);flex: 1;font-wight: 300;">
              We have recently made updates to our Terms of Service.<br>Please take a moment to review the changes that have been implemented.
            </div>
        </div>
      </div>
    </div>
  </div>
  <!--[if IE 8]>
  <script src="//cdnjs.cloudflare.com/ajax/libs/ie8/0.2.5/ie8.js"></script>
  <![endif]-->

  <!--[if lte IE 9]>
  <script src="https://cdn.auth0.com/js/base64.js"></script>
  <script src="https://cdn.auth0.com/js/es5-shim.min.js"></script>
  <![endif]-->

  <script src="https://cdn.auth0.com/js/lock/12.4/lock.min.js"></script>
  <script>
    // Decode utf8 characters properly
    var config = JSON.parse(decodeURIComponent(escape(window.atob('@@config@@'))));
    config.extraParams = config.extraParams || {};
    var connection = config.connection;
    var prompt = config.prompt;
    var languageDictionary;
    var language;

    if (config.dict && config.dict.signin && config.dict.signin.title) {
      languageDictionary = { title: config.dict.signin.title };
    } else if (typeof config.dict === 'string') {
      language = config.dict;
    }
    var loginHint = config.extraParams.login_hint;
    var colors = config.colors || {};

    // Available Lock configuration options: https://auth0.com/docs/libraries/lock/lock-configuration
    var lock = new Auth0Lock(config.clientID, config.auth0Domain, {
      auth: {
        redirectUrl: config.callbackURL,
        responseType: (config.internalOptions || {}).response_type ||
          (config.callbackOnLocationHash ? 'token' : 'code'),
        params: config.internalOptions
      },
      // 关闭输入账号密码后自动获取用户头像功能
      avatar: null,
      configurationBaseUrl: config.clientConfigurationBaseUrl,
      overrides: {
        __tenant: config.auth0Tenant,
        __token_issuer: config.authorizationServer.issuer
      },
      assetsUrl:  config.assetsUrl,
      container: 'montcache-login-container',
      allowedConnections: connection ? [connection] : null,
      rememberLastLogin: !prompt,
      language: language,
      languageBaseUrl: config.languageBaseUrl,
      languageDictionary: languageDictionary,
      theme: {
        primaryColor:    '#000'
      },
      prefill: loginHint ? { email: loginHint, username: loginHint } : null,
      closable: false,
      defaultADUsernameFromEmailPrefix: false
    });


		lock.show()
  </script>
</body>
</html>

配置参考🔗:

  • https://auth0.com/docs/libraries/lock/lock-configuration

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1380369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[C#]利用paddleocr进行表格识别

【官方框架地址】 https://github.com/PaddlePaddle/PaddleOCR.git 【算法介绍】 PaddleOCR表格识别是PaddlePaddle开源项目中的一个强大功能&#xff0c;它利用深度学习技术实现了对各类表格的高精度识别。PaddleOCR表格识别能够处理各种复杂的表格&#xff0c;包括但不限于…

CSS 下载进度条

<template><view class=btn>下载中</view></template><script></script><style>/* 设置整个页面的样式 */body {width: 100vw; /* 页面宽度为视口宽度 */background: #000000; /* 背景颜色为白色 */display: flex; /* 使用 flex…

通过 CMake 制作库文件 静态库 和 动态库

hehedalinux:~/Linux/loveDBTeacher-v2$ tree . ├── CMakeLists.txt ├── include │ └── head.h ├── main.c └── src├── add.c├── div.c├── mult.c└── sub.c CMake Calc 项目 在这里有add.c,div.c,mult.c,sub.c,main.c,head.h 二、生成静态库 …

Linux学习记录——사십이 高级IO(3)--- Poll型服务器

文章目录 1、认识poll接口2、实现3、特点 1、认识poll接口 #include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int timeout);// pollfd结构 struct pollfd {int fd; /* file descriptor */short events; /* requested events */short revents; /* returned…

三、电脑软件路径移动方式

一、电脑文件移动 当我们想整理硬盘或者移动软件时&#xff0c;常常会遇到多种多样的问题&#xff0c;下面就来说明一下我遇到的问题 1.桌面 解释&#xff1a;移动路径会导致桌面快捷方式失效&#xff0c;下面以图片解答如何恢复 原理&#xff1a;桌面快捷方式保存在C:\Users…

在Linux中创建文件的多种方法

目录 前言1 使用重定向符号 ">"2 使用文本编辑器 vi/vim3 使用 nano4 使用 echo5 使用 touch6 使用 printf7 使用 head8 使用 cat9 使用 tail10 使用 truncate结语 前言 在Linux系统中&#xff0c;文件的创建是日常操作中不可避免的一部分。无论是创建空文件、编…

AI手写数字识别(一)

使用Visual Studio Tools for AI加速桌面智能应用开发 主要知识点 典型的AI应用的代码结构和功能&#xff0c;如处理输入;使用Visual Studio Tools for AI进行TensorFlow模型到.Net Framework应用环境的快速集成。 简介 本文将介绍一例"手写数字识别应用"的开发过…

线性代数——行列式相关性质

目录 一、行列式与它的转置列行列式相等 二、对换行列式的两行&#xff08;列&#xff09;&#xff0c;行列式变号 三、行列式某行&#xff08;列&#xff09;有公因子k&#xff0c;则k可以提到行列式外 四、行列式中若两行成比例&#xff0c;则行列式为0 五、行列式的某一行…

使用FreeBASIC设计8051单片机汇编编译器

在STC论坛上看到有人用C语言实现8051汇编编译器&#xff08;源码&#xff09;&#xff0c;好奇下&#xff0c;试着用FB写了一下。 基本原理就是通过分析汇编文件然后转换为机器码。以下是51汇编与机器码对应的表格&#xff08;数据来自网络&#xff0c;如果发现有误请联系QQ149…

腾讯云添加SSL证书

一、进入腾讯云SSL证书&#xff1a; ssl证书控制台地址 选择“我的证书”&#xff0c;点击"申请免费证书" 2、填写域名和邮箱&#xff0c;点击“提交申请” 在此页面中会出现主机记录和记录值。 2、进入云解析 DNS&#xff1a;云解析DNS地址 进入我的解析-记录…

C#,入门教程(17)——条件语句(if-else)的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(16)——可变数据类型&#xff08;var&#xff09;的基础知识与使用禁忌https://blog.csdn.net/beijinghorn/article/details/124032216 程序的核心是逻辑。 逻辑的核心是布尔条件表达式。 逻辑的主要体现形式之一是 if-else 语句…

【文末送书】语义解析:连接自然语言与机器智能的桥梁

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

R语言【paleobioDB】——pbdb_collections():通过参数选择,返回多个采集号的基本信息

Package paleobioDB version 0.7.0 paleobioDB 包在2020年已经停止更新&#xff0c;该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后&#xff0c;执行本地安装。 Usage pbdb_collections (...) Arguments 参数【...…

2024趋势:ERP中数据分析的五大要点

2024 年&#xff0c;数据分析不仅仅是 ERP 实施中的一个额外功能;这就像第一步&#xff0c;将最终确定整个 ERP 实施项目的成功之路。忘记笨重的电子表格和无休止的报告——准备好驾驭这五种新兴趋势的浪潮&#xff1a; 一、人工智能和机器学习 (ML) 的兴起 人工智能驱动的数据…

PiflowX-DorisRead组件

DorisRead组件 组件说明 从Doris存储读取数据。 计算引擎 flink 有界性 目前Doris Source是有界流&#xff0c;不支持CDC方式读取。 组件分组 Doris 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许值是否必填描述…

java使用itext7实现html转pdf全代码完整示例

之前项目有个需求&#xff0c;系统实现自己的打印功能&#xff0c;基本上都是前端找了个框架搞的&#xff0c;我呢&#xff0c;就是配合处理一些前端不好处理的部分&#xff0c;但是新一期的需求评审中&#xff0c;前端提出了&#xff0c;前端自己生成pdf在数据量大的时候会很慢…

前端基础知识整理汇总(上)

HTML页面的生命周期 HTML页面的生命周期有以下三个重要事件&#xff1a; DOMContentLoaded —— 浏览器已经完全加载了 HTML&#xff0c;DOM 树已经构建完毕&#xff0c;但是像是 <img> 和样式表等外部资源可能并没有下载完毕。 load —— 浏览器已经加载了所有的资源&…

C语言宏定义小技巧

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、定义一年多少秒&#xff08;除闰年&#xff09;举例运行结果出现的问题原因 二、定义整型数据要避免的坑举例运行结果原因解决方法 三 、未完待续 前言 提…

商城小程序系统:数字化转型下的商机

近几年&#xff0c;电商行业不断发展&#xff0c;线上购物已经成为大众的重要选择。线上商超作为传统的商业购物模式&#xff0c;为带来更多的商机&#xff0c;也逐渐转向了线上电商模式&#xff0c;越来越多的商超企业开始搭建专属的商城小程序&#xff0c;为消费者提供方便快…

适用于动态 IT 环境的服务器流量监控软件

服务器在网络性能中起着至关重要的作用&#xff0c;这意味着保持其最佳容量至关重要。企业需要将 AI、ML 和云技术融入其 IT 中&#xff0c;从而提供充分的敏捷性、安全性和灵活性&#xff0c;在这方面&#xff0c;服务器流量监控已成为当务之急。通过定期监控通信、跟踪流量上…