# OAuth2 Facebook
> A Facebook OAuth2 Provider for Elixir
[![Build Status](https://travis-ci.org/chrislaskey/oauth2_facebook.svg?branch=master)](https://travis-ci.org/chrislaskey/oauth2_facebook)
[![Coverage Status](https://coveralls.io/repos/github/chrislaskey/oauth2_facebook/badge.svg?branch=master)](https://coveralls.io/github/chrislaskey/oauth2_facebook?branch=master)
OAuth2 Facebook is convenience library built on top of [`oauth2`](https://hex.pm/packages/oauth2). It adds Facebook specific functions to interact with the Facebook Graph endpoints using OAuth2.
## Installation
```elixir
# mix.exs
def application do
# Add the application to your list of applications.
# This will ensure that it will be included in a release.
[applications: [:logger, :oauth2_facebook]]
end
defp deps do
# Add the dependency
[{:oauth2_facebook, "~> 0.1"}]
end
```
## Authenticating a User
> For an easy-to-use, end-to-end solution enabling users to log in with Facebook see [`ueberauth/ueberauth_facebook`](https://github.com/ueberauth/ueberauth_facebook)
One common use-case is authenticating a user's identify. The `get_user!` function wraps two actions into one - exchanging the callback code for a short-lived access token and using the access token to return user data:
```elixir
alias OAuth2.Provider.Facebook
Facebook.get_user!([code: "<callback-code>"], [redirect_uri: "..."])
```
When successful, it returns the user data:
```elixir
{:ok, %{"email" => "user@gmail.com", "gender" => "male", "id" => "101", "link" => "https://www.facebook.com/app_scoped_user_id/101/", "locale" => "en_US", "name" => "user", "timezone" => -4, "updated_time" => "2015-06-05T14:59:20+0000", "verified" => true}}
```
## Returning an Access Token
A valid access token can be used to make multiple requests to the Facebook Graph. The callback code can be exchanged for an access token using `get_token!`:
```elixir
alias OAuth2.Provider.Facebook
client = Facebook.get_token!([code: "<callback-code>"], [redirect_uri: "..."])
```
When successful, it will return a valid `OAuth2.Client`:
```
%OAuth2.Client{authorize_url: "https://www.facebook.com/dialog/oauth", client_id: "<...>", client_secret: "<...>", headers: [], params: %{}, redirect_uri: "http://localhost:3000/login/facebook/callback", ref: nil, request_opts: [], site: "https://graph.facebook.com", strategy: OAuth2.Provider.Facebook, token: %OAuth2.AccessToken{access_token: "EAABw0PjpdjcBAMDUjWQtZApFV2nFJfhIUWaw3z8MSbi92fVooa2BNBdZBeRaxMcHO94zdmncoFuZBvQQdj0cmXosa8kAZCx7wtlSR5ByT2etOhURZCNjs9DDFfpU456Gk8f0tvzmtYsiMstSKkh69kIzSVOeQIx8TPQOLpXHnRCARNXCiiB1Y", expires_at: 1507926168, other_params: %{}, refresh_token: nil, token_type: "Bearer"}, token_method: :get, token_url: "/v2.8/oauth/access_token"}
```
**Note:** The access token is kept under the client's `token` key.
## Using a Valid Client
A valid client with an access token can then be passed into endpoint specific functions. For example, to return user data using a `client` with a valid access token:
```elixir
alias OAuth2.Provider.Facebook
{:ok, user} = Facebook.get_user(client)
```
When successful, it will return the same user information:
```elixir
%{"email" => "user@gmail.com", "gender" => "male", "id" => "101", "link" => "https://www.facebook.com/app_scoped_user_id/101/", "locale" => "en_US", "name" => "user", "timezone" => -4, "updated_time" => "2015-06-05T14:59:20+0000", "verified" => true}
```
## Filtering User fields
Both `get_user!` and `get_user` support passing custom query params. These can be used to filter the returned attributes:
```elixir
alias OAuth2.Provider.Facebook
# Using `get_user!`
user = Facebook.get_user!([code: "<callback-code>"], [redirect_uri: "..."], [fields: "email,name"])
# Using `get_user`
client = Facebook.get_token!([code: "<callback-code>"], [redirect_uri: "..."])
{:ok, user} = Facebook.get_user(client, [fields: "email,name"])
```
When successful, will return a trimmed down user:
```elixir
%{"email" => "user@gmail.com", "id" => "101", "name" => "user"}
```
**Note:** The `id` value is always returned.