如何从身份验证器重定向到外部身份验证端点?

2023-12-13

我正在编写一个网络应用程序,由于不同客户的需求,我希望拥有灵活的身份验证选项。我用的是官方的cakephp/身份验证库,但它没有 OpenID Connect 身份验证器,所以我正在滚动自己的。

我遇到的问题是我无法返回修改后的Cake\Http\Response带有来自我的身份验证器的重定向标头的对象。AuthenticatorInterface需要authenticate()方法返回一个Result目的。我希望不必修改比 Authenticator 类更多的内容,因为如果我只是要重写它的流程,它就违背了使用该库的目的。

class OidcAuthenticator extends AbstractAuthenticator
{
public function authenticate(ServerRequestInterface $request, ResponseInterface $response)
{
    // non-pertinent code removed for brevity
    return $this->_requestAuthorization($request, $response);
}


private function _requestAuthorization(ServerRequestInterface $request, ResponseInterface $response)
{
    $auth_endpoint = $this->getConfig('authorization_endpoint');
    $response_type = 'code';
    $state = $this->_setState($request, Security::randomString());

    $auth_params = [
        'response_type' => $response_type,
        'redirect_uri' => 'http://localhost:8080/',
        'client_id' => $this->getConfig('client_id'),
        'nonce' => $nonce,
        'state' => $state,
        'scope' => 'openid'
    ];

    $auth_endpoint .= (strpos($auth_endpoint, '?') === false ? '?' : '&') .
        http_build_query($auth_params, null, '&');

    /* What I want to return */
    $response = $response->withHeader('Location', $auth_endpoint);

    /* What I have to return */
    return new Result(null, Result::FAILURE_MISSING_CREDENTIALS);
}
}

我可以让这个工作与

$request->getAttribute('session')->close();
header('Location: ' . $auth_endpoint, true, 302);
exit();

但这似乎违反了 CakePHP 约定。理想情况下,我可以将新的响应对象嵌入到结果中,身份验证中间件将捕获它并发出它,而不是UnauthenticatedException。这是一个最佳实践问题,但希望它对于 SO 来说足够具体。

TL;DR:当无法将响应对象返回到中间件队列时如何重定向?


AFAICT 目前还没有真正推荐的做法,可能值得提出一个问题在 GitHub 上为了澄清。

你可以利用AuthenticationRequiredException (or UnauthorizedException在早期版本中),它与无状态身份验证有点纠缠在一起,但没有什么可以阻止您使用它。与无状态验证器不同,您必须将其放入authenticate()方法调用流程,大概是这样的:

private function _requestAuthorization(
    ServerRequestInterface $request,
    ResponseInterface $response
) {
    // ...

    $headers = [
        'Location' => $auth_endpoint
    ];
    $body = null;
    $statusCode = 302;

    // in CakePHP 4.x / Authentication 2.x
    throw new \Authentication\Authenticator\AuthenticationRequiredException (
        $headers,
        $body,
        $statusCode
    );

    // in CakePHP 3.x / Authentication 1.x
    throw new \Authentication\Authenticator\UnauthorizedException(
        $headers,
        $body,
        $statusCode
    );
}

