gpt4 book ai didi

java - 如何使用第二个身份验证因素来保护某些 REST 请求?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:04:31 25 4
gpt4 key购买 nike

我有资源服务(REST 服务)和其他一些使用资源服务的服务。

通过 OAuth 保护的资源服务。此外,一些请求必须受到通过短信发送的 OTP(一种类型的密码)的保护。

我知道如何生成代码并通过短信发送,但我不知道如何组织 Rest Controller 以及收到资源请求后要做什么。

例如:我们向 Controller/api/user 做 GET 请求。此时资源服务器向用户手机发送消息,接下来呢?

  • 我不能做另一个端点来获取 otp,然后使用 HTTP header 或请求正文发送它,因为其他服务必须不知道此代码。

如何正确组织这种互动?如何组织对 Rest Service 的这种保护?

我们使用 Spring。非常感谢您的任何建议。

最佳答案

好吧,你可以这样做:

  1. 使用动态路径创建 REST 服务。 /rest/some/service/unique-long-id
  2. 不要为此动态路径请求安全。
  3. 如果 unique-long-id 存在且未过期,则创建服务以检查并授予对资源服务的访问权限。
  4. 一旦用户发布 SMS 代码,仅为该用户重定向到此动态路径。

例子:

您发送短信密码:1234567890

REST 服务验证此 pin 码并将我重定向到

/rest/some/service/c83b5cf29d264ac7b86f27cc77af3f54979feefaf820edae36b2518a7e613385

如果此唯一代码有效,您将授予我访问资源服务的权限。如果不是,404 错误或 401 错误。

编辑:

实现您的要求的两种方式:

  • ServiceB 需要验证动态 ID 以授予对 /api/protectedResource/unique-long-id 的访问权限。

  • 使用 filters 拦截 ServiceB 的 URL (/api/protectedResource/unique-long-id)。如果它通过验证,则授予或拒绝对 protected 资源的访问权限。

在第一种情况下,ServiceA 生成代码并通知用户。 ServiceB 仅在使用动态 URL 发送有效 PIN 码时才提供访问权限:

看这个模拟:

var secretCode;

function generateCode(){
secretCode = parseInt(Math.random() * 100000000);
wrongCode = (secretCode+"").split("").reverse().join("");
$("#serviceA").val(secretCode);
$("#resource1").val("/api/protectedResource/" + wrongCode);
$("#resource1").attr("onclick", "getAccess('" + wrongCode + "', 'protectedResource1')");

$("#resource2").val("/api/protectedResource/" + secretCode);
$("#resource2").attr("onclick", "getAccess('" + secretCode + "', 'protectedResource2')");

$("#protectedResource1").val("");
$("#protectedResource2").val("");

}

function getAccess(code, id){
$("#" + id).val($("#serviceA").val() === code ? "Access granted" : "Access denied");
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>

ServiceA<br>
POST <input type="button" value="/api/user" onclick="generateCode()" /> Secret code: <input id="serviceA" type="text" value="" />

<br>
<br>
ServiceB<br>
Wrong-ID POST <input id="resource1" type="button" value="/api/protectedResource/-1" onclick="getAccess('-1', 'protectedResource1')" /> Response <input id="protectedResource1" type="text" readonly="true" value="" />
<br>
Correct-ID POST <input id="resource2" type="button" value="/api/protectedResource/-1" onclick="getAccess('1234567890', 'protectedResource2')" /> Response <input id="protectedResource2" type="text" readonly="true" value="" />

如果您需要帮助,我们可以打开聊天

关于java - 如何使用第二个身份验证因素来保护某些 REST 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41379472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com