标签: 多站点
正在查看 5 个帖子:1-5 (共 5 个帖子)
-
作者帖子
-
如题 多站点中,子站点设置了不同的域名,如何实现跨站登陆,不需要切换站点,又需要重新登陆
要实现跨站登录,可以使用单点登录 (Single Sign-On,简称 SSO) 的方法。以下是一种实现方式:
- 在主站点上创建一个统一的用户认证系统,可以是自己开发的,也可以使用现有的认证系统,如 OAuth 、 OpenID 等。
- 在子站点的登录页面上添加一个登录按钮或链接,指向主站点的登录页面。
- 当用户点击登录按钮或链接时,跳转到主站点的登录页面。
- 在主站点的登录页面上,用户输入用户名和密码进行登录认证。
- 主站点认证成功后,生成一个加密的令牌 (Token) 。
- 将令牌作为参数附加到回调 URL 中,并将用户重定向回子站点。
- 子站点接收到回调 URL,并从中提取令牌。
- 子站点将令牌发送到主站点进行验证。
- 主站点验证令牌的有效性后,返回用户信息给子站点。
- 子站点使用返回的用户信息进行登录操作,完成跨站登录。
需要注意的是,为了实现跨站登录,主站点和子站点之间需要共享用户认证信息,可以使用共享数据库、共享缓存、共享会话等方式来实现。另外,为了保证安全性,令牌需要进行加密和签名,防止被篡改或伪造。
以上由壳壳虫自动解答供参考,您可以继续跟帖或等待人工回复。
这个问题我们也在调试,之前有个 SSO 方案,但是年久失修,另一种解决方案就是做用户浏览器 cookie 共享,我们还在测试。
尝试把下面的代码加入到你的 mu-plugins 目录里,可以保存为一个 php 文件,就可以实现跨站登录。
我们目前是实现了子站互通,之前的站群内置插件已经太老旧了,新版本在开发,下面代码可以参考
<?php if ( ! is_multisite() ) { return; } function is_sso_site() { return is_main_site(); } function get_sso_login_url( $query_args = [] ) { $query_args = wp_parse_args( $query_args, [ 'multisite_sso_blog_id' => get_current_blog_id(), ] ); return add_query_arg( $query_args, network_site_url( 'wp-login.php', 'login' ) ); } function get_sso_callback_url( $blog_id, $query_args = [] ) { return add_query_arg( $query_args, get_site_url( $blog_id, 'wp-login.php', 'login' ) ); } add_filter( 'login_message', function ( $messages ) { if ( is_user_logged_in() || is_sso_site() ) { return; } $sso_args = []; $redirect_to = filter_input( INPUT_GET, 'redirect_to', FILTER_SANITIZE_URL ); if ( $redirect_to ) { $sso_args['redirect_to'] = rawurlencode( $redirect_to ); } $messages .= '<style type="text/css"> .login .wp-multisite-sso-login--cta a { font-size:inherit; float:none; display:inline-block; width:100%; clear:both; text-align:center; } </style>'; $messages .= sprintf( '<div class="message wp-multisite-sso-login--cta"> <p><a href="%s" class="button button-primary button-large">%s</a></p> </div>', esc_url( get_sso_login_url( $sso_args ) ), esc_html__( 'Login with Multisite SSO' ), ); return $messages; }, 200 ); add_action( 'login_init', function () { if ( ! is_sso_site() || is_user_logged_in() ) { return; } $blog_id = isset( $_REQUEST['multisite_sso_blog_id'] ) ? absint( $_REQUEST['multisite_sso_blog_id'] ) : null; if ( empty( $blog_id ) ) { return; } $blog = get_blog_details( $blog_id ); if ( ! $blog ) { return; } add_action( 'login_form', function () use ( $blog_id ) { ?> <input type="hidden" name="multisite_sso_blog_id" value="<?php echo esc_attr( $blog_id ); ?>"> <?php } ); add_filter( 'wp_login_errors', function ( $errors ) use ( $blog ) { $message = sprintf( esc_html__( 'You are logging into %s' ), sprintf( '<a href="%s" target="_blank">%s</a>', esc_url( $blog->home ), esc_html( $blog->blogname ) ) ); $errors->add( 'multisite_sso_notice', $message, 'message' ); return $errors; } ); } ); add_filter( 'login_redirect', function ( $redirect_to, $requested_redirect_to, $user ) { if ( ! is_sso_site() ) { return $redirect_to; } $blog_id = isset( $_REQUEST['multisite_sso_blog_id'] ) ? absint( $_REQUEST['multisite_sso_blog_id'] ) : null; if ( ! empty( $blog_id ) && $user instanceof WP_User ) { // Add the destination blog hostname to the allowed safe-redirect list. add_filter( 'allowed_redirect_hosts', function ( $hosts ) use ( $blog_id ) { $hosts[] = wp_parse_url( get_site_url( $blog_id ), PHP_URL_HOST ); $hosts[] = wp_parse_url( get_home_url( $blog_id ), PHP_URL_HOST ); return $hosts; } ); $session_token = wp_generate_password( 42, false, false ); // Relay the private session token through a back-channel. update_user_meta( $user->ID, 'multisite_sso_token', $session_token ); $args = [ 'multisite_sso_user_id' => $user->ID, 'multisite_sso_token' => wp_hash( $session_token ), // Transfer hashed for one-time verification. ]; if ( ! empty( $requested_redirect_to ) && $redirect_to !== $requested_redirect_to ) { $args['redirect_to'] = urlencode( $requested_redirect_to ); } return get_sso_callback_url( $blog_id, $args ); } return $redirect_to; }, 100, 3 ); add_action( 'login_init', function () { if ( is_sso_site() || is_user_logged_in() ) { return; } $login_user_id = isset( $_GET['multisite_sso_user_id'] ) ? absint( $_GET['multisite_sso_user_id'] ) : null; $login_token_hash = isset( $_GET['multisite_sso_token'] ) ? sanitize_text_field( $_GET['multisite_sso_token'] ) : null; if ( ! $login_user_id || ! $login_token_hash ) { return; } // Get the session token from the SSO source and delete it to ensure it is used only once. $token_source = get_user_meta( $login_user_id, 'multisite_sso_token', true ); delete_user_meta( $login_user_id, 'multisite_sso_token' ); if ( $token_source && hash_equals( wp_hash( $token_source ), $login_token_hash ) ) { wp_clear_auth_cookie(); wp_set_auth_cookie( $login_user_id ); wp_set_current_user( $login_user_id ); $redirect_to = filter_input( INPUT_GET, 'redirect_to', FILTER_SANITIZE_URL ); if ( ! $redirect_to ) { $redirect_to = get_dashboard_url( $login_user_id ); } wp_redirect( $redirect_to ); exit; } } );
-
作者帖子
正在查看 5 个帖子:1-5 (共 5 个帖子)
- 哎呀,回复话题必需登录。