使用Okta的单点登录保护您的Vert.x服务器

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。

Vert.x是Spring生态系统中增长最快的元素之一,保护Vert.x服务器可能是一个挑战。 部署Okta可以让您向服务器添加安全的单点登录,同时还可以授予您访问有关用户的大量信息的权限。 本教程将指导您站起一个新的Vert.x服务器,并将其与Okta集成以进行安全的用户管理。

三步OAuth流程快速回顾

此示例将使用称为三足流(单点登录的实质)的第三方提供程序OAuth流。 在开始编写代码之前,简要回顾一下此过程可能会有所帮助。

问题

我是Web服务器,我想保护我的网站并要求用户登录。但是,编写,维护和管理用户身份是很多工作。

解决方案

让别人来处理它。 为此,我(Web服务器),我的用户(可能在Web浏览器上)以及为我处理auth的人(在此示例中为Okta)之间需要一些合作。 这三个合作的参与者是三腿OAuth流的三个“腿”。 他们经历的过程是三向握手:

  1. 用户的浏览器向我的Web服务器请求受保护的资源
  2. 我(Web服务器)决定用户首先需要登录。 我拒绝处理请求,而是返回302重定向响应,告诉浏览器去访问Okta
  3. 浏览器遵从,而是访问Okta,然后用户登录。Okta然后返回其自己的302重定向,告诉浏览器返回并再次访问我…但是这次,携带密码
  4. 浏览器再次访问了我,但是这次我看到它带有此秘密代码。 现在,我直接打给Okta,将这个密码转换为有关用户的敏感信息,例如姓名,电子邮件地址或电话号码

完成此示例后,上述握手将在幕后发生。 Vert.x提供了一个方便的OAuth库来为您完成整个过程-您所需要做的就是对其进行配置并进行适当的注册。 这就是本教程演示的内容。

作为入门指南,本文假定仅基本熟悉Java和一些Java要素,例如Maven。 如果您已经在运行Vert.x服务器,请随时快速了解相关内容:您将在“ 配置Vert.x OAuth处理程序”部分中与Okta集成。

完整的代码示例(包括imports和pom.xml)可以在Github上找到。

启动新的Vert.x服务器

要开始工作,请访问Vert.x Starter页面并生成一个新项目。 对于本教程,您可以保留所有默认值,并包括Vert.x WebOAuthVert.x Config依赖项:

单击本地生成,下载和解压缩后,您应该看到以下简单目录结构:

demo目录中使用mvn compile exec:java运行时,应在端口8080上启动服务器:

在浏览器中访问http://localhost:8080将返回令人放心的hello world响应:

在这一点上,下一步是在继续添加身份验证之前切换到https。 但是,为了使本教程简短而集中,将跳过该部分,并且示例将继续使用未加密的http服务器模式。

引入Vert.x配置

Vert.x提供了一个通用的配置库,尽管要比Spring设置更多的工作。 本示例将使用一些配置值,因此您可以借此机会将Vert.x Config添加到项目中。 如果在创建启动程序项目时指定了Vert.x Config,则该依赖项应该已经存在于pom.xml

<dependency><groupId>io.vertx</groupId><artifactId>vertx-config</artifactId><version>${vertx.version}</version>
</dependency>

创建一个名为src/main/application.json的文件,并添加以下内容:

{"clientId": "{okta-client-id}","clientSecret": "{okta-client-secret}","issuer": "https://{yourOktaDomain}/oauth2/default","callbackUrl": "http://localhost:8080/login","port": 8080
}

您将很快更新这些值。 现在,在src/main/java/com/example/demo/MainVerticle.java ,将start()方法的内容替换为以下内容,这将加载配置。 请注意,完成后,它将调用一个尚不存在的名为startServer()的方法。 您将在下一节中添加它。