然后这将在AuthenticationMiddleware::__invoke()相应地,响应将被修改并返回。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从身份验证器重定向到外部身份验证端点? 的相关文章

  • 具有“日期之间”的 CakePHP 模型

    我有一个很大的数据集 超过十亿行 数据在数据库中按日期分区 因此 我的查询工具必须在每个查询上指定一个 SQL Between 子句 否则它将必须扫描每个分区 而且 它会在返回之前超时 所以 我的问题是 分区的数据库中的字段是日期 使用 C
  • 如何检查用户是否使用 FB SDK 4.0 for Android 登录?

    几天前 我在我的应用程序中实现了 FB Login 今天我发现我实现的大部分内容现在都已弃用 之前我用的是Session查看用户是否已登录 但是 这不适用于新的 SDK 根据他们的文档 我们可以使用AccessToken getCurren
  • ASP.NET Web 应用程序中的身份验证遇到问题

    我正在尝试对从登录页面登录我的 Web 应用程序的用户进行身份验证 我正在使用本教程 http support microsoft com kb 301240作为指南 它几乎准确地解释了我希望做什么 但是当我输入用户名和密码时 验证不起作用
  • web.config 授权是否适用于 aspx 以外的文件?

    我有带有表单身份验证的 ASP NET 应用程序 它运行良好 但我有一个包含 olly txt 文件 无 aspx 文件 的目录 我希望用户不要访问该目录 或仅登录用户 我将 web config 添加到该目录
  • 为什么authentication:'plain'是rails中actionmailer的默认设置(使用gmail smtp)?

    我正在阅读Rails 的actionmailer 我的问题是关于所述的默认设置here http guides rubyonrails org action mailer basics html action mailer configur
  • Google API 令牌端点 POST 返回错误请求 400

    我正在尝试用一次性 Google Plus 授权代码换取访问令牌 但我不断收到 400 Bad Request 我正在使用VB NET 这是代码 We should now have a good one time authorizatio
  • cakephp auth->admin 的登录重定向

    我对 cakePHP 相当陌生 并且已经阅读了蛋糕网站上的所有教程 我正在使用 cake 2 1 构建一个小型示例应用程序 但遇到了问题 基本上 我希望管理员用户在登录时重定向到与普通用户重定向到的页面不同的页面 我确信有一个简单的方法可以
  • 如何使用Ext.Ajax登录Spring Security?

    我正在使用 Extjs 6 和 Spring 4 开发一个应用程序 我的应用程序是 Restful 我启用 CORS Origin 如下所示 public class CorsFilter extends OncePerRequestFil
  • CakePHP 中的 hasMan 简化为 hasOne

    基本上我在 CakePHP 中有以下模型 User id username Photo id user id path 我已经建立了以下关系 用户有很多照片 在一个屏幕上 我想列出用户 并在每个用户旁边显示随机照片 我尝试建立以下关系 用户
  • 如何使用 HttpClient 验证 Pardot API

    我花了大约一天的时间尝试对 Pardot API 进行身份验证 它不喜欢我尝试发布消息正文的方式 所以我想发布对我有用的解决方案 如果您有任何建议或替代方案 我想听听 ServicePointManager SecurityProtocol
  • 使用 C# 使用证书进行 SSL 客户端身份验证

    我需要创建一个 C 应用程序 该应用程序必须使用 SSL 向服务器发送 API 请求 我需要创建客户端身份验证 我已经拥有服务器 CA 证书 客户端证书 cer 客户端私钥 pem 和密码 我找不到有关如何创建客户端连接的示例 有人可以建议
  • 使用 https 的 Web 服务身份验证给出错误

    我编写了一个简单的 Web 服务 并使用摘要和 HTTPS 身份验证来保护它 我已经使用 Java 中的 keytool 生成了我的证书 当我通过创建 war 文件在 Tomcat 中部署 Web 服务时 axis 的欢迎页面正确显示 但是
  • 身份验证在不应该返回“401(未经授权)”时返回

    我第一次设置身份验证功能 在用户登录后得到了一些意外的结果 一位同事给了我一个具有工作身份验证的应用程序 以模仿我的应用程序 看起来我所做的一切都是正确的 我在前端使用 AngularJS 在后端框架使用 SailsJS 并且护照JS ht
  • Facebook 身份验证无需重定向?

    有没有办法在不重定向的情况下使用 facebook 身份验证 OAuth 2 0 我没有使用 facebook 登录按钮 所以我应该重定向到https www facebook com dialog oauth https www face
  • 验证域用户凭据

    我需要一种方法来验证 Windows 上本机 C 的用户 密码对 输入的是用户名和密码 用户可以是 DOMAIN user 格式 基本上我需要编写一个函数 如果用户 密码是有效的本地帐户 则返回 true 第1部分 如果用户 密码在给定的域
  • 使用 OWIN 自托管 WebApi 进行声明身份验证

    我使用以下配置自托管 WebApi Visual Studio 2012 NET 4 0 public void Configuration IAppBuilder appBuilder var config new HttpConfigu
  • 如何在 Cakephp 3 中创建按字段集分组的多个复选框

    我在阅读本文档时遇到问题 Cakephp3 Cookbook 表单 创建选择选择器 http book cakephp org 3 0 en views helpers form html creating select pickers我尝
  • 为什么当尝试使用 $this->data 访问 CakePHP 时,密码字段为空?

    我正在实现一个身份验证组件 这是我的注册页面 create User array action gt login echo form gt input primary email array size gt 32 echo form gt
  • 仅在 Tomcat Web 应用程序上为表单登录设置 SSL

    我是否可以将 Tomcat 或我的 web 应用程序 如果这样做 设置为需要 SSL 来保证内置基于表单的登录机制的机密性 即保护用户凭据 并使用标准 http 进行任何其他交易 您可以将登录表单放在自己的目录中 并且只需对该目录要求 SS
  • 使用 C# 以编程方式登录网站

    因此 我一直在网上搜索 试图了解有关如何使用 C 以编程方式登录网站的更多信息 我不想使用网络客户端 我想我想使用 HttpWebRequest 和 HttpWebResponse 之类的东西 但我不知道这些类是如何工作的 我想我正在寻找某

