2016-05-14 12 views
0

私はまだ解決策を見つけ、CORS問題について検索します。サーバー上のCors symfonyのリクエスト/角度

プロジェクト:Debianの8/nginxの/ PHP-FPM

私のnginxのバーチャルホスト:

server { 
    server_name sub.domain.com; 
    root /home/projects/sub.domain.com/web; 

    location/{ 
     try_files $uri /app.php$is_args$args; 
    } 


    # DEV 
    location ~ ^/(app_dev|config)\.php(/|$) { 
       fastcgi_pass unix:/var/run/php5-fpm-user.sock; 
     fastcgi_split_path_info ^(.+\.php)(/.*)$; 
     include fastcgi_params; 
     fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; 
     fastcgi_param DOCUMENT_ROOT $realpath_root; 
    } 

    # PROD 
    location ~ ^/app\.php(/|$) { 
     fastcgi_pass unix:/var/run/php5-fpm-user.sock; 
     fastcgi_split_path_info ^(.+\.php)(/.*)$; 
     include fastcgi_params; 
     fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; 
     fastcgi_param DOCUMENT_ROOT $realpath_root; 
     internal; 
    } 

} 

サーバー側:FosUserBundleとsymfonyの3.0これらを解決するために、私はこのような設定に私の構成を有しています/ FOSRestBundle/NelmioApiDocBundle/NelmioCorsBundle/LexikJWTAuthenticationBundle/JMSSerializer

マイconfig.yml:

# FosUserBundle Configuration 
fos_user: 
    db_driver: orm 
    firewall_name: main 
    user_class: UserBundle\Entity\User 
    group: 
     group_class: UserBundle\Entity\Group 
     form: 
      type: UserBundle\Form\Type\GroupFormType 
    profile: 
     form: 
      type: UserBundle\Form\Type\ProfileFormType 

# FOSRestBundle Configuration 
fos_rest: 
    param_fetcher_listener: true 
    body_listener: true 
    format_listener: true 
    view: 
     view_response_listener: 'force' 
     formats: 
      xml: true 
      json : true 
     templating_formats: 
      html: true 
     force_redirects: 
      html: true 
     failed_validation: HTTP_BAD_REQUEST 
     default_engine: twig 
    routing_loader: 
     default_format: json 

# LexikJWTAuthenticationBundle Configuration 
lexik_jwt_authentication: 
    private_key_path: %jwt_private_key_path% 
    public_key_path: %jwt_public_key_path% 
    pass_phrase:  %jwt_key_pass_phrase% 
    token_ttl:  %jwt_token_ttl% 

# JMSSerializer Configuration 
jms_serializer: 
    metadata: 
     auto_detection: true 

# NelmioCorsBundle Configuration 
nelmio_cors: 
    defaults: 
     allow_credentials: true 
     allow_origin: [] 
     allow_headers: [] 
     allow_methods: [] 
     expose_headers: [] 
     max_age: 0 
     hosts: [] 
     origin_regex: false 
    paths: 
     '^/api/': 
      allow_origin: ['*'] 
      allow_headers: ['Origin', 'Content-Type', 'X-Requested-With', 'Accept'] 
      allow_methods: ['POST', 'PUT', 'GET', 'DELETE', 'OPTIONS'] 
      max_age: 3600 

私のsecurity.yml:

api_doc: 
    pattern: ^/api/doc 
    anonymous: true 

api_login: 
    pattern: ^/api/login 
    provider: fos_userbundle 
    stateless: true 
    anonymous: true 
    form_login: 
     check_path:  /api/login_check 
     require_previous_session: false 
     username_parameter: username 
     password_parameter: password 
     success_handler:   lexik_jwt_authentication.handler.authentication_success 
     failure_handler:   lexik_jwt_authentication.handler.authentication_failure 

api: 
    pattern: ^/api 
    stateless: true 
    provider: fos_userbundle 
    lexik_jwt: 
     authorization_header: 
      enabled: true 
      prefix: Bearer 
     query_parameter: 
      enabled: true 
      name: Bearer 
     throw_exceptions:  true 
     create_entry_point:  true 

## Main firewall 
main: 
    pattern: ^/ 
    form_login: 
     provider: fos_userbundle 
     csrf_token_generator: security.csrf.token_manager 
     login_path: fos_user_security_login 
     check_path: fos_user_security_check 
     remember_me: true 
     default_target_path: lgb_onepage_home 
    logout: 
     path: fos_user_security_logout 
     target: lgb_onepage_home 
    anonymous: true 
    remember_me: 
     secret:  %secret% 
     lifetime: 604800 # 1 week in seconds 
     path: /
     domain: ~ # Defaults to the current domain from $_SERVER 
     #    secure: true 
     httponly: true 

