目前我的项目(Frontend和Backend都是Symfony2)使用HWIOAuthBundle通过Google等进行身份验证。
因为我想将前端(前端AngularJS)与后端分开。通信将依赖于JSON数据(因此通常是REST)。
我正面临着如何使用HWIOAuthBundle实现这一目标的问题。 symfony文档说明了stateless: true
,然后HWIOAuthBundle不起作用。
此外:将来我想为新用户实施FOSUserBundle(他们不会通过OAuth进行身份验证)。
我的问题: 1.如何使用HWIOAuthBundle实现无状态身份验证 2.我应该如何实现无状态身份验证(HWIOAuthBundle和FOSUserBundle)。 symfony文档说无状态身份验证是通过始终在每个请求中发送用户名/密码来完成的。我认为通过令牌进行身份验证是更好的方法(因为在OAuth环境中我没有用户名/密码)。
希望我的问题很明确!
# app/config/security.yml
security:
encoders:
AppBundle\Entity\User:
algorithm: sha1
encode_as_base64: false
iterations: 1
providers:
my_custom_hwi_provider:
id: amagin_user.oauth_user_provider
in_memory:
memory:
users:
user: { password: userpass, roles: [ 'ROLE_USER' ] }
admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_USER
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
default:
anonymous: ~
http_basic: ~
stateless: false
oauth:
resource_owners:
google: "/login/check-google"
login_path: /login
use_forward: false
failure_path: /login
oauth_user_provider:
service: amagin_user.oauth_user_provider
logout:
path: /logout
target: /
access_control:
#- { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/connect, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, role: ROLE_USER }
答案 0 :(得分:0)
我设法使用Google oauth和Symfony REST API配置AngularJS客户端。
这是security.yml:
security:
encoders:
FOS\UserBundle\Model\UserInterface: sha512
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_USER
providers:
fos_userbundle:
id: fos_user.user_provider.username_email
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
login:
pattern: ^/login
logout: true
anonymous: ~
stateless: true
oauth:
require_previous_session: false
success_handler: lexik_jwt_authentication.handler.authentication_success
failure_handler: lexik_jwt_authentication.handler.authentication_failure
check_path: /login_check
resource_owners:
google: "/login/check-google"
login_path: /login
oauth_user_provider:
service: api.user_provider
main:
pattern: ^/api
anonymous: ~
stateless: true
lexik_jwt: ~
access_control:
- { path: ^/login, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/api/doc, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/api, role: IS_AUTHENTICATED_FULLY }
config.yml:
hwi_oauth:
connect:
account_connector: api.user_provider
firewall_names: [login]
resource_owners:
google:
type: google
client_id: "%google_app_id%"
client_secret: "%google_app_secret%"
scope: "https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile"
从Angular方面我使用卫星获取一个授权令牌,然后将其发送到/ login / check-google /后退一个JWT。
请注意使用LexikJWTAuthenticationBundle生成JWT并根据此令牌保护路由。
但是有一个未解决的问题:satellizer执行POST请求以获取access_token。对于HWIOAuth来说这是一个意想不到的行为(也没有任何意义),所以我添加了它。请参阅the following issue。