ruby-on-rails - 在 Rails 应用中获取 Azure AD 目录用户
问题描述
我有一个 Rails 6 应用程序,我想使用 Azure Active Directory 作为身份验证系统(使用开放 id 连接、saml2 和 ldap)。认证完成。现在我正在尝试显示用户信息,例如姓名或电子邮件地址。我还希望能够导出目录的所有用户。
我试图像这样设置配置:
- 在我的 Rails 应用程序的管理面板中,管理员可以为我的应用程序配置 Azure AD
- 在配置中,管理员复制并粘贴 Azure AD 提供的配置链接(JSON 响应)
- 然后,复制并粘贴应用程序 client_id
- 然后,tenant_id(目录id)
这是我希望工作的一段代码:
def update_oidc
identity_provider = IdentityProvider.find_by(provider_type: 'open_id_connect', id: params[:id])
client_id = params[:client_id].strip
metadata_url = params[:metadata_url].strip
tenant_id = params[:tenant_id].strip
metadata = HTTParty.get(metadata_url).parsed_response
identity_provider.update(config: {
metadata: metadata,
metadata_url: metadata_url,
client_id: client_id,
tenant_id: tenant_id,
})
if tenant_id
directory_access_url = "https://graph.windows.net/#{tenant_id}/users?api-version=1.6"
result = HTTParty.get(directory_access_url).parsed_response
identity_provider.directories.find_or_create_by(tenant_id: tenant_id).update(
business_phones: result["business_phones"],
display_name: result["display_name"],
given_name: result["given_name"],
job_title: result["job_title"],
email: result["user_principal_name"],
mobile_phone: result["mobile_phone"],
office_location: result["office_location"],
surname: result["surname"]
)
end
redirect_to identity_provider
end
由于tenant_id
是目录 ID,我认为我们可以通过这种方式访问用户信息(并遵循 Microsoft Docs)。问题是,它不起作用,因为即使我在我的应用程序中连接到我的 Azure AD 目录,当我运行时result = HTTParty.get(directory_access_url).parsed_response
,我有一个身份验证错误,告诉我令牌已过期或我需要连接。
我不想使用 PowerShell 或类似的东西。我希望能够通过我的应用程序访问目录数据。
有人可以告诉我我做错了什么或想出一个主意吗?
谢谢
解决方案
仅根据您的代码,我认为您希望Get users
使用jnunemaker/httparty
库通过 Azure AD Graph REST API 获取用户集合。
但是,它似乎缺少所需的标头Authorization
及其值,如官方文件Bearer eyJ0eX ... FWSXfwtQ
的部分所述。同时,您已经完成了身份验证,但 Azure AD Graph API 需要访问令牌作为OAuth2 的值,如下面的内容所述。Authentication and authorization
Operations overview | Graph API concepts
OpenID Connect
Authorization
Graph API 根据令牌中存在的 OAuth 2.0 权限范围执行授权。有关 Graph API 公开的权限范围的更多信息,请参阅Graph API 权限范围。
为了让您的应用通过 Azure AD 进行身份验证并调用 Graph API,您必须将其添加到您的租户并将其配置为需要 Windows Azure Active Directory 的权限(OAuth 2.0 权限范围)。有关添加和配置应用程序的信息,请参阅将应用程序与 Azure Active Directory 集成。
Azure AD 使用 OAuth 2.0 身份验证协议。你可以详细了解 Azure AD 中的 OAuth 2.0,包括 Azure AD 中OAuth 2.0 中支持的流和访问令牌。
因此,恐怕您必须再次通过 Azure AD 的 OAuth2 手动获取访问令牌才能使用 Graph API,或者只是简单地参考samples/authorization_code_example/web_app.rb
使用Rubyadal
的 GitHub 存储库库的示例代码。AzureAD/azure-activedirectory-library-for-ruby
推荐阅读
- php - PHP / SQL Ban状态未回显
- oracle - Oracle XML 解析 - ORA-19202 和 LPX-00601
- php - 如何在php中设置修复时间变量?
- google-cloud-firestore - Flutter Firestore 分页
- go - 有没有办法对 Go 编译器生成的 windows 可执行文件进行签名?
- nosql - 是否可以查询 Google Cloud Datastore 中没有后代的实体?
- java - Java - IllegalStateException:“springSecurityFilterChain”的重复过滤器注册
- angular - Angular 5 - 如何在第一个表单构建后让日期管道以动态表单正确呈现?
- python - NameError:名称“移动”是注释定义的(功能)
- javascript - 如何使用幻灯片动画移动 div?