你好,我想获取用户所属的群组。看起来我应该可以通过 get_discourse_user 函数获取这些信息,但该函数似乎没有返回任何群组数据。根据这篇帖子,它应该可以返回?
您是在调用 WP Discourse 函数 get_discourse_user 吗?如果是,它应该在 "groups" 数组中返回用户的群组。
是的,我就是这样调用的。
$discourseUser = \WPDiscourse\Utilities\Utilities::get_discourse_user( $current_user->ID, true );
var_dump($discourseUser);
它返回的内容如下:
object(stdClass)#2784 (25) { ["id"]=> int(7) ["username"]=> string(4) "chad" ["name"]=> string(13) "Chad Campbell" ["avatar_template"]=> string(59) "https://avatars.discourse.org/v4/letter/c/ecccb3/{size}.png" ["active"]=> bool(true) ["admin"]=> bool(false) ["moderator"]=> bool(false) ["last_seen_at"]=> string(24) "2019-10-25T15:59:45.439Z" ["last_emailed_at"]=> string(24) "2019-10-25T15:49:07.084Z" ["created_at"]=> string(24) "2019-10-24T21:22:40.526Z" ["last_seen_age"]=> float(2659.60627934) ["last_emailed_age"]=> float(3297.96116042) ["created_at_age"]=> float(69684.5193464) ["username_lower"]=> string(4) "chad" ["trust_level"]=> int(1) ["manual_locked_trust_level"]=> NULL ["flag_level"]=> int(0) ["title"]=> NULL ["suspended"]=> bool(false) ["time_read"]=> int(0) ["staged"]=> bool(false) ["days_visited"]=> int(2) ["posts_read_count"]=> int(0) ["topics_entered"]=> int(0) ["post_count"]=> int(0) }
函数调用中的 true 参数会指示函数在无法根据 WordPress 用户 ID 找到用户时,尝试通过电子邮件地址在 Discourse 中搜索该用户。这意味着该用户尚未通过 SSO 登录 Discourse。当通过电子邮件地址找到用户时,从 Discourse 返回的信息会比通过 WordPress ID 找到用户时少。
或许可以改进该函数,使返回值更加清晰。目前,如果响应中没有 groups 数组,即可知道该用户是通过电子邮件地址找到的。
明白了。谢谢你的解释,Simon!
嘿,Simon,
我通过 SSO 登录了 Discourse,但在将 email 参数设置为 false 时看到了这个错误。
object(WP_Error)#2718 (2) { ["errors"]=> array(1) { ["wpdc_response_error"]=> array(1) { [0]=> string(42) "无法检索 Discourse 用户。" } } ["error_data"]=> array(0) { } }
当设置为 True 时,仍然没有返回群组。
有点困惑,因为 SSO 配置让我成功登录了 WordPress 和 Discourse(也能通过 WordPress 同时登出两者),一切看起来都按预期工作,但依然看不到返回的群组。
当您将函数调用的第二个参数设置为 false,或者省略该参数(默认值为 false)时,该函数将尝试根据 WordPress ID 从 Discourse 中检索用户。如果用户已通过 SSO 登录到 Discourse,则该函数应返回用户及其所属群组。
要对此进行调试,请前往您尝试检索的用户的 Discourse 管理页面。滚动到页面底部,查看是否存在“单点登录”部分。如果存在,请确保该部分中的“外部 ID”与您在使用 get_discourse_user 调用时所使用的 WordPress 用户 ID 相匹配。
如果用户的 Discourse 管理页面上没有“单点登录”部分,则说明该用户尚未通过 SSO 登录到 Discourse。
是的,我测试的所有用户都没有看到该部分存在。
不过,我确实是通过 SSO 登录的。
流程如下(未登录 WordPress 或 Discourse):
从 WordPress 点击“使用 Discourse 登录”链接
将我重定向到 Discourse 站点
使用我的 Discourse 凭据登录
成功重定向回 WordPress 站点
现在我已同时登录两个站点
我还需要在流程中完成哪些步骤才能使其正式成为 SSO?
我现在明白问题了。你正在将 Discourse 用作 WordPress 的 SSO 提供商。该功能本意是用于 WordPress 作为 Discourse 的 SSO 提供商的场景。这个功能的名字起得不太恰当,应该更清楚地说明其适用场景。
对于 Discourse 作为 WordPress 的 SSO 提供商的情况,你需要向 /admin/users/$user_id.json 发起一个经过身份验证的 API 请求。$user_id 需要设置为用户的 Discourse ID。对于通过 Discourse 登录到 WordPress 的用户,你可以通过以下方式获取他们的 Discourse 用户 ID:
get_user_meta( $wp_user_id, 'discourse_sso_user_id', true );
啊,好的。我这就开始深入研究您的 API 文档。感谢您为我指明了正确的方向!