从 Yammer 返回网络子域
Returning the network subdomain from Yammer
我在 rails 上有一个 ruby 应用程序,它通过 Yammer 对用户进行身份验证,然后根据他们的网络名称将他们重定向到正确的租户。
工作流程基本上是这样的:
用户看到 sign-in/sign-up 页面
通过 Yammer 进行身份验证 API 并重定向回回调 URL (yammer.example.com/auth
)
回调控制器然后查看身份验证响应,并确定用户所属的网络。
我重定向到子域上的那个租户(例如 my-network.example.com
)并让用户登录
这里还有一些其他事情在后台进行(网络中其他用户的创建、用户匹配等),但我遇到的问题是实际网络名称和子域的创建和重定向。
目前解析子域名的方式是使用用户网络名的SLD。
举个例子network_name: "example.com"
returns "example"作为子域我们要create/redirect到.
在我们开始使用付费 Yammer 帐户进行测试之前,这一切都运行良好,他们的网络名称似乎与我们当前的代码不兼容。
这是我们目前使用的:
if PublicSuffix.valid?(auth.extra.raw_info.network_name.mb_chars.normalize(:kc).to_s.downcase)
yammer_domain = PublicSuffix.parse(auth.extra.raw_info.network_name.mb_chars.normalize(:kc).downcase)
subdomain = yammer_domain.sld.gsub(/[^0-9A-Za-z]/, '')
else
subdomain = auth.extra.raw_info.network_name.downcase.gsub(/[^0-9A-Za-z]/, '')
end
我承认目前这不是最干净的,因为我一直在进行一些黑客攻击,试图在网络名称不正确的时候捕捉并修复它。我将所有字符标准化,然后使用 PublicSuffix gem 解析 SLD。
如果它不是一个有效的域,那么我会尝试规范化字符并删除我们不需要的所有内容(所以 L'oreal 之类的东西会变成 欧莱雅).
这似乎仍然会引发错误并且无法正确解析。
所以我的问题是:
付费帐户与免费帐户的网络名称设置方式有什么不同吗?有没有更可靠的方法 return 使用 Yammer API 解析子域的网络名称?
Is there anything different about how the network names are set up
with paid accounts vs. free accounts?
不,没有。
Is there a more reliable way to return the network name to parse for
subdomains using the Yammer API?
如果我正确理解了您的尝试,我认为 "network_name" 不是要使用的正确 JSON 对象。网络管理员可以决定随时更改网络名称,这会搞砸您的应用程序。
我建议您使用 "network_domains"。此 JSON 对象的值包含登录用户所属的所有 yammer 网络的列表,列表中的第一项始终是用户的主要网络。
例如,对 api/v1/users/current.json 的 GET 请求的结果将包含如下内容:
network_domains":["jet.usa.cc","jet.onmicrosoft.com","jet2.onmicrosoft.com"]
在上面的示例中,jet.usa.cc 是登录用户的主要网络。网络域名不能更改,它是一个常量。您可以在您的 RoR 应用程序中提取主要网络的价值,并根据需要使用它。
我在 rails 上有一个 ruby 应用程序,它通过 Yammer 对用户进行身份验证,然后根据他们的网络名称将他们重定向到正确的租户。
工作流程基本上是这样的:
用户看到 sign-in/sign-up 页面
通过 Yammer 进行身份验证 API 并重定向回回调 URL (
yammer.example.com/auth
)回调控制器然后查看身份验证响应,并确定用户所属的网络。
我重定向到子域上的那个租户(例如
my-network.example.com
)并让用户登录
这里还有一些其他事情在后台进行(网络中其他用户的创建、用户匹配等),但我遇到的问题是实际网络名称和子域的创建和重定向。
目前解析子域名的方式是使用用户网络名的SLD。
举个例子network_name: "example.com"
returns "example"作为子域我们要create/redirect到.
在我们开始使用付费 Yammer 帐户进行测试之前,这一切都运行良好,他们的网络名称似乎与我们当前的代码不兼容。
这是我们目前使用的:
if PublicSuffix.valid?(auth.extra.raw_info.network_name.mb_chars.normalize(:kc).to_s.downcase)
yammer_domain = PublicSuffix.parse(auth.extra.raw_info.network_name.mb_chars.normalize(:kc).downcase)
subdomain = yammer_domain.sld.gsub(/[^0-9A-Za-z]/, '')
else
subdomain = auth.extra.raw_info.network_name.downcase.gsub(/[^0-9A-Za-z]/, '')
end
我承认目前这不是最干净的,因为我一直在进行一些黑客攻击,试图在网络名称不正确的时候捕捉并修复它。我将所有字符标准化,然后使用 PublicSuffix gem 解析 SLD。
如果它不是一个有效的域,那么我会尝试规范化字符并删除我们不需要的所有内容(所以 L'oreal 之类的东西会变成 欧莱雅).
这似乎仍然会引发错误并且无法正确解析。
所以我的问题是:
付费帐户与免费帐户的网络名称设置方式有什么不同吗?有没有更可靠的方法 return 使用 Yammer API 解析子域的网络名称?
Is there anything different about how the network names are set up with paid accounts vs. free accounts?
不,没有。
Is there a more reliable way to return the network name to parse for subdomains using the Yammer API?
如果我正确理解了您的尝试,我认为 "network_name" 不是要使用的正确 JSON 对象。网络管理员可以决定随时更改网络名称,这会搞砸您的应用程序。
我建议您使用 "network_domains"。此 JSON 对象的值包含登录用户所属的所有 yammer 网络的列表,列表中的第一项始终是用户的主要网络。 例如,对 api/v1/users/current.json 的 GET 请求的结果将包含如下内容:
network_domains":["jet.usa.cc","jet.onmicrosoft.com","jet2.onmicrosoft.com"]
在上面的示例中,jet.usa.cc 是登录用户的主要网络。网络域名不能更改,它是一个常量。您可以在您的 RoR 应用程序中提取主要网络的价值,并根据需要使用它。