Wp Open Social 插件中新浪微博登录接口403代码

社区话题 wordpress开发 Wp Open Social 插件中新浪微博登录接口403代码

正在查看 1 条回复
  • 作者
    帖子
    • #397

      追光
      管理员

      以下是针对提供的 Wp Open Social 插件中新浪微博登录接口的代码,详细背景说明、问题原因与使用说明,适合作为教程文档或开发笔记:


      ? 背景说明:WordPress 微博登录头像无法显示问题

      在使用 WordPress 插件 WP Open Social(第三方登录) 并集成 新浪微博登录功能时,部分用户发现:

      ✅ 登录成功后用户创建正常,但微博头像地址显示为 403 Forbidden,无法加载图片。

      ? 问题原因解析

      这是由于新浪微博对头像资源开启了防盗链保护,如果你尝试直接引用以下类似地址:

      https://tva1.sinaimg.cn/.../avatar_large/abc123.jpg

      在非新浪系站点中(如你的 WordPress 站点)直接使用 <img> 标签加载头像,会因 HTTP Referer 校验失败而返回 403。


      ⚙️ 插件内部逻辑(Sina 部分)

      我们来看核心类 WPOS_SINA_CLASS,它处理微博登录全过程,包括用户授权 → 获取 access token → 拉取用户信息:

      class WPOS_SINA_CLASS {

      ? 1.

      open_login($state, $info)

      拼接新浪 OAuth 登录地址并跳转:

      https://api.weibo.com/oauth2/authorize

      用于用户授权。


      ? 2.

      open_callback($code, $info)

      授权完成后回调,调用:

      https://api.weibo.com/oauth2/access_token

      获取用户 access token 和 uid 并存入 session。


      ? 3.

      open_new_user($info)

      通过:

      https://api.weibo.com/2/users/show.json

      接口拉取微博昵称和头像信息:

      $_SESSION['open_img'] = $user['avatar_large'];

      此处的头像地址即微博图片地址,存在防盗链问题


      ✅ 解决方案建议:头像本地化存储

      为避免用户登录后头像加载失败(403),你可以将微博头像 在登录成功后自动下载并保存至本地

      ? 示例处理方法(可加入

      open_new_user

      之后):

      function download_and_store_weibo_avatar($url, $user_id) {
          $upload_dir = wp_upload_dir();
          $avatar_data = wp_remote_get($url);
      
          if (!is_wp_error($avatar_data) && $avatar_data['response']['code'] == 200) {
              $filename = 'weibo_avatar_' . $user_id . '.jpg';
              $filepath = $upload_dir['path'] . '/' . $filename;
              file_put_contents($filepath, wp_remote_retrieve_body($avatar_data));
      
              // 生成 URL 并保存至 user meta
              $avatar_url = $upload_dir['url'] . '/' . $filename;
              update_user_meta($user_id, 'weibo_avatar', esc_url_raw($avatar_url));
          }
      }

      你可以在 user_register 后调用这个函数,将微博头像下载到本地并绑定给用户。


      ? 总结说明

      项目

      说明

      问题

      微博头像被新浪图床防盗链保护,导致外站引用报 403

      原因

      HTTP Referer 检测导致无法嵌入 <img> 显示

      插件行为

      使用微博 API 正常获取头像 URL,但未处理防盗链

      解决方案

      登录成功后,将头像下载到本地,并在用户头像中引用本地路径

      建议位置

      open_new_user 后追加头像下载逻辑

    • #401

      追光
      管理员

      以下是追光当前处理微博头像防盗链问题的方式的完整简介,包含背景说明、你的解决策略、代码作用解析,以及为何这种方式有效稳定,适合编写成教程文档或开发笔记:


      ? 背景说明:新浪微博登录后的头像加载失败(403)

      在 WordPress 使用 WP Open Social 插件集成 新浪微博登录功能后,系统会通过微博 API 拉取用户的头像 avatar_largeprofile_image_url,并显示在用户资料中。

      但近期微博开启了图片防盗链策略,即:

      • 非新浪系域名直接 <img> 引用微博图床地址;

      • 如果请求中 Referer 不是新浪域名,会返回 HTTP 403 错误,导致头像不显示。


      ✅ 你的当前处理方式简介(Jisongbin 方案)

      为避免这种跨域头像加载失败的情况,你采取了本地替代图方案,即:

      ? 暂时不再从微博接口读取真实头像,而是统一使用主题中的一张默认头像图作为新浪用户登录后的头像。

      代码实现如下:

      // ⛔ 替代原有的微博头像逻辑
      $_SESSION['open_img'] = get_stylesheet_directory_uri() . '/skin/sina-avatar.jpg';

      ✅ 保留昵称和用户主页地址信息(可选)

      $user = open_social_http("https://api.weibo.com/2/users/show.json?access_token=...&uid=...");


      ? 实际效果与优点

      • 避免头像403问题:不再引用微博图床,完全规避防盗链策略;

      • 本地稳定加载:所有头像来自本地 /skin/sina-avatar.jpg,可控、快速;

      • 无需额外存储或下载逻辑:不涉及 WordPress 媒体库写入,逻辑更轻便;

      • 适合站点风格统一:所有新浪用户使用统一默认头像,不影响使用;

      • 可日后扩展为头像本地下载器:留有接口空间恢复真实头像逻辑。


      ? 代码结构说明

      function open_new_user($info) {
          // ✅ 当前头像策略
          $_SESSION['open_img'] = get_stylesheet_directory_uri() . '/skin/sina-avatar.jpg';
      
          // ✅ 保留昵称与主页信息(可选)
          $user = open_social_http("https://api.weibo.com/2/users/show.json?access_token=...&uid=...");
          open_social_check($user, $_SESSION['access_token'], 'screen_name');
      
          return [
              'nickname' => $user['screen_name'],
              'user_url' => 'https://weibo.com/' . $user['profile_url']
          ];
      }


      ? 推荐存储路径与命名

      将你使用的默认头像放置于当前主题子目录中:

      /wp-content/themes/your-theme-name/skin/sina-avatar.jpg

      大小建议控制在 96×96128×128 左右,保持 WordPress 的头像一致性。


      ? 后续扩展建议(可选)

      • 日后可以恢复头像抓取逻辑,并将头像下载到本地(通过 media_handle_sideload 等方式);

      • 若希望自动替换 Gravatar,可钩入 get_avatar_url() 并做用户类型检测;

      • 可扩展支持其他平台的防盗链图像处理(如 QQ、Gitee 等)。


      ✅ 总结

      目前的处理方式属于一种兼容性极高的临时解决方案,有效绕过新浪微博头像加载失败的问题,同时保持用户界面一致、清洁,未来也具备可扩展性,推荐其他集成微博登录的开发者参考使用。

正在查看 1 条回复
  • 在下方一键注册,登录后就可以回复啦。