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

okta使用

“我喜欢编写身份验证和授权代码。” 〜从来没有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

okta使用

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

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

相关文章

Linux 命令之 make -- GNU的工程化编译工具

文章目录一、命令介绍二、常用选项三、命令示例&#xff08;一&#xff09;指定命令 make 的工作目录一、命令介绍 make 命令是 GNU 的工程化编译工具&#xff0c;用于编译众多相互关联的源代码文件&#xff0c;还可以编辑内核或模块&#xff0c;以实现工程化的管理&#xff0…

SDL2笔记

SDL2基本操作头文件主函数初始化创建窗口窗口暂停以及事件讲解销毁窗口(释放指针)并退出加载bmp图片新加载图片的方法(使用渲染、纹理)加载其他格式的图片头文件 #include "SDL.h" #include "SDL_image.h"主函数 int main(int argc,char* argv[]) //一定…

操作系统时间片轮换_《操作系统_时间片轮转RR进程调度算法》

转自:https://blog.csdn.net/houchaoqun_xmu/article/details/55540250时间片轮转RR进程调度算法一、概念介绍和案例解析时间片轮转法 - 基本原理&#xff1a;在早期的时间片轮转法中&#xff0c;系统将所有的就绪进程按先来先服务的原则排成一个队列&#xff0c;每次调度时&am…

java ee打印功能_Java EE 8的前5个新功能

java ee打印功能备受期待的Java Enterprise Edition 8版本具有两个令人兴奋的新API&#xff08;JSON绑定1.0和Java EE Security 1.0&#xff09;&#xff0c;并且对当前API进行了改进&#xff08;JAX-RS 2.1&#xff0c;Bean Validation 2.0&#xff0c;JSF 2.3&#xff0c;CDI…

SDL2事件笔记

SDL2事件窗口关闭的事件&#xff1a;鼠标事件鼠标点击事件鼠标移动事件键盘事件用SDL_PollEvent(&event)来检测是否有事件&#xff0c;用SDL_Event的实例属性event.type来获取事件。 窗口关闭的事件&#xff1a; SDL_QUIT鼠标事件 鼠标点击事件 鼠标点击事件&#xff1…

什么是复数

我们把形如 zabi&#xff08;a、b均为实数&#xff09;的数称为复数。其中&#xff0c;a 称为实部&#xff0c;b 称为虚部&#xff0c;i 称为虚数单位。当 z 的虚部 b&#xff1d;0 时&#xff0c;则 z 为实数&#xff1b;当 z 的虚部 b≠0 时&#xff0c;实部 a&#xff1d;0 …

qnx 设备驱动开发_QNX驱动开发——应用层与resource manger交互 | 学步园

QNX操作系统是一个类Unix实时操作系统&#xff0c;遵从POSIX规范&#xff0c;驱动程序具有良好的可移植性。编写任何驱动程序都会遇到同样的一个问题&#xff1a;应用程序与驱动程序之间是如何进行交互的。其实这个问题很简单&#xff0c;QNX有大量资料说明这一点。当客户端调用…

spring api层打包_Spring项目的按层打包已过时

spring api层打包我认为Spring应用程序不应该以逐层方法构造。 在我看来&#xff0c;按功能打包更有意义。 首先&#xff0c;让我简要描述每种方法。 “按层打包”&#xff08;在非Java世界中为“按类型折叠”&#xff09; 该项目结构根据源代码文件所属的体系结构层将其分为…

C++ Primer(第五版)第七章 类 部分答案

第七章 类练习7.2练习7.3练习7.4练习7.6练习7.7练习7.9练习7.14、7.15、7.22练习7.23、7.24、7.26练习7.27练习7.2 曾在 2.6.2 节的练习&#xff08;第 76 页&#xff09;中编写了一个 Sales_data类&#xff0c;请向这个类添加 combine 和 isbn 成员。 创建头文件sales.h #ifn…

arpanet(阿帕网)

