Поскольку меня попросили дать более глубокое понимание этого, я продолжу и опубликую решение, которое я в итоге реализовал.
Добавьте это в свой gemfile:
gem 'omniauth-microsoft_v2_auth'
Добавьте это в конец файла config / devise.rb:
config.omniauth :microsoft_v2_auth, ENV['CLIENT_ID'], ENV['CLIENT_SECRET']
Вам придется добавить эти переменные среды в вашу среду. Обычно я использую драгоценный камень Figaro во время разработки, а затем устанавливаю его через CLI Heroku при развертывании.
Вам нужно будет направить пользователей к вашей аутентификации Azure через контроллер сессий. Добавьте это в свой файл rout.rb:
devise_for :users, :controllers => {sessions: 'sessions', registrations: 'registrations', omniauth_callbacks: "callbacks"}
devise_scope :user do
post 'users/sign_in_with_azad_token' => 'sessions#sign_in_with_azad_token'
end
Вот как я реализую действие в моем контроллере сессий:
def sign_in_with_azad_token
token = params[:token]
# Use the graph API to ensure this user is legit
uri = URI("https://graph.microsoft.com/v1.0/me/")
request = Net::HTTP::Get.new(uri.request_uri)
request['authorization'] = "Bearer #{token}"
response = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
http.request(request)
end
json = JSON.parse(response.body)
if json["error"].nil?
# If no error, user was found
user = User.from_uid_email(json["id"], json["userPrincipalName"])
unless user.nil?
sign_in("user", user)
respond_to do |format|
format.json { return render :json => { :success => true, :user => user } }
end
else
respond_to do |format|
format.json { return render :json => { :success => false, :message => "You must sign in before continuing" }, status: :unauthorized }
end
end
else
respond_to do |format|
format.json { return render :json => { :success => false, :message => json["error"]["message"]}, status: :unauthorized }
end
end
end
Возможно, вы захотите, чтобы ваши пользователи могли проходить аутентификацию с помощью Microsoft Azure в веб-браузере. В этом случае вам нужно добавить это в ваше новое представление регистрации Devise (мое находится в views / devise / registrations / new.html.erb и views / devise / shared / _links.html.erb):
<%- if devise_mapping.omniauthable? %>
<%- resource_class.omniauth_providers.each do |provider| %>
<%= link_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", omniauth_authorize_path(resource_name, provider) %><br />
<% end -%>
<% end -%>
Наконец, конечная точка, где мое клиентское приложение выполняет вход в систему, находится в ... [server_url] /users/sign_in_with_azad_token.json
Я достиг этой конечной точки после того, как аутентифицировался с помощью MSAL iOS Framework на стороне приложения и получил токен. Я включаю токен в полезную нагрузку JSON, которая является частью тела запроса. Полезная нагрузка просто:
{
"token" : "dj9hs0shgkshd93hs92bh7493"
}
Надеюсь, это поможет. Прошло много времени с тех пор, как я работал над этим, поэтому, возможно, я кое-что забыл. Добавьте комментарий к этому ответу, если что-то кажется отсутствующим.