Phoenixの開発をしていていつもCORSの設定方法をググっていたのですが、
よさそうなライブラリがあったのでメモ ![]()
使い方
-
mix.exsに依存を追加mix.exs
defp deps do
[
{:phoenix, "~> 1.5.9"},
...
{:corsica, "~> 1.0"} # 追加
]
end
```
-
mix deps.get -
lib/<appname>_web/endpoint.exに設定を追加lib/myapp_web/endpoint.ex.exs
...
plug Corsica, origins: "*"
plug MyApp.Router
```
-
確認
$ curl -H "Origin: http://localhost" -I http://localhost:4000
HTTP/1.1 200 OK
access-control-allow-origin: *
んー楽だ
# その他の機能
## 他のヘッダーの設定
`Corsica` がサポートしているヘッダーは以下のようです ※`()` はoptionsのキー
- `Access-Control-Allow-Origin`(`:origins`)
- `Access-Control-Allow-Methods`(`:allow_methods `)
- `Access-Control-Allow-Headers`(`:allow_headers `)
- `Access-Control-Allow-Credentials`(`: allow_credentials `)
- `Access-Control-Expose-Headers`(`:expose_headers`)
- `Access-Control-Max-Age`(`:max_age `)
```elixir
plug Corsica, origins: "*", allow_methods: ["POST"], ...
特定のリソースごとに設定を変える
Corsica.Router を使うことで、リソースごとに細かい設定が可能なようです
defmodule MyApp.CORS do
use Corsica.Router,
origins: ["http://foo.com", "http://bar.com"],
allow_credentials: true,
max_age: 600
resource "/*"
# We can override single settings as well.
resource "/public/*", allow_credentials: false
end
plug MyApp.CORS
plug MyApp.Router
注意点
common issues に書いてあるとおり、 CorsicaはCORS的に正しいリクエストでないと access-control-allow-origin などのヘッダを返さないようです。
例えば origins: "http://foo.com" とした場合は リクエストのOriginヘッダーが http://foo.com である必要があります