
NG是什么意思:深度解析與應用
"message": "The API doesn't require an access token to share this message."
}
GET /api/messages/protected
該端點將受到保護,防止未經授權的訪問。只有攜帶有效訪問令牌并在HTTP請求標頭中進行授權的用戶,才能查看以下消息:
{
"message": "The API successfully validated your access token."
}
GET /api/messages/admin
與受保護的端點相似,要訪問這個端點,用戶的訪問令牌中需要包含訪問管理數據的相應權限。這種機制通常被稱為基于角色的訪問控制(RBAC)。例如,要訪問這個特定的端點,用戶可能需要擁有read:admin-messages
的權限。
在這里,您將通過設置和安裝新的 Symfony 應用程序及其所需的依賴項來開始構建 Symfony API。
首先,打開終端,導航到您的首選開發(fā)目錄,然后發(fā)出以下命令以使用Composer創(chuàng)建新項目:
composer create-project symfony/website-skeleton api-symfony-server
安裝過程完成后,切換到剛剛創(chuàng)建的新目錄:
cd api-symfony-server
```bash
cp .env .env.local
在 Symfony 項目中,.gitignore
?文件配置了 Git 忽略的文件模式。該文件的好處之一是它有助于將您的憑據存儲在代碼之外以確保它們的安全。
接下來,更新DATABASE_URL
參數,以便應用程序使用 SQLite 數據庫而不是默認的 PostgreSQL。為此,請將現有條目注釋掉,并取消注釋 SQLite 選項,使其與下面的示例保持一致。
DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"
注意:數據庫將在項目根目錄的 var 目錄中創(chuàng)建,并命名為.
data.db
確保您位于主項目目錄中并使用Symfony CLI,使用以下命令啟動應用程序:
symfony serve
導航到http://localhost:8000查看新 Symfony 應用程序的默認主頁:
在本節(jié)中,我們將首先處理公共端點,然后逐步著手處理其他端點,重點關注創(chuàng)建控制器以處理前面提到的每個端點的邏輯。
使用停止應用程序運行,然后點擊CTRL + C
Enter
首先從項目根目錄中的終端發(fā)出以下命令來創(chuàng)建控制器:
php bin/console make:controller APIController
您將看到以下輸出:
created: src/Controller/APIController.php
created: templates/api/index.html.twig
Success!
Next: Open your new controller class and add some pages!
找到新創(chuàng)建的控制器并使用以下src/Controller/APIController.php
內容更新其內容:
// src/Controller/APIController.php
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/api/messages")
*/
class APIController extends AbstractController
{
/**
* @Route("/public", name="public")
*/
public function publicAction()
: JsonResponse
{
return $this->json(["message" => "The API doesn't require an access token to share this message."], Response::HTTP_OK);
}
/**
* @Route("/protected", name="protected")
*/
public function protectedAction()
: JsonResponse
{
return $this->json(["message" => "The API successfully validated your access token."], Response::HTTP_OK);
}
/**
* @Route("/admin", name="admin")
*/
public function adminAction(): JsonResponse
{
return $this->json(["message" => "The API successfully recognized you as an admin."], Response::HTTP_OK);
}
}
從上面的代碼片段來看,該控制器包含三種不同的方法:
publicAction()
protectedAction()
adminAction()
每個都被設計為處理不同的端點,并分別針對/public、/protected、/admin
等端點返回適當的消息。
返回終端,再次啟動應用程序symfony serve
并打開 API 測試工具(例如Postman)來測試每個端點。
從公共端點開始。創(chuàng)建一個新的 GET 請求到此端點http://localhost:8000/api/messages/public。您將收到消息,如下圖所示:
接下來,嘗試在?http://localhost:8000/api/messages/protected
?上訪問受保護的端點。
最后,[ http://localhost:8000/api/messages/admin ] ( http://localhost:8000/api/messages/admin )上的管理端點將為您提供消息:
目前,所有人都可以訪問所有已創(chuàng)建的端點。然而,這顯然不是我們想要的結果。您需要確保這些端點僅對授權用戶開放。您將在下一節(jié)中開始配置。
如果您還沒有的話,請務必立即注冊一個免費的 Auth0 帳戶。
您將使用 Auth0 來保護端點(受保護和管理)。為此,您需要返回Auth0 儀表板并配置 API。
首先,單擊“應用程序”>“API”導航至Auth0 管理儀表板的 API 部分。如果您之前創(chuàng)建過任何 API,這將顯示您帳戶的所有 API 列表,但對于本教程,請繼續(xù)單擊“創(chuàng)建 API”按鈕并設置一個新 API。
提供一個友好的名稱(例如API)并將其標識符設置為Symfony?API?Serverhttps://localhost:8000RS256
。您可以自由使用任何名稱和標識符,但如果您想嚴格遵循本教程,則應保留上述值。將簽名算法保持原樣,并單擊“創(chuàng)建”按鈕繼續(xù)。在本教程的后續(xù)部分中,您將需要用到此處生成的值。
為了保護?/api/messages/protected
?和?/api/messages/admin
?這兩個 GET 端點,您將使用名為?auth0/jwt-auth-bundle
?的 Symfony JWT 身份驗證包。
使用以下命令停止應用程序運行,并運行以下命令以使用 Composer 安裝捆綁包:
composer require auth0/jwt-auth-bundle:"~4.0"
在項目中安裝完捆綁包后,您應該會在?config/packages/
?目錄下找到?jwt_auth.yaml
?文件。如果沒有,請創(chuàng)建該文件并將以下內容粘貼到其中:
jwt_auth:
domain: "%env(AUTH0_DOMAIN)%"
client_id: "%env(AUTH0_CLIENT_ID)%"
audience: "%env(AUTH0_AUDIENCE)%"
之前,當您創(chuàng)建 API 時,Auth0 還會自動為您的 API 創(chuàng)建一個測試應用程序。這將是保存您的用戶的 Auth0 應用程序。您可以通過單擊“Applications”來找到它,然后從列表中選擇與您的API命名相匹配的測試應用程序。如果您的名稱與本教程中的名稱相同,則它將是“Symfony API Server(測試應用程序)”。您還可以為您的帳戶選擇和使用任何其他應用程序。但對于本教程,單擊測試應用程序,您將看到如下所示的頁面:
打開.env.local
文件并更新以下環(huán)境變量的值:
CLIENT_ORIGIN_URL=http://localhost:4040
AUTH0_AUDIENCE=http://localhost:8000
AUTH0_DOMAIN=YOUR_AUTH0_DOMAIN
AUTH0_CLIENT_ID=YOUR_AUTH0_ID
AUTH0_CLIENT_SECRET=YOUR_AUTH0_CLIENT_SECRET
請確保將?YOUR_AUTH0_DOMAIN
、YOUR_AUTH0_CLIENT_ID
?和?YOUR_AUTH0_CLIENT_SECRET
?這幾個占位符替換成從 Auth0 儀表板上獲取的實際值。
處理身份驗證和授權需要 Auth0 了解當前經過身份驗證的用戶。這是 Symfony 中用戶提供程序的工作,因為它有助于從會話中重新加載用戶,并加載用戶以使用其他特定功能,例如使用用戶名或電子郵件進行身份驗證。
如果我們的 API 用戶數據是存儲在數據庫中的,那么可能就不需要創(chuàng)建自定義的用戶提供程序。但在這個場景下,我們需要從自定義的位置(即 Auth0)加載用戶,因此必須創(chuàng)建一個自定義的用戶提供程序。
首先,導航到該src
文件夾??并創(chuàng)建一個名為 的新文件夾Security
,并在新創(chuàng)建的文件夾中創(chuàng)建另一個文件夾并將其命名為User
。接下來,在文件夾中創(chuàng)建用戶類User
并將其命名為WebServiceUser.php
.打開新創(chuàng)建的文件并將以下代碼粘貼到其中:
<?php
namespace App\Security\User;
use Symfony\Component\Security\Core\User\EquatableInterface;
use Symfony\Component\Security\Core\User\UserInterface;
class WebServiceUser implements
UserInterface, EquatableInterface {
private $roles;
private $jwt;
public function __construct($jwt, $roles) {
$this->roles = $roles;
$this->jwt = $jwt;
}
/**
* @inheritDoc
*/
public function getRoles()
: array {
return $this->roles;
}
/**
* @inheritDoc
*/
public function getPassword()
: ?string {
return null;
}
/**
* @inheritDoc
*/
public function getSalt()
: ?string {
return null;
}
public function isEqualTo(UserInterface $user)
: bool {
if (!$user instanceof WebServiceUser) {
return false;
}
return $this->getUsername() === $user->getUsername();
}
/**
* @inheritDoc
*/
public function getUsername() {
return $this->jwt["email"] ?? $this->jwt["sub"];
}
/**
* @inheritDoc
*/
public function eraseCredentials() {
}
public function getUserIdentifier() {
return $this->jwt["email"] ?? $this->jwt["sub"];
}
}
這里,WebServiceUser
該類實現了兩個不同的接口:
接下來,在文件夾中創(chuàng)建一個文件User
并將其命名為WebServiceAnonymousUser.php
.這將返回匿名用戶。使用以下內容:
<?php
namespace App\Security\User;
class WebServiceAnonymousUser extends WebServiceUser {
public function __construct() {
parent::__construct(null, ['IS_AUTHENTICATED_ANONYMOUSLY']);
}
public function getUsername() {
return null;
}
}
最后,在User
文件夾中創(chuàng)建另一個文件并將其命名為Web Service User Provider.php
.完成后,將以下代碼粘貼到其中:
<?php
namespace App\Security\User;
use Auth0\JWTAuthBundle\Security\Core\JWTUserProviderInterface;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Polyfill\Intl\Icu\Exception\NotImplementedException;
class WebServiceUserProvider implements JWTUserProviderInterface {
public function loadUserByJWT($jwt)
: WebServiceUser {
$data = ['sub' => $jwt->sub];
$roles = [];
$roles[] = 'ROLE_OAUTH_AUTHENTICATED';
return new WebServiceUser($data, $roles);
}
public function getAnonymousUser()
: WebServiceAnonymousUser {
return new WebServiceAnonymousUser();
}
public function loadUserByUsername($username) {
throw new NotImplementedException('method not implemented');
}
public function refreshUser(UserInterface $user) {
if (!$user instanceof WebServiceUser) {
throw new UnsupportedUserException(
sprintf('Instances of "%s" are not supported.', get_class($user))
);
}
return $this->loadUserByUsername($user->getUsername());
}
public function supportsClass($class)
: bool {
return $class === 'App\Security\User\WebServiceUser';
}
public function loadUserByIdentifier(string $identifier)
{
throw new NotImplementedException('method not implemented');
}
}
該類實現了之前安裝的 Auth0 包中的?JWTUserProviderInterface
,該接口指定了該類必須實現的重要方法。這些方法是作為?WebServiceUserProvider
?的一部分來定義的。
loadUserByJWT
:它接收解碼后的 JWT 訪問令牌并返回用戶。getAnonymousUser
:返回代表未經身份驗證的匿名用戶(通常由角色表示IS_AUTHENTICATED_ANONYMOUSLY
)接下來,我們需要在 Symfony 中創(chuàng)建一個防護驗證器。為此,請在文件夾中創(chuàng)建一個新文件并將其命名為src/Security/UserGuardAuthenticator.php
.打開新文件并使用以下內容:
<?php
namespace App\Security\User;
use Auth0\JWTAuthBundle\Security\Guard\JwtGuardAuthenticator;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
class GuardAuthenticator extends JwtGuardAuthenticator
{
public function start(Request $request, AuthenticationException $authException = null)
{
$responseBody = [
'message' => 'No authorization token was found',
];
return new JsonResponse($responseBody, JsonResponse::HTTP_UNAUTHORIZED);
}
}
這從包中擴展了?GuardAuthenticator
?類,名為?JwtGuardAuthenticator
,并檢查 HTTP 請求標頭中是否存在訪問令牌。如果沒有找到訪問令牌,它會返回一條適當的消息。
在配置安全提供程序之前,為?WebServiceUserProvider
?創(chuàng)建一個服務是一個好習慣,這可以使您的應用程序更易于維護和適應未來的新要求。您可以通過將此代碼添加到文件底部來創(chuàng)建一個:
parameters:
services:
...
# ?? new code starts here
web_service_user_provider:
class: App\Security\User\WebServiceUserProvider
arguments: ["@jwt_auth.auth0_service"]
最后,修改file中的文件security.yamlconfig/packages/security.yaml
,使其包含以下內容:
web_service_user_provider
?access_control
包含每個路由所需角色的部分您可以將其完全替換為以下內容:security:
enable_authenticator_manager: true
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
providers:
# users_in_memory: { memory: null }
web_service_user_provider:
id: App\Security\User\WebServiceUserProvider
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
secured_area:
pattern: ^/api
stateless: true
guard:
authenticators:
id: App\Security\User\GuardAuthenticator
provider: web_service_user_provider
# Easy way to control access for large sections of your site
# Note: Only the *first* access control that matches will be used
access_control:
- { path: ^/api/messages/public, roles: PUBLIC_ACCESS }
- { path: ^/api/messages/protected, roles: ROLE_OAUTH_AUTHENTICATED }
- { path: ^/api/messages/admin, roles: ROLE_OAUTH_AUTHENTICATED }
現在,您可以通過訪問受保護的路由,使用 Postman 再次測試這一點。通過運行symfony serve
并訪問來啟動應用程序。您將收到一條消息,指示“未找到授權令牌”,如下所示:
這是因為您需要提供一個有效的訪問令牌,才能從?/protected
?端點成功檢索內容。
動態(tài)生成訪問令牌通常需要您的客戶端應用程序獲得 Auth0 的授權。但作為一個概念驗證的示例,目前您可以從 Auth0 儀表板上直接獲取并使用一個用于測試的令牌。為此,請導航至Auth0 儀表板中的 API 部分,然后單擊您之前創(chuàng)建的 API。接下來,單擊“Test”選項卡,并向下滾動到“響應”部分,在“access_token”副標題下復制顯示的內容。
再次打開 Postman,在“授權”選項卡中選擇“Bearer Token”,然后粘貼您的訪問令牌。
現在您可以嘗試受保護的端點,您將收到消息,如下所示:
正如之前提到的,/api/messages/admin
?端點需要訪問令牌來授予訪問管理數據的權限。這通常被稱為基于角色的訪問控制 (RBAC),在這種機制中,用戶的權限是根據他們在組織中所擔任的角色來分配的。對于?GET /api/messages/admin
,需要分配?read:admin-messages
?權限。
在本節(jié)中,要實施和配置此訪問控制,您將執(zhí)行以下操作:
admin
在儀表板中創(chuàng)建角色read:admin-messages
。admin
角色中。為了使基于角色的訪問控制 (RBAC) 正常運作,您必須通過儀表板或管理 API 為您的 API 啟用該功能。
導航到 Auth0 儀表板并單擊 API,然后選擇之前創(chuàng)建的 API ,然后向下滾動到RBAC 設置部分:
通過切換此處的兩個按鈕來啟用 RBAC:“啟用 RBAC”和“在訪問令牌中添加權限”。這將為任何選擇的端點實施基于角色的訪問控制授權策略,并確保將聲明permissions
添加到訪問令牌中。單擊“保存”按鈕以更新更改。
您既可以通過 Auth0 的儀表板,也可以通過其管理 API 來創(chuàng)建角色。這些角色能夠與 Auth0 的 API 授權核心功能集一起使用。
轉到以下內容:
給角色起一個名字,比如“管理員”,并為其添加描述,例如“讀取所有管理消息”。
從儀表板中的 API 菜單返回該頁面,然后單擊同一頁面中的“權限”選項卡來定義權限及其范圍。
在“權限(范圍)”下方,輸入?read:admin-messages
。對于“說明”字段,請輸入“讀取管理消息”。確保單擊“添加”按鈕以保存該權限。
現在您已經創(chuàng)建了Admin
角色及其對應的權限,接下來要做的就是為新創(chuàng)建的角色添加權限。
返回“用戶管理”>“角色”中的“角色”頁面。
單擊您之前創(chuàng)建的管理員角色,然后單擊“權限”選項卡。現在單擊添加權限按鈕。你會看到這樣的頁面:
從列表中選擇您的 API;在我們的例子中,應選擇“Symfony API Server”,并為它分配?read:admin-messages
?權限。選中旁邊的框以指示管理員角色的權限。最后,單擊“添加權限”以保存更改。
有兩種方法可以為用戶分配角色。您可以從“用戶”列表中選擇用戶,然后分配角色,也可以轉至單個用戶的“用戶詳細信息”(用戶配置文件)頁面,然后在“角色”選項卡中選擇要分配的角色。您將堅持使用本教程中的用戶列表。
為此:
此時,一旦用戶通過 API 進行身份驗證,返回的?access token
?信息中將包含用戶所擁有的權限。具體來說,如果用戶具有?權限,則該信息中會包含這一項;否則,則不包含。要在允許用戶訪問管理數據之前檢查此權限,您將更新read:admin-messagessrc/Security/User/WebServiceUserProvider.php
文件,如下所示:
...
class WebServiceUserProvider implements JWTUserProviderInterface {
public function loadUserByJWT($jwt)
: WebServiceUser {
$data = ['sub' => $jwt->sub];
$roles = [];
$roles[] = in_array('read:admin-messages', $jwt->permissions) ? 'ROLE_ADMIN' : 'ROLE_OAUTH_AUTHENTICATED';
return new WebServiceUser($data, $roles);
}
...
}
在這里,您會檢查權限數組中是否存在 read:admin-messages
。如果存在,那么會將 ROLE_ADMIN
角色分配給經過身份驗證的用戶;如果不存在,則會分配一個基本的 ROLE_OAUTH_AUTHENTICATED
角色。
另外,請打開?config/packages/security.yaml
?文件并更新其內容,如下所示:
security:
enable_authenticator_manager: true
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
providers:
# users_in_memory: { memory: null }
web_service_user_provider:
id: App\Security\User\WebServiceUserProvider
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
secured_area:
pattern: ^/api
stateless: true
guard:
authenticators:
id: App\Security\User\GuardAuthenticator
provider: web_service_user_provider
role_hierarchy:
ROLE_ADMIN: [ROLE_OAUTH_AUTHENTICATED, ROLE_ALLOWED_TO_SWITCH]
# Easy way to control access for large sections of your site
# Note: Only the *first* access control that matches will be used
access_control:
- { path: ^/api/messages/public, roles: PUBLIC_ACCESS }
- { path: ^/api/messages/protected, roles: ROLE_OAUTH_AUTHENTICATED }
- { path: ^/api/messages/admin, roles: ROLE_ADMIN }
從上面的代碼片段中,您更新了api/messages/admin
端點的角色。
一旦未經授權的用戶在沒有適當權限的情況下嘗試訪問任何端點,就會拋出異常,表明此類訪問被禁止。
在本部分中,您將創(chuàng)建一個事件訂閱者,它將偵聽禁止的事件并返回適當的消息。為此,請在?src
?目錄中創(chuàng)建一個命名文件夾(如果還沒有的話),然后在這個文件夾中創(chuàng)建一個名為?ExceptionSubscriber.php
?的新文件。接下來,打開這個新創(chuàng)建的文件,并使用以下內容填充它:
<?php
namespace App\EventSubscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
class ExceptionSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
KernelEvents::EXCEPTION => ['onKernelException']
];
}
public function onKernelException(ExceptionEvent $event)
{
$exception = $event->getThrowable();
if ($exception instanceof AccessDeniedHttpException) {
$event->setResponse(new JsonResponse([
'message' => "Insufficient scopes.",
], Response::HTTP_UNAUTHORIZED));
$event->stopPropagation();
}
return $exception;
}
}
完成所有必需的更改后,通過發(fā)出以下命令來運行 API 服務器:
symfony serve
正如之前提到的,與迄今為止所創(chuàng)建的其他端點不同,這個?/api/messages/admin
?端點要求訪問令牌中必須包含特定的權限(read:admin-messages
)。由于通過 Auth0 儀表板來操作來自機器對機器應用程序的訪問令牌既有些困難又不被推薦,因此我們將采取一種不同的方法,即使用客戶端應用程序來模擬和測試客戶端與服務器之間的交互。
目前,這是確保我們有一個界面供用戶執(zhí)行以下操作的最佳方式:
注意:在此過程中,如果您有自己的客戶端應用程序,請隨意使用它來進行測試。
要使用預構建的客戶端應用程序,請從終端發(fā)出以下命令以從 GitHub 克隆應用程序:
git clone https://github.com/auth0-sample-gallery/spa_angular_typescript_hello-world.git hello-world-demo
這會將演示應用程序克隆到開發(fā)目錄中命名hello-world-demo
的新文件夾中。
在安裝項目的依賴項之前,請確保您的系統上已經安裝了 Angular CLI。您可以通過在終端中運行相應的命令來驗證這一點。
ng --version
輸出將是您系統上安裝的 Angular CLI 當前版本的詳細信息。如果未安裝,請按照此處的說明全局配置 Angular CLI。
進入新項目的文件夾并發(fā)出以下命令來安裝所需的依賴項:
// Change directory
cd hello-world-demo
// Install dependencies
npm install
起始項目使用自定義樣式表來設計應用程序的樣式和布局,因此您無需進行任何更改。
接下來,您需要將此應用程序連接到 Auth0。返回 Auth0 儀表板,單擊“應用程序”>“應用程序”>“創(chuàng)建應用程序”。
為其命名為“Angular Symfony App”,然后選擇“單頁 Web 應用程序”作為應用程序名稱。最后,點擊“創(chuàng)建”。
每當發(fā)出身份驗證請求時,Angular 演示應用程序都會將用戶重定向到 Auth0 的登錄頁面。之后,Auth0 會使用必要的憑據將用戶重定向回應用程序。
為了安全地進行重定向,您必須指定 Auth0 在驗證用戶憑據后可以重定向到的 URL。返回Auth0 儀表板,選擇為您的 API 創(chuàng)建的應用程序,單擊該頁面上的“設置”選項卡,然后向下滾動以找到以下字段:
用作每個字段的值,因為在開發(fā)過程中可以通過該 URL 訪問客戶端應用程序。單擊“保存更改”繼續(xù)。
在正確指定了 URL 之后,您需要將客戶端應用程序與 Auth0 連接起來。這可以通過在客戶端應用程序的根目錄中創(chuàng)建一個名為?env.json
?的新文件,并按照以下方式填充該文件來實現:
{
"domain": "YOUR_AUTH0_DOMAIN",
"clientId": "YOUR_AUTH0_CLIENT_ID",
"audience": "http://localhost:8000",
"apiServerUrl": "http://localhost:8000"
}
確保使用Auth0 儀表板中應用程序頁面中的值填寫“域”和“客戶端 ID” 。現在,繼續(xù)使用以下命令運行應用程序:
ng serve
導航到http://localhost:4040以訪問該應用程序。
默認情況下,為保障安全,瀏覽器會禁止不同域的應用程序之間交互和共享資源,除非得到應用程序的明確允許。這意味著目前將禁用從客戶端應用程序向 Symfony API 發(fā)送 HTTP 請求。要啟用兩個應用程序之間的通信,您需要啟用CORS(跨源資源共享)。
要啟用 Symfony API,您需要使用Nelmo Bundle。運行以下命令來安裝它:
composer require nelmio/cors-bundle
安裝過程完成后,將在文件夾中生成一個名為nelmio_cors.yamlconfig/packages
的默認配置文件,如下所示:
nelmio_cors:
defaults:
origin_regex: true
allow_origin: ["%env(CORS_ALLOW_ORIGIN)%"]
allow_methods: ["GET", "OPTIONS", "POST", "PUT", "PATCH", "DELETE"]
allow_headers: ["Content-Type", "Authorization"]
expose_headers: ["Link"]
max_age: 3600
paths:
"^/": null
此處所指定的默認配置通常已經足夠,因為它涵蓋了所有適當的 HTTP 動詞。接下來,請導航到該文件并更新其內容,具體更新如下:
####> nelmio/cors-bundle ###
CORS_ALLOW_ORIGIN='^https?://(localhost|127\.0\.0\.1)(:[0-9]+)?$'
####< nelmio/cors-bundle ###
在這里,我們指定應允許 localhost URL。
最后,啟動 Symfony 服務器:
symfony serve
在客戶端應用程序中,單擊外部 API按鈕并提供您的憑據。
確保您使用具有 Auth0 儀表板上指定的管理員角色的用戶詳細信息進行登錄。
您還可以通過單擊端點的“公共”按鈕或端點的“受保護”按鈕來檢查其他端點,分別如下所示:
通過本教程,您已經學習了如何輕松地構建一個 Symfony API 服務器。這個服務器包含了一些無需身份驗證即可由互聯網上的任何人訪問的端點,同時也包含了一些需要適當授權和角色才能訪問的其他端點。
您通過從公共端點開始并進一步創(chuàng)建兩個受保護端點(即私有端點和管理端點)來連續(xù)創(chuàng)建這些端點。為了完全設置和配置受保護端點的身份驗證與授權,您利用了 Auth0 的 API。這樣,只有那些 HTTP 請求在授權標頭中包含了有效的訪問令牌,才能夠成功地檢索數據。
我希望本教程對您有所幫助。本文中構建的 API 服務器的完整源代碼可以在 GitHub 上找到。
原文鏈接:https://auth0.com/blog/build-and-secure-a-simple-symfony-api-server-using-auth0/