You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Moodle中配置OAuth2服务调用接口获取完整用户信息

Moodle OAuth2 自定义获取用户完整信息配置方案

方案1:后台配置OAuth2服务映射(无需修改代码,优先推荐)

  • 登录Moodle站点管理员账号,进入「网站管理」-「插件」-「认证」-「OAuth 2 服务」,找到你已配置完成的对应OAuth2发行方条目,点击编辑
  • 找到「Scope 配置」字段,在已有openid mail的基础上补充获取用户信息需要的scope,比如要获取姓名一般需要补充profile scope,具体scope名称可和OAuth2发行方确认
  • 下拉找到「用户属性映射」配置区域,按需添加字段映射规则,示例如下:
    • 将Moodle内firstname(名字字段)映射到OAuth2返回的given_name字段(具体键名以实际userinfo接口返回的参数为准)
    • 将Moodle内lastname(姓氏字段)映射到OAuth2返回的family_name字段
    • 其他需要预填充的字段比如昵称、手机号等都可按该规则配置
  • 找到「Token端点URL」配置项,填入地址:https://{oauthurl}/oauth/v1/token;再找到「Userinfo端点URL」配置项,填入地址:https://{oauthurl}/oauth/v1/userinfo

    Moodle的OAuth2认证插件原生会在授权回调流程中自动向配置的token端点请求access token,不需要手动实现token调用逻辑,拿到token后也会自动请求你配置的userinfo端点拉取用户信息

  • 保存配置后清空Moodle全站缓存,测试新用户OAuth2登录即可看到对应字段自动预填充

方案2:自定义插件扩展(后台配置无法满足自定义字段处理逻辑时使用)

如果需要对返回的用户信息做自定义处理,可通过Moodle事件钩子扩展实现,不要直接修改核心代码避免后续版本升级覆盖修改内容:

  • 创建本地自定义插件,监听auth_oauth2_before_user_login或user_loggedin事件
  • 参考代码片段如下:
// 本地插件的事件观察者逻辑
public static function handle_oauth2_user_login(\core\event\user_loggedin $event) {
    global $DB;
    $user = $DB->get_record('user', ['id' => $event->userid], '*', MUST_EXIST);
    // 校验是否为OAuth2登录用户
    $oauth_link = $DB->get_record('auth_oauth2_linked_login', ['userid' => $user->id]);
    if (empty($oauth_link)) {
        return;
    }
    // 直接获取Moodle已请求到的access token,不需要自行调用token接口
    $issuer = \auth_oauth2\api::get_issuer($oauth_link->issuerid);
    $oauth_client = $issuer->get_oauth2_client();
    $access_token = $oauth_client->get_accesstoken();
    
    // 调用userinfo接口拉取信息
    $ch = curl_init('https://{oauthurl}/oauth/v1/userinfo');
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Authorization: Bearer ' . $access_token
    ]);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
    $userinfo = json_decode(curl_exec($ch), true);
    curl_close($ch);

    // 自定义处理字段更新
    if (!empty($userinfo)) {
        $user->firstname = $userinfo['given_name'] ?? $user->firstname;
        $user->lastname = $userinfo['family_name'] ?? $user->lastname;
        // 其他字段处理逻辑
        user_update_user($user);
    }
}
  • 按照Moodle插件开发规范注册事件观察者后,部署插件并清空缓存即可生效

内容的提问来源于stack exchange,提问作者doremi666

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 18:30:01