access_control: 
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/register, role: ROLE_ADMIN } 
    - { path: ^/resetting, role: ROLE_ADMIN } 
    - { path: ^/intranet/, role: ROLE_USER } 
    - { path: ^/api/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/api/doc, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/api,  roles: [IS_AUTHENTICATED_FULLY, ROLE_ADMIN] } 

と(のスケルトンタブが有効なログインフォームを持って)私のクライアントのために、私はベースのプロジェクトに角度JSとイオンを使用します。

マイ設定:

.config(function ($stateProvider, $urlRouterProvider, localStorageServiceProvider, $httpProvider) { 
    $stateProvider...; 

    // if none of the above states are matched, use this as the fallback 
    $urlRouterProvider.otherwise('/app/playlists'); 

    localStorageServiceProvider 
     .setPrefix('lgb-preorder'); 

    $httpProvider.defaults.headers.common = {}; 
    $httpProvider.defaults.headers.post = {}; 
    $httpProvider.defaults.headers.put = {}; 
    $httpProvider.defaults.headers.patch = {}; 
}); 

と私の機能(動作しない):

$scope.doLogin = function() { 

      var loginData = { 
       username: this.login.username, 
       password: this.login.password 
      }; 

      $http({ 
       url: 'http://sub.domain.com/app_dev.php/api/login_check', 
       method: 'POST', 
       data: loginData, 
       headers: {'Content-Type': 'application/json'} 
      }) 
       .success(function (data) { 
        console.log("Success -- login ok with ", data); 
       }) 
       .error(function (error) { 
        console.log("ERROR -- login fail with ", error); 
       }); 
     }; 

エラーセンドは次のとおりです。

XMLHttpRequest cannot load http://sub.domain.com/app_dev.php/api/login_check. Response to preflight request doesn't pass access control check: The 'Access-Control-Allow-Origin' header contains multiple values '*, http://localhost:8100', but only one is allowed. Origin 'http://localhost:8100' is therefore not allowed access. 

私のhttpリクエストは、アクセス制御 - 許可 - ヘッダとアクセス制御 - 許可 - 起源の2つの定義持っているので、それはそう:

Request URL:http://sub.domain.com/app_dev.php/api/login_check 
Request Method:OPTIONS 
Status Code:200 OK 
Remote Address:x.x.x.x:80 
Response Headers 
view source 
Access-Control-Allow-Credentials:true 
Access-Control-Allow-Headers:Origin, X-Requested-With, Content-Type, Accept 
Access-Control-Allow-Headers:origin, content-type, x-requested-with, accept 
Access-Control-Allow-Methods:POST, PUT, GET, DELETE, OPTIONS 
Access-Control-Allow-Origin:http://localhost:8100 
Access-Control-Allow-Origin:* 
Access-Control-Max-Age:3600 

が、なぜに? ?____?

あなたの助けのために誰もがアイデアを持っている場合は、その本当に感謝=)ありがとう


この要求CURLが働いている:

curl -X POST http://sub.domain.com/app_dev.php/api/login_check -d '{"username": "user", "password": "pass"}' -H "Content-Type: application/json" 
+0

使用しているウェブサーバーは何ですか? Webサーバーが追加のAccess-Control-Allow-Originを追加していないと確信していますか? .. – Vamsi

+0

私はこの設定で私の仮想ホストを追加するNginxを使用しました。 nginxがこのリクエストにヘッダを追加できるかどうかはわかりません。 – Quovandius

答えて

1

私は、OPTIONSと同じ問題がありました。私のバックエンドは春です。私はPHPと同等のものを見つけました。あなたがプリフライトに焦点を当てる必要があります

Getting Cors Working

。バックエンドコードにこれを追加する必要があると思います。

// respond to preflights 
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { 
    // return only the headers and not the content 
    // only allow CORS if we're doing a GET - i.e. no saving for now. 
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']) && $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'] == 'GET') { 
    header('Access-Control-Allow-Origin: *'); 
    header('Access-Control-Allow-Headers: X-Requested-With'); 
    } 
    exit; 
} 
+0

あなたの答えはThanxです。私はこの設定がどのようにこれらのヘッダーの1つを削除するのか理解していませんでしたか? :私はremysharp投稿を読んだが、このトピックは非常に具体的です。 – Quovandius

+0

私は少しのPHP知識を持っています。 https://gist.github.com/alexjs/4165271 https://gist.github.com/Stanback/7145487。私はnginxのために何かを見つけました.maybeあなたが設定で行うことができます。 –