Packages
arke_server
0.3.2
0.5.1
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.4.0-bulk.0
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.1.42
0.1.41
0.1.40
0.1.39
0.1.38
0.1.37
0.1.36
0.1.35
0.1.34
0.1.33
0.1.32
0.1.31
0.1.30
0.1.29
0.1.28
0.1.27
0.1.26
0.1.25
0.1.24
0.1.23
0.1.22
0.1.21
0.1.20
0.1.19
0.1.18
0.1.17
0.1.16
0.1.15
0.1.14
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Arke server
Current section
Files
Jump to
Current section
Files
lib/arke_server/oauth/providers/facebook.ex
defmodule ArkeServer.OAuth.Provider.Facebook do
use ArkeServer.OAuth.Core
@private_oauth_key :arke_server_oauth
def info(conn) do
token_data = conn.private[@private_oauth_key]
%UserInfo{
first_name: token_data["first_name"],
last_name: token_data["last_name"],
email: token_data["email"]
}
end
def uid(conn) do
conn.private[@private_oauth_key]["id"]
end
def handle_cleanup(conn), do: put_private(conn, @private_oauth_key, nil)
def handle_request(%Plug.Conn{query_params: %{"token" => token}} = conn) do
client_id = System.get_env("FACEBOOK_CLIENT_ID", nil)
client_secret = System.get_env("FACEBOOK_CLIENT_SECRET", nil)
query_params = %{"input_token" => token, "access_token" => "#{client_id}|#{client_secret}"}
case HTTPoison.get("https://graph.facebook.com/v14.0/debug_token", [], params: query_params) do
{:ok, %{status_code: 200, body: body}} ->
body = Poison.decode!(body)
case Map.get(body["data"], "app_id") == client_id and
Map.get(body["data"], "is_valid", false) in ["true", "True", "1", true] do
false ->
Plug.Conn.assign(
conn,
:arke_server_oauth_failure,
Error.create(:auth, "invalid token")
)
true ->
get_user_data(conn, token)
end
_ ->
Plug.Conn.assign(
conn,
:arke_server_oauth_failure,
Error.create(:auth, "invalid token")
)
end
end
def handle_request(conn) do
{:error, msg} = Error.create(:auth, "token not found")
Plug.Conn.assign(
conn,
:arke_server_oauth_failure,
msg
)
end
defp get_user_data(conn, token) do
query_params = %{"fields" => "id,first_name,last_name,email", "access_token" => token}
case HTTPoison.get("https://graph.facebook.com/v14.0/me", [], params: query_params) do
{:ok, %{status_code: 200, body: body}} ->
body = Poison.decode!(body)
put_private(conn, @private_oauth_key, body)
_ ->
Plug.Conn.assign(
conn,
:arke_server_oauth_failure,
Error.create(:auth, "invalid token")
)
end
end
end