OK, a abordagem que está funcionando para mim é a seguinte:
-
Suponha que o banco de dados do usuário do site principal seja autoritativo. O cookie de login do site principal contém um ID e um hash da senha do site.
-
Obtenha o cookie do site principal e revalide-o na API de autenticação do site principal
-
Se válido, use o endereço de e-mail do valor de retorno como o valor
'user_login'
para WP e a senha do site com hash como a senha do WP. -
Teste se esse usuário existe no WP usando
wp_authenticate('user_login', 'user_pass')
. Isso retorna um objetoWP_User
em caso de sucesso ou um objetoWP_Error
em caso de falha. -
Se
WP_Error/is_wp_error()
, use usewp_update_user()
para criar um usuário (ou atualizar um usuário com uma senha alterada). -
Login via
wp_set_current_user()
,wp_set_auth_cookie()
edo_action('wp_login, id)
(Tudo isso está contido em uma função anexada à ação 'init'
)
Isso parece estar funcionando - usuários do site válidos, desconhecidos do WP, são criados automaticamente. As alterações de senha são atendidas e, se o cookie do site estiver definido e o usuário do WP existir, o SSO será automático e praticamente perfeito.