PageRenderTime 42ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/apps/user/handlers/login/twitter.php

https://bitbucket.org/jonphipps/elefant-vocabhub
PHP | 111 lines | 82 code | 16 blank | 13 comment | 19 complexity | cebdfa9a5ede74dac4c588fed0773a42 MD5 | raw file
  1. <?php
  2. /**
  3. * Twitter social login handler.
  4. */
  5. if (! in_array ('twitter', $appconf['User']['login_methods'])) {
  6. echo $this->error (404, __ ('Not found'), __ ('The page you requested could not be found.'));
  7. return;
  8. }
  9. $twauth = new tmhOAuth (array (
  10. 'consumer_key' => $appconf['Twitter']['consumer_key'],
  11. 'consumer_secret' => $appconf['Twitter']['consumer_secret']
  12. ));
  13. $here = tmhUtilities::php_self ();
  14. if (strpos ($here, '?redirect=') === false) {
  15. $here .= '?redirect=' . urlencode ($_GET['redirect']);
  16. }
  17. @session_start ();
  18. if (isset ($_SESSION['access_token'])) {
  19. // already have some credentials stored
  20. $twauth->config['user_token'] = $_SESSION['access_token']['oauth_token'];
  21. $twauth->config['user_secret'] = $_SESSION['access_token']['oauth_token_secret'];
  22. $code = $twauth->request ('GET', $twauth->url ('1/account/verify_credentials'));
  23. if ($code == 200) {
  24. // we have a user
  25. $resp = json_decode ($twauth->response['response']);
  26. $uid = User_OpenID::get_user_id ('tw:' . $resp->screen_name);
  27. if ($uid) {
  28. $u = new User ($uid);
  29. }
  30. if ($u) {
  31. // already have an account, log them in
  32. $u->session_id = md5 (uniqid (mt_rand (), 1));
  33. $u->expires = gmdate ('Y-m-d H:i:s', time () + 2592000);
  34. $try = 0;
  35. while (! $u->put ()) {
  36. $u->session_id = md5 (uniqid (mt_rand (), 1));
  37. $try++;
  38. if ($try == 5) {
  39. $this->redirect ($_GET['redirect']);
  40. }
  41. }
  42. $_SESSION['session_id'] = $u->session_id;
  43. // save token
  44. $oid = new User_OpenID (array (
  45. 'token' => 'tw:' . $resp->screen_name,
  46. 'user_id' => $u->id
  47. ));
  48. $oid->put ();
  49. $this->redirect ($_GET['redirect']);
  50. } else {
  51. // signup form to create a linked account, prefill name
  52. $_POST['name'] = $resp->name;
  53. $_POST['redirect'] = $_GET['redirect'];
  54. $_POST['token'] = 'tw:' . $resp->screen_name;
  55. echo $this->run ('user/login/newuser');
  56. return;
  57. }
  58. } else {
  59. // error
  60. @error_log ('3. ' . $twauth->response['response']);
  61. $this->redirect ($_GET['redirect']);
  62. }
  63. } elseif (isset ($_REQUEST['oauth_verifier'])) {
  64. // we're being called back by Twitter
  65. $twauth->config['user_token'] = $_SESSION['oauth']['oauth_token'];
  66. $twauth->config['user_secret'] = $_SESSION['oauth']['oauth_token_secret'];
  67. $params = array ('oauth_verifier' => $_REQUEST['oauth_verifier']);
  68. $code = $twauth->request ('POST', $twauth->url ('oauth/access_token', ''), $params);
  69. if ($code == 200) {
  70. $_SESSION['access_token'] = $twauth->extract_params ($twauth->response['response']);
  71. unset ($_SESSION['oauth']);
  72. $this->redirect ($here);
  73. } else {
  74. // error
  75. @error_log ('2. ' . $twauth->response['response']);
  76. $this->redirect ($_GET['redirect']);
  77. }
  78. } else {
  79. // start oauth dance
  80. $params = array (
  81. 'oauth_callback' => $here,
  82. 'x_auth_access_type' => 'read'
  83. );
  84. $code = $twauth->request ('POST', $twauth->url ('oauth/request_token', ''), $params);
  85. if ($code == 200) {
  86. $_SESSION['oauth'] = $twauth->extract_params ($twauth->response['response']);
  87. $authurl = $twauth->url ('oauth/authenticate', '') . '?oauth_token=' . $_SESSION['oauth']['oauth_token'] . '&force_login=1';
  88. $this->redirect ($authurl);
  89. } else {
  90. // error
  91. @error_log ('1. ' . $twauth->response['response']);
  92. $this->redirect ($_GET['redirect']);
  93. }
  94. }
  95. ?>