ruby-on-rails - 使用 Rails 和设计的 Azure AD 身份验证
问题描述
我有一个带有设计配置和 mongodb 数据库的 rails 应用程序。我想配置 Microsoft azure AD 进行身份验证。当用户输入我的项目 url 并且用户未登录时,它应该重定向到 azure AD 的登录页面,并且当凭据正确时,它应该重定向回我的应用程序。我按照这个博客来实现我的要求。但它会引发随机错误。有人可以建议我怎么做吗?
解决方案
class Integrations::Crm::MsDynamics
extend ActiveSupport::Concern
#to instantiate a new dynamics link directory_id/tenant_id,client_id/application_id,secret,username,password and resource link eg. https://maropost.crm3.dynamics.com
def initialize(tenant_id,client_id,client_secret,username,password,resource)
@tenant_id=tenant_id
@client_id=client_id
@client_secret=client_secret
@username=username
@password=password
@resource=resource
end
def get_token
uri = URI.parse("https://login.microsoftonline.com/#{@tenant_id}/oauth2/token")
request = Net::HTTP::Post.new(uri)
request.content_type = "application/x-www-form-urlencoded"
request["Cache-Control"] = "no-cache"
request.set_form_data(
"client_id" => "#{@client_id}",
"resource" => "#{@resource}",
"username" => "#{@username}",
"password" => "#{@password}",
"grant_type" => "password",
"client_secret" => "#{@client_secret}",
)
req_options = {
use_ssl: uri.scheme == "https",
}
response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
http.request(request)
end
return response
end
def get_access_token(code)
uri = URI.parse("https://login.microsoftonline.com/#{@tenant_id}/oauth2/token")
request = Net::HTTP::Post.new(uri)
request.content_type = "application/x-www-form-urlencoded"
request["Cache-Control"] = "no-cache"
request.set_form_data(
"client_id" => "#{@client_id}",
"client_secret" => "#{@client_secret}",
"code" => "#{code}",
"grant_type" => "authorization_code",
"redirect_uri" => "#{SSL_APP_SITE}/dynamic_crms_callbacks/dynamic_authorization_code",
"resource" => "#{@resource}",
)
req_options = {
use_ssl: uri.scheme == "https",
}
response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
http.request(request)
end
return response
end
def ms_dynamics(response)
obj = JSON.parse(response.body)
client = MSDynamics.new({
hostname: "#{@resource}",
access_token: obj["access_token"],
refresh_token: obj["refresh_token"],
client_id: "#{@client_id}",
client_secret: "#{@client_secret}"
})
return client
end
end
请参考此代码,它将解决您的问题。
推荐阅读
- javascript - 从表行中删除行和重新排序索引
- javascript - JSP Servlet Ajax 调用 (MVC) 遍历 JSON 对象
- node.js - Is there a way to use Aggregation or $sum on dynamic embedded object?
- macos - 证书在钥匙串导入中不可见 - HTTPS 本地服务器 (Chrome/OS)
- jquery - Close a tab in accordion when click on another
- python - 在 Selenium Python 中识别重定向链接
- ajax - 在同一个现有页面上加载新的 xhtml 页面,而不会丢失另一个 html 组件
- javascript - Find input value of a class with distinct id?
- sql-server-2008 - SQL Server 的 2 路 TLS?
- php - Adding attr tag in html via PHP