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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NeRF 其二:Mip-NeRF

NeRF 其二&#xff1a;Mip-NeRF 1. 混叠图像中的混叠现象 2. 如何抗混叠3. NeRF 中的解决方案4. 圆锥台近似计算与集成位置编码4.1 圆锥台采样4.2 三维高斯逼近圆锥台4.3 集成位置编码 5. Mip-NeRF 与 NeRF 的比较5.1 位置编码与集成位置编码5.2 采样差异5.3 网络数量 Referenc…

力扣2182.构造限制重复的字符串

思路&#xff1a;先记录每个字符的出现次数&#xff0c;构建一个新字符串&#xff0c;从尾取字符&#xff0c;每取一个该字符个数-1&#xff0c;若该字符已经取到有repeatLimit个&#xff0c;则递归取次大的字符&#xff0c;并对应字符个数-1&#xff0c;若没有次大字符了&…

漏洞复现-nginxWebUI runCmd前台远程命令执行漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

TDA4VM,SBL启动

文章目录 参考make BOARD=j721e_evm CORE=mcu1_0 BUILD_PROFILE=release pdk_libs -sj参考:https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1201734/tda4vm-error-while-loading-shared-libraries-libtinfo-so-5-for-building-sdl-in-sdk-0805

【Flutter 开发实战】Dart 基础篇:List 详解

嗨&#xff0c;各位朋友们&#xff0c;欢迎来到这篇博客&#xff01;今天我们将一起踏入 Dart 语言的神奇世界&#xff0c;深入了解 Dart 中的 List 类型。不用担心&#xff0c;我会尽可能用最通俗易懂的语言&#xff0c;让你对 List 有一个更深刻的理解。 Dart 中的 List Li…

机器学习算法理论:线性回归

线性回归 回归的理论解释&#xff1a;回归分析是确定两种或两种以上变数间相互依赖的定量关系的一种统计分析方法。按照自变量和因变量之间的关系类型&#xff0c;可分为线性回归分析和非线性回归分析。 如果在回归分析中&#xff0c;只包括一个自变量和一个因变量&#xff0c;…

跟着cherno手搓游戏引擎【5】layer(层)、Glad

编写基类层&#xff1a; Layer.h:提供Attach链接、Detach解绑、Update刷新、Event事件、GetName方法 #pragma once #include"YOTO/Core.h" #include"YOTO/Event/Event.h" namespace YOTO {class YOTO_API Layer{public:Layer(const std::string& nam…

【软件测试】学习笔记-不同视角的软件性能与性能指标

本篇文章探讨新的测试主题&#xff1a;性能测试&#xff0c;因为性能测试的专业性很强&#xff0c;所以我会以从0到1的入门者视角&#xff0c;系统性地阐述性能测试的方法以及应用领域&#xff0c;用实例去诠释各种性能指标。 本篇文章站在全局的视角&#xff0c;帮你梳理软件性…

【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】

前言 大家好吖&#xff0c;欢迎来到 YY 滴C考前速过系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《…

统计学-R语言-4.2

文章目录 前言单变量数据的描述分析分类型数据频数表条形图饼图 数值型数据数值型数据数据的集中趋势--均值数据的集中趋势--众数 离散程度离散程度--极差离散程度--四分位数极差离散程度--方差离散程度--加权方差离散程度--标准差离散程度--变异系数 数据的形状数据的形状--偏…

RAG(检索增强生成 )

&#x1f4d1;前言 本文主要是【RAG】——RAG(检索增强生成 )的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句…

最新消息:OpenAI GPT Store 正式上线,GPTs 应用商店来了

OpenAI推出的两款新产品和服务&#xff1a;GPT Store和ChatGPT Team&#xff0c;提供了许多全新的解决方案和功能&#xff0c;旨在帮助用户更轻松地使用和构建GPT工具&#xff0c;同时也增加了公司的收入来源。GPT Store是一个全新的在线平台&#xff0c;允许用户创建和分享自定…

小程序基础学习(多插槽)

先创建插槽 定义多插槽的每一个插槽的属性 在js文件中启用多插槽 在页面使用多插槽 组件代码 <!--components/my-slots/my-slots.wxml--><view class"container"><view class"left"> <slot name"left" ></slot>&…

【DC快速上手教程--1 Setup the DC】

DC快速上手教程--1 Setup the DC 0 Intro1 DC Demo 本篇系列教程介绍总结DC Flow&#xff0c;为了不涉密&#xff0c;在这里以DC labs为Demo做一个入门的介绍&#xff1b;目标&#xff1a;用起来EDA 工具是最基础也是最简单的&#xff1b;重点是如何去分析报告&#xff0c;依据…

Jenkins集成Sonar Qube

下载插件 重启Jenkins 容器 sonarqube 使用令牌 Jenkins 配置 重新构建

Windows平台RTMP推送|轻量级RTSP服务录像模块如何支持中文路径?

技术背景 我们在做Windows平台RTMP推送、轻量级RTSP服务录像模块的时候&#xff0c;部分开发者抱怨路径无法设置中文&#xff0c;只能设置为英文。 以C#的接口为例&#xff0c;早期的设计如下&#xff1a; /** 设置本地录像目录, 必须是英文目录&#xff0c;否则会失败*/[DllI…

YOLOv5改进 | 注意力篇 | CGAttention实现级联群体注意力机制 (全网首发改进)

一、本文介绍 本文给大家带来的改进机制是实现级联群体注意力机制CascadedGroupAttention,其主要思想为增强输入到注意力头的特征的多样性。与以前的自注意力不同,它为每个头提供不同的输入分割,并跨头级联输出特征。这种方法不仅减少了多头注意力中的计算冗余,而且通过增…

Spring | Spring框架最基本核心的jar包、Spring的入门程序、依赖注入

目录&#xff1a; 1.Spring框架最基本、最核心的jar包2.Spring的入门程序3.依赖注入3.1 依赖注入的概念3.2 依赖注入的实现方式 1.Spring框架最基本、最核心的jar包 Spring是一个轻量级框架&#xff0c;Spring最基本、最核心的的jar包括 : beans、context、core、expression。 …

Dobbo---分布式系统通信方式

通信方式 分布式系统通信方式1. RMIRMI 通信实现案例2. RPC常用RPC框架 分布式系统通信方式 1. RMI RMI ( Remote Method Invocation 远程方法调用) 图1.1 客户端-服务端通信方式 客户端将要调用的方法及参数&#xff0c;打包为辅助对象&#xff0c;通过网络socket&#xff…

AI-图片转换中国风动漫人物

&#x1f3e1; 个人主页&#xff1a;IT贫道-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;私聊博主加WX好友&#xff0c;获取更多资料哦~ &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. AI卡通秀原理 2. …