@Override
public void start() throws Exception {ConfigStoreOptions fileStore = new ConfigStoreOptions().setType("file").setConfig(new JsonObject().put("path", "src/main/application.json"));ConfigRetrieverOptions options = new ConfigRetrieverOptions().addStore(fileStore);ConfigRetriever retriever = ConfigRetriever.create(vertx, options);retriever.getConfig(ar -> {if (ar.failed()) {System.err.println("failed to retrieve config.");} else {config().mergeIn(ar.result());startServer();}});
}

整合Vert.x路由器

通过使用Vert.x路由器 ,您将能够轻松拦截对敏感端点的呼叫并强制进行预身份验证。 为此,您现在将在src/main/java/com/example/demo/MainVerticle.java实现startServer()方法:

void startServer() {Router router = Router.router(vertx);router.route("/private/secret").handler(ctx -> {ctx.response().end("Hi");});vertx.createHttpServer().requestHandler(router::accept).listen(config().getInteger("port"));
}

在上面的示例中,您已经在/private/secret创建了一个新端点,目的是尽快保护/private路径下的每个端点。 但首先,需要设置Vert.x OAuth处理程序。

创建Okta帐户并收集凭据

如果您还没有免费的Okta帐户,则可以按照以下说明创建一个帐户并设置您的第一个Okta应用程序。 您需要收集四个关键信息:

  • 客户编号-例如: oot9wrjjararhfaa
  • 客户机密-(保持机密!)
  • 发行者–例如: https : //dev-123123.oktapreview.com/oauth2/default…请确保包括/ oauth2 / default路径!
  • 回调网址-如果遵循上述说明,则为http:// localhost:8080 / login

现在可以在src/main/application.json文件中使用这些值。

配置Vert.x OAuth处理程序

Vert.x带有一个现成的OAuth管理器,可以与Okta作为身份提供者很好地集成在一起。 为了使内容整洁,您将在src/main/java/com/example/demo/MainVerticle.java中创建一个单独的工厂方法,该方法会生成已配置的OAuth处理程序。 将以下内容添加到MainVerticle类中,将下面的客户端信息替换为从Okta开发人员仪表板获得的帐户详细信息:

AuthHandler getOAuthHandler(Router router) {OAuth2Auth oauth2 = OAuth2Auth.create(vertx, OAuth2FlowType.AUTH_CODE, new OAuth2ClientOptions().setClientID(config().getString("clientId")).setClientSecret(config().getString("clientSecret")).setSite(config().getString("issuer")).setTokenPath("/v1/token").setAuthorizationPath("/v1/authorize").setUserInfoPath("/v1/userinfo").setUseBasicAuthorizationHeader(false));OAuth2AuthHandler authHandler = OAuth2AuthHandler.create(oauth2, config().getString("callbackUrl"));authHandler.extraParams(new JsonObject("{\"scope\":\"openid profile email\"}"));authHandler.setupCallback(router.route());return authHandler;
}

在上面的示例中,请注意三个请求的范围: openidprofileemail 。 将来的帖子将探讨其他范围和授权级别,但是目前,这三个将提供绝对必要的条件(例如用户名和电子邮件地址)。 使用电子邮件地址,您还可以直接查询Okta的API以获取有关用户的其他信息,并执行帐户管理任务。

拦截并授权受保护的端点

现在已经准备好AuthHandler ,它需要在对任何受保护端点的请求处理之前并验证用户身份。 通过使用通配符将其注册为/private/下所有路径的顶级处理程序,只需为您将来可能创建的所有处理程序处理一次即可。 然后可以保证/private/路径下的任何请求处理程序都将确保,在调用该请求处理程序时,它将仅来自经过正确身份验证的用户。

如下所示更改MainVerticle类的startServer()方法,以生成并注册处理程序:

public void startServer() {Router router = Router.router(vertx);//create and register the auth handler to intercept all//requests below the /private/ URI:AuthHandler authHandler = getOAuthHandler(router);router.route("/private/*").handler(authHandler);router.route("/private/secret").handler(ctx -> {ctx.response().end("Hi");});vertx.createHttpServer().requestHandler(router::accept).listen(config().getString(“port”));
}