“阿帕”&#xff08;ARPA&#xff09;&#xff0c;是美国高级研究计划署&#xff08;Advanced Research Project Agency&#xff09;的简称。他的核心机构之一是信息处理技术办公室&#xff08;IPTO Information Processing Techniques Office&#xff09;&#xff0c;一直在关…

mongodb数据库淘汰_mongodb 内存数据淘汰策略

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼About MongoMongoDB uses memory mapped files.This means the the operating system essentially controls what is paged in and out of memory (to and from disk).The RulesIf your indexes working set exceed memory, the l…

Markdown常用转义字符

如果字符无法正常输出&#xff0c;则在前面加\试试。 空格&#xff1a; 数学公式 数学公式要使用$$&#xff0c;需将公式放在两个$中间。 下标: _上标: ^分数&#xff1a;方法1&#xff1a;\frac{分子}{分母} 方法2&#xff1a;分子 \over 分母 对于\frac的方法…

互联网工程任务组(IETF)

国际互联网工程任务组&#xff08;The Internet Engineering Task Force&#xff0c;简称 IETF&#xff09;是一个公开性质的大型民间国际团体&#xff0c;汇集了与互联网架构和互联网顺利运作相关的网络设计者、运营者、投资人和研究人员&#xff0c;并欢迎所有对此行业感兴趣…

javafx 打印控件_Java的新视差控件(JavaFX)

javafx 打印控件介绍 视差是一种视觉效果&#xff0c;您可以组合以不同速度移动的两个分层图像以获得深度感。 想想一下&#xff0c;当您在道路上行驶时&#xff0c;您会看到附近的树木在快速移动&#xff0c;而距离较远的树木将沿同一方向移动但速度较慢&#xff0c;结果是您…

beoplay耳机序列号查询_BOSE耳机序列号如何查询?

展开全部 大多数序列号可在产品的背面或底部找到,一般位于条形码旁。e69da5e6ba903231313335323631343130323136353331333431363532序列号长度为 17 位(还有一些耳机是 4 位),可包含字母和数字。 另外,与 Bose Connect 应用程序兼容的产品将在应用程序的设置和gt; 产品信息下…

编译原理总概述笔记

编译原理编译原理程序设计语言分类翻译编译解释编译的转换过程两阶段的转换三阶段的转换编译程序的工作词法分析语法分析中间代码生成优化目标代码生成表格与表格管理出错处理语句翻译实例过程编写编译程序方式编译原理 是介绍高级程序设计语言变换成计算机硬件所能识别的机器…

RFC(一系列以编号排定的文件)

Request For Comments&#xff08;RFC&#xff09;&#xff0c;是一系列以编号排定的文件。文件收集了有关互联网相关信息&#xff0c;以及UNIX和互联网社区的软件文件。RFC文件是由Internet Society&#xff08;ISOC&#xff09;赞助发行。基本的互联网通信协议都有在RFC文件内…

deprecated_使用Java的@Deprecated前瞻

deprecated我偶尔会遇到一种情况&#xff0c;我需要引入新的API或构造以供其他人试用&#xff0c;但是我知道在使用某些API后&#xff0c;它可能会根据其他人的反馈而改变。 在这种情况下&#xff0c;我想以某种方式注释该构造&#xff0c;以警告其他开发人员此新添加的构造的暂…

fusionsphere的核心组件_FusionSphere架构详解

FusionSphere架构详解关键字&#xff1a;云计算XEN Hypervisor FusionSphere摘要&#xff1a;本技术案例主要针对Huawei FusionSphere云计算软件架构进行深入分析&#xff0c;总结概括出我们的FusionSphere云计算产品技术及课程内容中的关键点&#xff0c;为产品技术学习和云计…

将py文件打包成exe可执行文件

使用pyinstaller库即可将py文件打包成exe文件 安装pyinstaller库 pip install pyinstaller将py文件打包成exe文件 1.首先进入cmd&#xff0c;用cd命令定位到要打包的py文件所在的文件夹 2.使用以下命令打包py文件 pyintaller -F xxx.py #xxx.py就是要打包的文件之后会生成…