[#923] Support for multiple OAuth consumer strategies.
This commit is contained in:
parent
e17a9a1f66
commit
af68a42ef7
6 changed files with 52 additions and 36 deletions
|
|
@ -187,25 +187,25 @@ defmodule Pleroma.Web.OAuth.OAuthController do
|
|||
|> redirect(to: "/")
|
||||
end
|
||||
|
||||
def callback(%{assigns: %{ueberauth_failure: failure}} = conn, %{"redirect_uri" => redirect_uri}) do
|
||||
def callback(%{assigns: %{ueberauth_failure: failure}} = conn, params) do
|
||||
params = callback_params(params)
|
||||
messages = for e <- Map.get(failure, :errors, []), do: e.message
|
||||
message = Enum.join(messages, "; ")
|
||||
|
||||
conn
|
||||
|> put_flash(:error, "Failed to authenticate: #{message}.")
|
||||
|> redirect(external: redirect_uri(conn, redirect_uri))
|
||||
|> redirect(external: redirect_uri(conn, params["redirect_uri"]))
|
||||
end
|
||||
|
||||
def callback(
|
||||
conn,
|
||||
%{"client_id" => client_id, "redirect_uri" => redirect_uri} = params
|
||||
) do
|
||||
def callback(conn, params) do
|
||||
params = callback_params(params)
|
||||
|
||||
with {:ok, registration} <- Authenticator.get_registration(conn, params) do
|
||||
user = Repo.preload(registration, :user).user
|
||||
|
||||
auth_params = %{
|
||||
"client_id" => client_id,
|
||||
"redirect_uri" => redirect_uri,
|
||||
"client_id" => params["client_id"],
|
||||
"redirect_uri" => params["redirect_uri"],
|
||||
"scopes" => oauth_scopes(params, nil)
|
||||
}
|
||||
|
||||
|
|
@ -230,10 +230,21 @@ defmodule Pleroma.Web.OAuth.OAuthController do
|
|||
_ ->
|
||||
conn
|
||||
|> put_flash(:error, "Failed to set up user account.")
|
||||
|> redirect(external: redirect_uri(conn, redirect_uri))
|
||||
|> redirect(external: redirect_uri(conn, params["redirect_uri"]))
|
||||
end
|
||||
end
|
||||
|
||||
defp callback_params(%{"state" => state} = params) do
|
||||
[client_id, redirect_uri, scope, state] = String.split(state, "|")
|
||||
|
||||
Map.merge(params, %{
|
||||
"client_id" => client_id,
|
||||
"redirect_uri" => redirect_uri,
|
||||
"scope" => scope,
|
||||
"state" => state
|
||||
})
|
||||
end
|
||||
|
||||
def registration_details(conn, params) do
|
||||
render(conn, "register.html", %{
|
||||
client_id: params["client_id"],
|
||||
|
|
|
|||
|
|
@ -1,14 +1,10 @@
|
|||
<h2>External OAuth Authorization</h2>
|
||||
<%= form_for @conn, o_auth_path(@conn, :request, :twitter), [method: "get"], fn f -> %>
|
||||
<div class="scopes-input">
|
||||
<%= label f, :scope, "Permissions" %>
|
||||
<div class="scopes">
|
||||
<%= text_input f, :scope, value: Enum.join(@available_scopes, " ") %>
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
<br>
|
||||
<h2>Sign in with external provider</h2>
|
||||
|
||||
<%= hidden_input f, :client_id, value: @client_id %>
|
||||
<%= hidden_input f, :redirect_uri, value: @redirect_uri %>
|
||||
<%= hidden_input f, :state, value: @state%>
|
||||
<%= submit "Sign in with Twitter" %>
|
||||
<%= for strategy <- Pleroma.Config.get([:auth, :oauth_consumer_strategies], []) do %>
|
||||
<%= form_for @conn, o_auth_path(@conn, :request, strategy), [method: "get"], fn f -> %>
|
||||
<%= hidden_input f, :state, value: Enum.join([@client_id, @redirect_uri, Enum.join(@available_scopes, " "), @state], "|") %>
|
||||
<%= submit "Sign in with #{String.capitalize(strategy)}" %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
|
|
|||
|
|
@ -37,6 +37,5 @@
|
|||
<% end %>
|
||||
|
||||
<%= if Pleroma.Config.get([:auth, :oauth_consumer_enabled]) do %>
|
||||
<br>
|
||||
<%= render @view_module, "consumer.html", assigns %>
|
||||
<% end %>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue