使用wp_set_auth_cookie没有任何钩子

时间:2017-06-02 14:08:45

标签: php wordpress wordpress-theming instagram-api wordpress-login

Wordpress版本4.7.5

我正在从Instagram注册新用户,我已成功注册新用户。注册后我试图登录用户。

  

我可以使用钩子,但是想要比脏的更好的解决方案,我   已发布,因为这将是完全无用的。

if( $user_created ) {
    $new_user = get_user_by( 'id', $user_created ); 
    //$loggedin = programmatic_login( $new_user->user_login );
    //ob_start();
    if ( !is_user_logged_in() ) {
        wp_clear_auth_cookie();
        wp_set_current_user( $user_created, $new_user->user_login );
        wp_set_auth_cookie( $user_created, true );
        do_action( 'wp_login', $new_user->user_login );
        // wp_safe_redirect(site_url() . '/profile/');
        // exit;
        // $redirect_to=user_admin_url();
        // wp_safe_redirect($redirect_to);
        // exit();
    }
    //ob_end_clean();
} ?>
<script>jQuery(document).ready(function(){ window.location.href = "<?php echo site_url() . '/profile/'; ?>";});</script> <?php

还尝试使用其他帖子中的自定义programmatic_login功能。

如果我在此下方var_dump wp_get_current_user()$_COOKIE,我会获得wp_get_current_user()array(1) { ["wordpress_test_cookie"]=> string(15) "WP Cookie check" }的{​​{1}}用户对象

重要编辑

代码位于一个函数内部,该函数挂钩到一个钩子,该头部在页面显示之后的页面中调用,因此我们不能在这里使用init。任何其他方式,以及$_COOKIEwp_safe_redirect()也不起作用。

我刚试过的重要更新

肮脏的工作

当我从Instagram登录创建用户时,成功创建后,我将用户重定向到一个get参数类似于header('Location: ')的页面,并在wp hook上,我试图获取?user_id=$inserted_id并记录它它有效,试图找到一个合适的解决方案。

GET['user_id']

然后

if ( $wpdb->insert_id ){  //that is registration with instagram
   ?>
    <script>jQuery(document).ready(function(){ window.location.href = "<?php echo get_bloginfo('url') . '/profile/?id=' . $wpdb->insert_id; ?>";});</script>
   <?php
}
  

肮脏的技巧问题。如果add_action( 'wp', 'login_current_user' ); function login_current_user(){ if ( is_page() && get_the_id() == 863 ){ if ( isset( $_GET['id'] ) ){ if ( !is_user_logged_in() ) { $user_id = $_GET['id']; $user = get_user_by( 'id', $user_id ); wp_clear_auth_cookie(); wp_set_current_user( $user_id, $user->user_login ); wp_set_auth_cookie( $user_id, true ); do_action( 'wp_login', $user->user_login ); if ( is_user_logged_in() ){ $redirect_to=site_url() . '/profile'; wp_safe_redirect($redirect_to); exit(); } } } } } 我们作为get参数传递   存在于wp_users表中,然后没有将被记录的验证   in。

更新

我在重定向到个人资料页面之前创建了一个user_meta,并在验证后登录用户并删除了usermeta,就像OTP一样。尽可能让它变得更好。

代码下方: -

id

然后

if ( $wpdb->insert_id ){  //that is registration with instagram
    $temporary_token = sha1(rand());
    update_user_meta( $wpdb->insert_id, 'temporary_token', $temporary_token);
   ?>
    <script>jQuery(document).ready(function(){ window.location.href = "<?php echo get_bloginfo('url') . '/profile/?id=' . $wpdb->insert_id . '&token=' . $temporary_token; ?>";});</script>
   <?php
}

1 个答案:

答案 0 :(得分:3)

如果在调用wp_clear_auth_cookie()wp_set_auth_cookie()之前发送了标头,那么两者都不会起作用,因为它们都依赖于PHP的setcookie功能。 after_setup_theme操作将在标头发送之前发生,因此挂钩并在其中设置Cookie应解决问题。

function myPlugin_createUser(){
  // Probably need to put code that creates user here too otherwise $user_created will never return true
  if( $user_created ) {
      $new_user = get_user_by( 'id', $user_created ); 
      if ( !is_user_logged_in() ) {
          wp_clear_auth_cookie();
          wp_set_current_user( $user_created, $new_user->user_login );
          wp_set_auth_cookie( $user_created, true );
          do_action( 'wp_login', $new_user->user_login );
      }
  } 
}

add_action( 'after_setup_theme', 'myPlugin_createUser' );

更新:

如果您在触发createUser功能之前输出视图元素,它将无法工作,因此我们需要确保它们完全独立于彼此运行。下面我汇总了一个如何实现这一目的的简单示例 - 在视图中我们输出一个传递GET参数的链接,该参数由插件获取并在呈现任何内容之前运行操作允许我们设置cookie

我-plugin.php

// Note: you'll need to include a completed version of myPlugin_createUser() function as above for these examples to work
add_shortcode( 'my-plugin', function() {  
   // I've used a GET request for simplicity- a form + POST request may be more practical for your purposes and will prevent caching issues.
   echo "<a href='?my_plugin_login_user=1'>Login</a>";
});

// Check for our GET parameter 
if( isset( $_GET['my_plugin_login_user'] ) ) {
  // Nothing should be rendered yet as plugin template hasn't even started loading yet so cookies should set fine
  add_action( 'plugins_loaded', 'myPlugin_createUser' ); 
}

页-MY-的template.php

<div> ...
    <?php 
        do_shortcode( 'my-plugin' ); 
    ?>
</div>

更新2: 如果使用Instagrams Authentication API,则显示https://www.instagram.com/developer/authentication/的显式流程(下面使用的大部分示例都是从那里获取)可能是最好的方法。下面我将简要介绍一下如何实现它。其中大部分是从那里添加了注释。

将用户发送至https://api.instagram.com/oauth/authorize/?client_id=CLIENT-ID&redirect_uri=REDIRECT-URI&response_type=code

您可以将WordPress用户ID作为参数包含在回调URL中,或者如果用户尚未创建并且您需要维护状态,那么您需要生成一个临时令牌,您可以在以后使用该令牌与所述数据相关联或存储数据客户端如果它不敏感则可能更容易和更好,因为它不需要用户登录才能运行。

然后用户将登录

关于此步骤的说法不多 - 如果发生错误,他们将被重定向到http://your-redirect-uri?error=access_denied&error_reason=user_denied&error_description=The+user+denied+your+request

如果登录成功,用户将被重定向到http://your-redirect-uri?code=CODE

CODE传回重定向网址,我们可以兑换访问令牌。

所以从这里我们可以通过多种方式处理它,但实际上我们需要的是重定向的端点,我们有足够的控制权来在发送任何HTTP响应主体之前发送HTTP头。

接近此方法(不是详尽的清单):

  • 有条件地在页面上挂钩Instagram身份验证是允许的(如在您的示例中)。这样做的好处是不需要额外的重定向。
  • 自定义页面模板
  • 手动引导WordPress的外部脚本完成我们需要的工作,然后重新引导回来

现在,一旦我们设置了端点,我们需要将CODE兑换为访问令牌。修改了https://gist.github.com/arturmamedov/7f5a90b85a20e06e344ebb88dc898d25

中的此代码段
$uri = 'https://api.instagram.com/oauth/access_token'; 
$data = [
    'client_id' => '213esdaedasdasd12...YOUR_CLIENT_ID', 
    'client_secret' => 'a8b4aaf06c0da310...YOUR_CLIENT_SECRET', 
    'grant_type' => 'authorization_code', 
    'redirect_uri' => 'http://www.YOUR_REDIRECT_URL.it',      // The exact redirect URL as used previously
    'code' => $_GET['code']  
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $uri); // uri
curl_setopt($ch, CURLOPT_POST, true); // POST
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // POST DATA
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // RETURN RESULT true
curl_setopt($ch, CURLOPT_HEADER, 0); // RETURN HEADER false
curl_setopt($ch, CURLOPT_NOBODY, 0); // NO RETURN BODY false / we need the body to return
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // VERIFY SSL HOST false
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // VERIFY SSL PEER false
$result = json_decode(curl_exec($ch));

$ result将是JSON响应的对象表示:

{
"access_token": "fb2e77d.47a0479900504cb3ab4a1f626d174d2d",
"user": {
    "id": "1574083",
    "username": "snoopdogg",
    "full_name": "Snoop Dogg",
    "profile_picture": "..."
  }
}

从这里我们只需使用WordPress创建用户/身份验证并重定向到所需页面/呈现模板(如果通过条件挂钩处理,则无需重定向)并在需要时恢复页面状态。