Current section
Files
Jump to
Current section
Files
lib/maat_feather_web/controllers/oauth_controller.ex
defmodule MaatFeatherWeb.OAuthController do
@moduledoc """
OAuth2 controller.
"""
use MaatFeatherWeb, :controller
alias MaatFeather.Users
alias MaatFeather.Users.User
alias MaatFeather.Auth.Token
action_fallback MaatFeatherWeb.FallbackController
@doc """
this method call a oauth2 provider and redirect to callback
"""
def request(conn, _params), do: send_resp(conn, :ok, "")
def callback(%{assigns: %{ueberauth_failure: _fails}}, _params),
do: {:error, :internal_server_error}
@doc """
this is callback method for oauth2 provider
if user is not found then create new user and return token
if the user is found then return token
## Examples
- **GET** /api/v1/o_auth/github
> to use github oauth2 provider
- **GET** /api/v1/o_auth/google
> to use google oauth2 provider
## Response
```json
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NjE0OTk2NzQsImlzcyI6Im1hYXRfZmVhdGhlciIsImtpZCI6IkI5QUUyNThEMEQ2M0NCMDkiLCJzdWIiOiIyRDJEMkQyRDJENDI0NTQ3NDk0RTIwNTA1NTQyNEM0OTQzMjA0QjQ1NTkyRDJEMkQyRDJEMEE0RDQ5NDc2NjRENDEzMDQ3NDM1MzcxNDc1MzQ5NjIzMzQ0NTE0NTQyNDE1MTU1NDE0MTM0NDc0RTQxNDQ0MzQyNjk1MTRCNDI2NzUxNDQ1NDU3MzA0RDVBMzI2QTU1Nzk3MDM4NEI2OTdBNTMzNjU1MkIzMjc5NUE0QTQ0NjY1MTBBNDM0RTQ3NzU2ODU4NEI0NDc4NjQ2QjREMkY2OTZFNDQ0NjZCMzYzMDMzNDk1NjUyNTc0RjU4NzM0MTY0NUEzMDM0NTYzOTQyNTAyRjMzNEY0QjZCNkI3OTcwNkQ3ODZCNTE3MDU0MzU2QjczNDI2QTZCNzg0RTRDNjQ1ODcwNEYwQTM5NDU0RDQxNDU3NzU5NTUzNTdBNTU0QzQyNjk3Nzc3NTM2NTY3NzE2ODY5NTgzNTQzNzQ2NTY5NzI3MDZFMzI2MjQ4NDI2MzRDNTE0MzY1NEU2MTRDNTA2QTUzNjYzMDMzNEM1MzMxNDQ2NjU4MkI2RDM2NkQ3MDRDN0E2RTc1MEE1MTc2NTc3MzVBNTc0QTM1NjE3MzczNzEzNzRBMzU1ODUyNzc0OTQ0NDE1MTQxNDIwQTJEMkQyRDJEMkQ0NTRFNDQyMDUwNTU0MjRDNDk0MzIwNEI0NTU5MkQyRDJEMkQyRDBBMEEiLCJ0eXAiOiJhY2Nlc3MifQ.cEQ-WWgASZPA1LSff2wQB-js-gk57kOfBwuyv0z6_38DjKc-vkX_sN2yEGtCeGjODVl_KiS12HEVVRXckpZ2ir7gUrwgtb-_OaaEW0LPwLZ3NWqXLDXGqOrbdBIeO2MP5JVUpnbuwtbZt3tOkwXRX-5LvWc1iOWouBnA9CrYnh-hU9tgg259vHbzdKw8MOAbfInywlGrFFztfsqbW2Z58aQdbrOPBZNAXtUqkz0Tp0XGC1ZiqeAkqscZTHKroy8pI00BaUTTndRNySu0GzUd4H-ilLafXybYqfbYZNn2HXZGG_SykpL7v5Cdj4mRqt3TbtzZxV4vlhNjk9YPO_V0uQ"
}
```
"""
def callback(%{assigns: %{ueberauth_auth: auth}} = conn, params) do
user_params = %{
username: auth.info.nickname,
email: auth.info.email,
provider: params["provider"]
}
try do
with %User{} = user <-
Users.get_user_by!(
email: Map.fetch!(user_params, :email),
provider: Map.fetch!(user_params, :provider)
),
{:ok, access_token, _claims} <- Token.encode(user) do
conn
|> put_status(:ok)
|> json(%{access_token: access_token})
end
rescue
_error ->
with {:ok, user} <- Users.create_user(user_params),
{:ok, access_token, _claims} <- Token.encode(user) do
conn
|> put_status(:created)
|> json(%{access_token: access_token})
end
end
end
end