我正在使用API Platform开发API,而我却在如何保护API上苦苦挣扎。
我的前端应用程序(博客站点)具有不需要用户登录即可查看的内容(公共内容)。要从API提取此内容,我不需要对用户进行身份验证,但仍然需要授权应用程序以防止每个人都可以调用API。以下是一些示例路线:
GET /api/blogs
GET /api/blogs/{id}
用户仍然可以登录以访问站点的其他部分(受保护的内容)。对于这些API调用,我需要验证用户身份以检查其角色(管理员或其他角色)。以下是一些示例路线:
POST /api/users
POST /api/blogs
official documentation建议使用JWT进行身份验证,但这意味着用户将必须登录才能看到公共内容。在security.yaml
中,我尝试过:
access_control:
- { path: ^/api/blogs, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/api/users, roles: ROLE_ADMIN }
但是/api/blogs
被列入白名单,每个人或任何应用程序都可以从API调用它。
这是我的security.yaml
的全部内容:
security:
encoders:
App\Entity\User:
id: App\Security\PasswordEncoder
providers:
app_user_provider:
entity:
class: App\Entity\User
property: email
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
pattern: ^/api/
stateless: true
anonymous: true
provider: app_user_provider
json_login:
check_path: api_authenticate
username_path: email
password_path: password
success_handler: lexik_jwt_authentication.handler.authentication_success
failure_handler: lexik_jwt_authentication.handler.authentication_failure
guard:
authenticators:
- lexik_jwt_authentication.jwt_token_authenticator
access_control:
- { path: ^/api/blogs, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/api/users, roles: ROLE_ADMIN }
我的问题是,在我的情况下,处理授权和认证的正确方法是什么? JWT是否足以完成这两项任务?我需要在数据库中创建一个特殊的API用户吗?
答案 0 :(得分:1)
“ JSON Web令牌”(JWT)只是客户端(浏览器)告诉应用程序“声明”的一种方式(例如,“我是John Appleseed,用户号123” < / em>),应用程序可以验证。
之所以可以这样做,是因为该索赔最初是由应用程序产生并经过密码签名的:任何对此索赔的篡改,应用程序都将知道它是无效的索赔。
如此,JWT仅对身份验证有用:验证系统中的用户身份。例如:你是谁?
授权在成功验证后发生。应用程序是否根据您的身份确定您有权访问或无法访问哪些资源或操作。例如:您被允许这样做吗?
通常,在Symfony中有两种处理授权的方法。您可以在access_control
上配置security.yaml
键,或者,如果您的要求比较复杂,可以在控制器中进行处理。
对于您而言,使用JWT令牌并配置access_control
应该绰绰有余。您的API中有公开部分,任何用户都可以查询(IS_AUTHENTICATED_ANONYMOUSLY
),只有经过身份验证的用户才能进入私有部分ROLE_ADMIN
进一步阅读:
答案 1 :(得分:0)
阻止其他网站(应用)访问您的 API 是通过适当的 CORS(允许来源)设置完成的。这可以在 PHP (Symfony) 级别或 Nginx 级别完成,如果您在 Nginx / php-fpm 组合中使用 Nginx 作为反向代理。
如果您的 API 仅用于服务器到服务器的通信,您还可以向标头或请求添加一些特定的“站点密钥哈希”。与您请求 Google API 时类似。但这是前端到后端通信的要点,因为密钥在前端是可见的且不安全。