pochocho / okta-saml-sso

Okta SAML SSO 对 Laravel 的支持

v2.0.0 2024-07-27 22:04 UTC

README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

本包提供了一种简单易用的 Okta SAML 登录实现方案。该包有助于接收 SAML 响应和获取

安装

composer require pochocho/okta-saml-sso

生成您的证书,如果您想生成自签名证书,可以按照以下示例命令执行

注意:默认情况下,此包期望证书和密钥位于项目目录的根目录下。请记住将这两个文件添加到 .gitignore

openssl req -x509 -newkey rsa:2048 -nodes -keyout oktasso.key -out oktasso.crt -days 365

创建和配置 Okta 应用程序

创建您的 Okta 应用程序,选择 SAML 2.0 作为登录方法。

在表单中,单一登录 URL 指的是 Okta 在认证成功后发送 POST 请求的应用程序中的 URL。

受众 URI 是您发布有关其 SAML 配置(元数据)的公共信息的 URL

默认 RelayState 是 Okta 在成功登录后重定向到的 URL。

在此表单中,您还可以设置 属性声明 并将其映射到配置文件字段。此包假定属性使用 snake_case 命名约定(例如 first_name、last_name、email 等)

配置应用程序后,访问“登录”选项卡,然后单击“查看 SAML 设置说明”,页面加载后下载证书文件,并将其放置在应用程序根目录中,命名为 idp.cert 重要:不要将此文件提交到版本控制

配置

以下值必须在您的 .env 中设置

OKTA_SIGNON_URL:您可以从 Okta 管理仪表板获取此值,转到 SAML 应用程序的“登录”选项卡,然后单击“查看 SAML 设置说明”按钮。使用“身份提供者单点登录 URL”值。

LOGIN_REDIRECT_ROUTE:这是您希望用户登录后重定向到的路由名称。

您还可以通过运行以下命令发布配置文件

php artisan vendor:publish --tag=okta-saml-sso

该包假定证书和密钥文件位于项目根目录下,命名为 oktasso.crt 和 oktasso.key

  • OKTA_CERTIFICATE_PATH 证书文件的路径
  • OKTA_KEY_PATH 密钥文件的路径
  • OKTA_ATTRIBUTE_STATEMENTS 以逗号分隔的属性声明列表,设置在 Okta 中(默认值:'first_name','last_name','email','groups'

如果您的应用程序不使用 User 模型进行身份验证,您可以在 env 中使用 OKTA_AUTHENTICATABLE_MODEL 键配置模型。

使用

提供

使用此包的最简单方法是使用提供的控制器。该包提供了两个控制器,一个用于使用加密,另一个用于不使用加密。要开始,请在 web.php 路由文件中注册路由

Route::post('/login', \Pochocho\OktaSamlSso\Http\Controllers\EncryptedLoginController::class)->name('login');

注意:由于 Okta 在认证完成后向应用程序发送 post 请求,因此我们需要忽略登录路由的 csrf 验证。您可以通过向应用程序的 VerifyCsrfToken 中间件中添加登录 URL 来完成此操作。

注册 SsoAuthenticate 中间件到 Http Kernel。您可以替换 auth 中间件或创建自己的中间件。

'auth' => \Pochocho\OktaSamlSso\Http\Middleware\SsoAuthenticate::class,

将新的中间件添加到您的受保护路由中,尝试加载受保护路由,您应该会被重定向到 Okta 登录流程。

自定义

您可以实现自己的控制器,并使用OktaSaml类来处理来自Okta SAML响应的断言。该类提供了两种方法,一种用于处理未加密的SAML响应$oktaSaml->getEntity(),另一种用于处理加密的响应$oktaSaml->getEncryptedEntity()

OktaSaml类绑定到IoC容器,可以通过依赖注入或使用app()->make(Pochocho\OktaSamlSso\OktaSaml::class);来解析。