这将是重新启动服务器并确保一切正常运行的绝佳时机。 通过再次运行mvn compile java:exec并从浏览器中访问http://localhost:8080/private/secret ,您现在应该被自动重定向到Okta的登录页面。 登录后,应将您重定向回您的站点,以继续响应原始的/private/secret请求。

从JWT提取用户信息

现在,您的/private/ API的调用者已登录,接下来您需要的是他们的信息。 它以JSON Web令牌的形式提供,必须将其提取并解码。 Vert.x OAuth处理程序将其隐藏为名为Principal的字符串化JSON对象的命名成员,该对象本身是上下文用户对象的组成部分。 然后使用您选择的JWT库对该编码的令牌进行解码和验证。 本示例使用Okta的JWT验证程序库 。

access_tokenid_token均可用,但是本教程将仅解码id_token 。 如果需要,还有一个类似的函数可以对access_token进行解码。 为此,请在pom.xml包含Okta JWT lib依赖项:

<dependency><groupId>com.okta.jwt</groupId><artifactId>okta-jwt-verifier</artifactId><version>0.2.0</version>
</dependency>

…并将以下新函数添加到MainVertical类中:

Map<String, Object> getIdClaims(RoutingContext ctx) {try {JwtVerifier jwtVerifier = new JwtHelper().setIssuerUrl(config().getString(“issuer”)).setAudience("api://default").setClientId(config().getString("clientId")).build();Jwt idTokenJwt = jwtVerifier.decodeIdToken(ctx.user().principal().getString("id_token"), null);return idTokenJwt.getClaims();} catch (Exception e) {//do something with the exception...return new HashMap<>();}
}

就是这样! 现在,您可以在请求处理程序中访问用户信息。 为了演示,可以对/private/secret处理程序进行更新以从JWT检索声明,如下所示:

void startServer() {Router router = Router.router(vertx);AuthHandler authHandler = getOAuthHandler(router);router.route("/private/*").handler(authHandler);router.route("/private/secret").handler(ctx -> {Map claims = getIdClaims(ctx);ctx.response().end("Hi " +claims.get("name") +", the email address we have on file for you is: "+claims.get("email"));});vertx.createHttpServer().requestHandler(router::accept).listen(config().getString(“port”));
}

经过最后的更改,重新启动服务器并再次点击http://localhost:8080/private/secret ,您的浏览器现在应该显示一条消息,其中包含您已通过身份验证的用户信息!

步步高升

恭喜,您现在拥有一台高性能的Vert.x服务器,受到Okta先进的安全性和身份管理保护! Okta提供了Java SDK,用于进一步与用户和帐户进行交互,包括向用户添加自定义数据和属性。

感谢您的阅读,并且一如既往,请在下面的评论中向我们提问。 我们希望您在Twitter @OktaDev上关注我们,或者从我们的博客中Java内容:

  • Spring Security 5.0和OIDC入门
  • 使用Spring Boot和React进行Bootiful开发
  • 使用Kong Gateway集中身份验证
  • 使用Angular 5.0和Spring Boot 2.0构建基本的CRUD应用
  • 使用Spring Boot和OAuth保护您的SPA

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。

使用Okta将Single Sign-on添加到您的Vert.x Server最初于2018年1月11日发布在Okta开发人员博客上。

翻译自: https://www.javacodegeeks.com/2018/03/secure-vert-x-server-single-sign-okta.html

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

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

相关文章

Apache Kafka简介

什么是Apache Kafka&#xff1f; Apache Kafka是一个分布式流系统&#xff0c;具有发布和订阅记录流的功能。 在另一方面&#xff0c;它是企业消息传递系统。 它是一个快速&#xff0c;水平可扩展和容错的系统。 Kafka有四个核心API&#xff0c; 生产者API&#xff1a; 该API允…

oracle查看存储过程最近编译,Oracle恢复被误编译覆盖的存储过程

同事在写Oracle存储过程时候&#xff0c;是在以前已经写好的过程基础上修改的&#xff0c;想换个名字&#xff0c;由于疏忽没有改名字就编译了&#xff0c;编译完才意识到。这时原来的那个已经没有了。找我想办法恢复回原来的那个过程。通过查资料想到个方法&#xff0c;也不知…

oracle安装 redo log file,Oracle Dump Redo Log File 说明

关于Dump redo log 的示例&#xff0c;MOS 上的文档&#xff1a;[ID 1031381.6] 有详细说明。Dump 有两种方式&#xff1a;(1)使用一. dump redo 说明关于Dump redo log 的示例&#xff0c;MOS 上的文档&#xff1a;[ID 1031381.6] 有详细说明。Dump 有两种方式&#xff1a;(1)…

unity 飞机 残骸模型_训练残骸模式– Java 8中的改进实现

unity 飞机 残骸模型Venkat Subramaniam在今天的演讲中提到了有关“级联方法”模式或“火车残骸”模式的内容&#xff0c;如下所示&#xff1a; >someObject.method1().method2().method3().finalResult()很少有人会将此与构建器模式相关联&#xff0c;但事实并非如此。 无…

datastage配置oracle,IBM Datastage8.5配置问题

大家好&#xff0c;最近因学习需要&#xff0c;在虚拟机REHL5.5上安装了IBM Datastage8.5的服务器端&#xff0c;在windows端安装客户端&#xff0c;调试连接时&#xff0c;提示密码不正确&#xff0c;我修改了密码&#xff0c;重启了服务器&#xff0c;还是提示密码不正确&…

使用Spring @Transactional进行数据源路由

卡尔帕帕&#xff08;Carl Papa&#xff09;在Spring框架中使用方面来确定要使用的DataSource &#xff08;读写或只读&#xff09;启发了我。 所以&#xff0c;我正在写这篇文章。 我必须承认&#xff0c;我对Spring的AbstractRoutingDataSource早已熟悉。 但是我不知道在哪里…

linux设置新硬盘权限,Linux 下挂载新硬盘以及更改为普通权限

1、启动终端&#xff0c;以root用户登录2、查看硬盘信息&#xff1a;#fdisk -l3、进入磁盘&#xff0c;对磁盘进行分区&#xff1a;#fdisk /dev/sda(注意看你要挂载哪一个磁盘&#xff0c;我的是sda&#xff0c;有的是sdb)4、格式化分区&#xff1a;#mkfs.ext3 /dev/sda1 //注&…

使用Payara Micro的Easy Java EE Microservices

想知道如何开始使用Java EE Microservices&#xff1f; 使用Java EE API只需很少的步骤即可部署微服务。 许多人认为Java EE无法与微服务一起使用&#xff0c;但事实并非如此……特别是如果您仅使用服务所需的Java EE规范。 在这篇简短的文章中&#xff0c;我将演示如何使用Jav…

linux终端lex程序运行,lex的简单使用

Lex & Flex 简介Lex是lexical compiler的缩写&#xff0c;是Unix环境下非常著名的工具&#xff0c; Lex (最早是埃里克施密特和 Mike Lesk 制作)是许多 UNIX 系统的标准词法分析器(lexical analyzer)产生程式&#xff0c;而且这个工具所作的行为被详列为 POSIX 标准的一部分…

Linux内存page,Linux虚拟内存管理 - Page Table的作用

虚拟内存的作用&#xff1a;1.扩展实际有限的物理内存&#xff0c;当然这种扩展是虚拟的&#xff0c;比如物理内存512M&#xff0c;对于一个需要1G空间的进程来说&#xff0c;照样可以运行。这增加了操作系统是应用范围。2.使得进程中的数据空间增大&#xff0c;增大到多少与硬…

openoffice+linux+jodconverter+乱码,OpenOffice安装和转换乱码解决方案

前言&#xff1a;OpenOffice项目中用途&#xff1a;word转换pdfWindows安装、转换&#xff1a;安装包下载后一路OK就可以正常安装&#xff0c;转换没有问题Linux安装、转换&#xff1a;安装有分DEB包和RPM包&#xff0c;下面会说明各自安装方法在en_US.UTF-8 系统环境下会出现乱…

junit 参数化测试用例_JUnit:在参数化测试中命名单个测试用例

junit 参数化测试用例几年前&#xff0c;我写了有关JUnit参数化测试的文章 。 我不喜欢它们的一件事是JUnit使用数字命名了单个测试用例&#xff0c;因此&#xff0c;如果它们失败&#xff0c;您将不知道是哪个测试参数导致了失败。 以下Eclipse屏幕快照将向您展示我的意思&…

MX250和第三方Linux版区别,MX250和MX350哪个好一点,区别和差距在哪里?求推荐?_科技数码通...

MX350系列显卡使笔记本颜值变得更高&#xff0c;性能更强&#xff0c;更轻便&#xff0c;在轻便笔记本需求变得越来越大&#xff0c;但性能也要求越来越高&#xff0c;特别是在图像处理方面&#xff0c;这个时候MX系列的显卡便应运而生&#xff0c;其拥有者超低的功耗&#xff…

linux r包默认安装位置,R-Language(R语言或称r-project)的安装

1、R语言的简介R语言(r-project)是主要用于统计分析、绘图的语言和操作环境。2、配置yum源2.1、安装说明由于编译安装相对繁琐&#xff0c;故而安装使用repoforge的源解决&#xff0c;免去编译的麻烦。注意&#xff1a;请根据实际的系统OS版本选取合适的YUM源。2.3、rpmforge源…

aws s3 命令行_通过命令行界面使用AWS ElasticMapReduce

aws s3 命令行在本文中&#xff0c;我将通过使用EMR的CLI使用AWS MapReduce服务&#xff08;称为ElasticMapReduce &#xff09;。 使用EMR的过程可以大致分为三个步骤&#xff1a; 设置并填充S3存储桶 创建并运行EMR作业 从S3存储桶中获取结果 在开始这三个高级步骤之前&…

在5分钟内将Spring Boot作为Windows服务启动

最近&#xff0c;我不得不将Spring Boot应用程序部署为Windows服务&#xff0c;并且对使用winsw如此容易感到惊讶。 我之前曾写过关于使用procrun – Java程序作为Windows服务的文章 &#xff0c;但是winsw更加容易 入门 Spring Boot文档的第59节是有关安装Spring Boot应用程序…

Android 画布画线,android实现一个简单的画布,可以用手指画线条。

满意答案wpdhc2016.07.05采纳率&#xff1a;49% 等级&#xff1a;7已帮助&#xff1a;359人public class DrawView extends View {Context mycontext;int toasttime 1000*60;boolean enabletoast true;//之前的坐标float preX;float preY;//路径private Path path;//画笔p…

设置html文字居中自动换行,CSS怎么设置文字自动换行?

CSS怎么设置文字自动换行&#xff1f;下面本篇文章就给大家介绍css设置文字(特别是连续的数字和英文)自动换行的方法。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你们有所帮助。关于换行问题&#xff0c;正常字符的换行是比较合理的&#xff0c;…

html霓虹灯效果图,HTML5 SVG+CSS3霓虹灯文字边框动画特效

【实例简介】【实例截图】【核心代码】使用SVG CSS实现动态霓虹灯文字效果#svgBox{[/b] width:100%;margin:100px auto;}.text{font-size: 64px;font-weight: bold;text-transform: uppercase;fill: none;stroke-width: 2px;stroke-dasharray: 90 310;animation: stroke 6s inf…

吉林省2021高考成绩排名查询,2021年吉林高考成绩排名查询系统,吉林高考位次排名表...

最近好多家长和考生留言&#xff0c;希望知道&#xff1a;吉林高考位次是什么&#xff1f;吉林高考位次与名次的区别&#xff1f;如何根据位次选大学&#xff1f;2020年吉林高考位次就是指考生高考成绩在全省同类考生中的位置。高考位次主要分为三大类&#xff1a;省市位次、区…