Check client and token in GET /oauth/authorize
This commit is contained in:
parent
b74f4260ae
commit
df22197755
@ -35,7 +35,7 @@ def authorize(%Plug.Conn{} = conn, %{"authorization" => _} = params) do
|
|||||||
authorize(conn, Map.merge(params, auth_attrs))
|
authorize(conn, Map.merge(params, auth_attrs))
|
||||||
end
|
end
|
||||||
|
|
||||||
def authorize(%Plug.Conn{assigns: %{token: %Token{}}} = conn, params) do
|
def authorize(%Plug.Conn{assigns: %{token: %Token{}}} = conn, %{"force_login" => _} = params) do
|
||||||
if ControllerHelper.truthy_param?(params["force_login"]) do
|
if ControllerHelper.truthy_param?(params["force_login"]) do
|
||||||
do_authorize(conn, params)
|
do_authorize(conn, params)
|
||||||
else
|
else
|
||||||
@ -43,6 +43,22 @@ def authorize(%Plug.Conn{assigns: %{token: %Token{}}} = conn, params) do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Note: the token is set in oauth_plug, but the token and client do not always go together.
|
||||||
|
# For example, MastodonFE's token is set if user requests with another client,
|
||||||
|
# after user already authorized to MastodonFE.
|
||||||
|
# So we have to check client and token.
|
||||||
|
def authorize(
|
||||||
|
%Plug.Conn{assigns: %{token: %Token{} = token}} = conn,
|
||||||
|
%{"client_id" => client_id} = params
|
||||||
|
) do
|
||||||
|
with %Token{} = t <- Repo.get_by(Token, token: token.token) |> Repo.preload(:app),
|
||||||
|
^client_id <- t.app.client_id do
|
||||||
|
handle_existing_authorization(conn, params)
|
||||||
|
else
|
||||||
|
_ -> do_authorize(conn, params)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def authorize(%Plug.Conn{} = conn, params), do: do_authorize(conn, params)
|
def authorize(%Plug.Conn{} = conn, params), do: do_authorize(conn, params)
|
||||||
|
|
||||||
defp do_authorize(%Plug.Conn{} = conn, params) do
|
defp do_authorize(%Plug.Conn{} = conn, params) do
|
||||||
|
@ -468,6 +468,29 @@ test "renders authentication page if user is already authenticated but `force_lo
|
|||||||
assert html_response(conn, 200) =~ ~s(type="submit")
|
assert html_response(conn, 200) =~ ~s(type="submit")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "renders authentication page if user is already authenticated but user request with another client",
|
||||||
|
%{
|
||||||
|
app: app,
|
||||||
|
conn: conn
|
||||||
|
} do
|
||||||
|
token = insert(:oauth_token, app_id: app.id)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> put_session(:oauth_token, token.token)
|
||||||
|
|> get(
|
||||||
|
"/oauth/authorize",
|
||||||
|
%{
|
||||||
|
"response_type" => "code",
|
||||||
|
"client_id" => "another_client_id",
|
||||||
|
"redirect_uri" => OAuthController.default_redirect_uri(app),
|
||||||
|
"scope" => "read"
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
assert html_response(conn, 200) =~ ~s(type="submit")
|
||||||
|
end
|
||||||
|
|
||||||
test "with existing authentication and non-OOB `redirect_uri`, redirects to app with `token` and `state` params",
|
test "with existing authentication and non-OOB `redirect_uri`, redirects to app with `token` and `state` params",
|
||||||
%{
|
%{
|
||||||
app: app,
|
app: app,
|
||||||
|
Loading…
Reference in New Issue
Block a user