随机推荐

  • 如何在qml中使用roboto Thin字体

    我正在尝试在 Linux 的 QML 中使用机器人细字体 我已经在 ubuntu 上安装了粗体 细体和浅体字体 其他程序 例如 openoffice 仅向我显示 roboto 我如何在 qml 中使用 roboto Thin 或 Light
  • 使用 gmail smtp 服务器发送电子邮件时 smtp.gmail.com 与 ssl://smtp.gmail.com

    根据this Gmail SMTP 服务器也可用于中继来自您的邮件 设备或应用程序 您可以使用以下方式连接到 Gmail 邮件服务器 SMTP SSL TLS 如果您使用 SMTP 连接 则只能将邮件发送至 Gmail 或 Google A
  • 如何在 JavaScript 中模拟或非门?

    有谁知道在 JavaScript 中模拟 NOR 门的方法吗 https en wikipedia org wiki NOR gate 从我到目前为止所看到的来看 该语言只有 AND 和 OR 那么最简单的方法 a b
  • 如何在 coredata 上下文中使用预填充的数据库

    这是我的第一个问题 好吧 我正在开发一个将使用 coredata 的 iPhone 应用程序 但没有将数据插入应用程序数据库的选项 我想知道如何预先填充它的数据库 我想创建一个包含所有信息的 plist 并创建一个函数 如果数据库尚未设置
  • PHP多维数组通过键获取值

    我有一个多数组 例如 a array key gt array sub key gt val dif key gt array key gt array sub key gt val 我的真实数组非常大 并且键都位于不同的位置 我已经开始编
  • 用自己的函数变换 mpl 向量

    我想将每个元素相乘mpl vector by an int 首先 一个元函数来乘以int 与int template
  • 如何使用 JavaScript 创建唯一 ID?

    我有一个表单 用户可以在其中为多个城市添加多个选择框 问题是每个新生成的选择框都需要有一个唯一的 id 这可以用 JavaScript 完成吗 这是选择城市的表格部分 另请注意 当选择特定州时 我使用一些 PHP 来填充城市
  • 如何调试错误:需要左值作为赋值的左操作数?

    我正在 Linux 上使用 gcc 编译器编译 c 程序 但是 我收到了显示为 错误 需要左值作为赋值的左操作数 的错误 该错误是由如下所示的代码行引起的 socklen t saddr size data2 ssize 我可以知道如何调试
  • 在 Jetty 中设置最大 URL 长度

    我查看并发现一些人在 Jetty 中遇到 GET 请求 URL 超过最大长度问题的答案是 将 jetty xml 中的 headerBufferSize 设置为更大的数字 如下所示本 Solr 故障排除手册 and this 但是 我很难理
  • 在 R 数据框中查找列值遵循序列的行

    我有一个如下数据框 它是分类器的输出 col1 class 123 2 122 5 124 7 125 9 126 15 127 2 128 19 129 5 130 7 179 9 180 3 我想找到具有特定类模式的行 例如类位于 se
  • 为什么我的IP地址以192开头?

    我来自非网络背景 我突然想知道为什么我工作的公司几乎都是 192 168 x x 这样的 ip 为什么他们不能有像 1 2 3 4 这样的东西 我知道ip有一个概念 叫做子网划分 此外 192 168 0 0 至 192 168 255 2
  • 有没有简单的方法可以在 JPanel 上画一个圆?

    我在使用 drawOval x y width height 方法时遇到问题 该方法假设 x 和 y 值代表 要绘制的椭圆形的左上角 的坐标 javadoc 我希望 x 和 y 值代表中心点一个圆圈 我该怎么做呢 谢谢 如果您提前声明了宽度
  • 通过对另外两个数组的所有元素应用二元运算来在 Swift 中创建数组

    Swift 中是否有一种通过对另外两个数组的元素应用二元运算来创建数组的简洁方法 例如 let a 1 2 3 let b 4 5 6 let c 0 lt 3 map a 0 b 0 c 5 7 9 如果你使用zip要组合元素 您可以参考
  • 精确浮点计算两个乘积的和与差

    两个乘积之差和两个乘积之和是在各种常见计算中发现的两个原语 diff of products a b c d ab cd 和 sum of products a b c d ab cd 是密切相关的伴随函数 仅部分操作数的符号不同 使用这些
  • 如何用C#发送彩信

    我需要通过 C 应用程序发送彩信 我已经发现了 2 个有趣的组件 http www winwap com http www nowsms com 有人有使用其他第三方组件的经验吗 有人可以解释一下我需要什么样的服务器来发送这些彩信吗 它是经
  • WCF ria 服务 SP1 超时已过期

    我的解决方案是 Silverlight 它使用 WCF RIA 服务 SP1 和实体框架 4 我在加载大尺寸数据时遇到问题 我收到此错误消息 System ServiceModel DomainServices Client DomainE
  • 同一 JPA 类的多个数据库支持

    我们的项目使用 MYSQL 和 Hibernate JPA用于将对象持久保存在数据库中 我们有多个具有相似代码的类 Entity Table name users class Users implement Serializable Id
  • 当出现 E_USER_DEPRECATED 级别错误时如何运行 Behat 测试

    我有一个 Symfony 2 7 表单类型 它导致了一些级别错误E USER DEPRECATED 这个错误不是来自我自己的代码 而是来自vendor symfony symfony src Symfony Bridge Doctrine
  • Python套接字模块:如何更改客户端的本地端口?

    我想使用 TCP IP 作为客户端从网络获取包 With connect TCP IP TCP PORT 我可以更改对等地址的端口 但是我改变了本地计算机的端口 编辑 我想使用带有四个端口的网卡 网卡连接到发送大量数据的测量设备 我如何查看
  • 如何从身份验证器重定向到外部身份验证端点?

    我正在编写一个网络应用程序 由于不同客户的需求 我希望拥有灵活的身份验证选项 我用的是官方的cakephp 身份验证库 但它没有 OpenID Connect 身份验证器 所以我正在滚动自己的 我遇到的问题是我无法返回修改后的Cake Ht