1

FOSUserBundle/RestBundle/OAuthServerBundleトリオを設定してヘッドレスバックエンドを作成する作業を進めており、別のフロントエンドをモバイルに展開してから、可能な第三者APIアクセス。利用可能なさまざまなリソースと指示に基づいて一般的な設定を行い、クライアントの資格情報を使用してアクセストークンを生成することができます。FOSUserBundle + FOSOAuthServerBundleを使用したユーザー認証フロー

これが追加されるアプリケーションは、フロントエンド/バックエンドの対話に標準のSymfony/Twigを使用し、認証にFOSUserBundleを使用する既存のものです。

私は、認証の流れに関連して2つの問題があります。

  1. 私は、ユーザーがクライアントレベルを超えて認証せずにAPIの一部にアクセスできるようにしたいと思っています。また、ユーザーレベルの認証が要求されたリソースの所有者であることを確認する必要があります。私はこれを行う方法を見つけることができません。私はポストが可能性について話しているが、それがどのように成し遂げられるかについての何らかの指示を何も与えていないことを発見した私は適切なアクセスのためにコントローラーレベルでチェックする必要があると思います。おそらく、カスタムの投票者を使用して、 'IS_AUTHENTICATED_FULLY'のチェックがクライアントで認証された後に真実に戻ってくることがあります。 UIログインフォームをバイパスしてプログラムでユーザーを認証できるようにしたい - FOSUserBundleログインコントローラーをオーバーライドするだけかもしれないが、わからない。
  2. アクセストークンの有効期限がないクライアントを作成するか、リフレッシュトークンを実装する方法を見つける必要があります。私は自分のアプリケーションがトークンをリフレッシュする必要があるのは本当にわかりませんが、それが標準的な方法であれば、それに従うことで大丈夫です。

以下に関連するコードがありますが、コードはFOSOAuthServerセットアップガイドからコピーされたかなり標準的なものです。

のsecurity.yml

security: 
    encoders: 
     FOS\UserBundle\Model\UserInterface: sha512 

    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: ROLE_ADMIN 

    providers: 
     fos_userbundle: 
      id: fos_user.user_provider.username_email 

    firewalls: 
     oauth_token: 
      pattern: ^/oauth/v2/token 
      security: false 

     rest: 
      pattern: ^/rest(?!/doc) 
      fos_oauth: true 
      stateless: true 
      anonymous: false 

     main: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       csrf_token_generator: security.csrf.token_manager 
       success_handler: security.authentication.success_handler 
      use_referer: true 
      logout:  true 
      anonymous: true 

    access_control: 
     - { path: ^/rest, roles: [ IS_AUTHENTICATED_FULLY ] } 

config.ymlが

fos_user: 
    db_driver: orm 
    firewall_name: main 
    user_class: AppBundle\Entity\User 
    registration: 
     form: 
      type: AppBundle\Form\Type\RegistrationFormType 
    profile: 
     form: 
      type: user_profile 

fos_oauth_server: 
    db_driver: orm 
    client_class:  AppBundle\Entity\Client 
    access_token_class: AppBundle\Entity\AccessToken 
    refresh_token_class: AppBundle\Entity\RefreshToken 
    auth_code_class:  AppBundle\Entity\AuthCode 
    service: 
     user_provider: fos_user.user_provider.username_email 
     options: 
      supported_scopes: user 

fos_rest: 
    view: 
     view_response_listener: force 
     formats: 
      json: true 
     templating_formats: 
      html: true 
     mime_types: 
      json: ['application/json', 'application/json;version=1.0', 'application/json;version=1.1'] 
      jpg: ['image/jpeg'] 
      png: ['image/png'] 
    body_listener: true 
    param_fetcher_listener: true 
    allowed_methods_listener: true 
    format_listener: 
     rules: 
      - { path: ^/, priorities: [html, json], fallback_format: json, prefer_extension: false } 

答えて

1

AD 1) スニペット私はsecurity.ymlでのファイアウォールを使用して問題を解決しました。 symfonyはsecurity.ymlで最初の試合を見ているので、私は匿名ユーザーをできるように最初のファイアウォールを置く:私はすべての

をキャッチする正規表現を持っている正規表現でURLをキャッチし、2番目のファイアウォールのよう anonymous: true

を与える

api_anonym_area: 
    pattern: (^/api/forgotten-password/.*) 
    stateless: true 
    fos_oauth: true 
    anonymous: true 

api_auth_area: 
    pattern: ^/ 
    fos_oauth: true 
    stateless: true 
    anonymous: false 

匿名ユーザーが/ rest/docにアクセスしたい場合は、firewall:rest somの前にと入力してください

rest_doc: 
    pattern: ^/rest/doc 
    fos_oauth: true 
    stateless: true 
    anonymous: true 

AD 2) そのない良い練習無制限のアクセストークン寿命を持っている、しかし、あなたはaccess_token_lifetimeに大きな整数を設定することにより、config.ymlでそれを行うことができます:

fos_oauth_server: 
    service: 
     options: 
      access_token_lifetime: #number in seconds# 

するために、このようethingリフレッシュトークンでただちにログインする

/oauth/v2/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=refresh_token&refresh_token=REFRESH_TOKEN 

in its FOSOAuthServerBundle ou箱のt

関連する問題