相关推荐recommended
PHP Twitter 推特 第三方登录
作者:mmseoamin日期:2024-02-28

文档 & 平台 & 说明

  • twitter登录文档
  • 开发者平台
  • 申请成为开发流程按引导操作就可以了, 但是要注意信息填写要真实完善的信息, 否则容易被拒绝(被拒绝可能不能二次申请, 之前不能, 现在不知道能不能)
  • 目前推特一个号只能开通一个免费应用, 可付费开通多个
  • 设置基础信息PHP Twitter 推特 第三方登录,应用设置,第1张
  • User authentication settings 用户认证设置

    PHP Twitter 推特 第三方登录,用户认证设置,第2张

    PHP Twitter 推特 第三方登录,应用信息,第3张

    需要填写重定向地址, 与之后代码中重定向地址要相同

  • 使用 OAuth 2.0, v2 Twitter API 端点, 所以使用 OAuth 2.0的clientID 及 Secret

    PHP Twitter 推特 第三方登录,OAuth2.0,第4张

    流程

    • 生成跳转到twitter授权页面的url
    • 授权后会带着用户code重定向到你的重定向地址
    • 用code获取 access_token
    • 用access_token获取用户信息
    • 获取到用户信息之后就是本身的登录或者注册流程了

      代码

      HTML

      # 一个点击跳转的按钮即可
      
      

      PHP

      /**
       *	登录/注册
       */
      public function signin(Request $request)
      {
      	$type = $request->get('type');
      	if ($type == 'twitter') {
      	    // 生成跳转到twitter授权页面的url, 重定向到授权页面
      		$twitterModel = New NewTwitterLogin()
      		$uri = $twitterModel->createOauthLink();
      		return redirect()->away($url);
      	}
      }
      /**
       *	twitter 回调接口
       */
      public function callBackTwitter()
      {
      	// 获取重定向链接中的code
      	$code = $request->get('code');
          $twitter = new NewTwitterLogin();
          // 用code 获取 access_token
          $token = $twitter->getAccessToken($code);
          // 用 access_token 获取用户信息
          $userInfo = $twitter->getUserInfo($token);
          // 处理自己的登录/注册逻辑
      }
      
      • NewTwitterLogin.php model文件
        
            private $key = '*****';
            private $secret = '*********';
            // oauth 2.0 使用
            private $clientId = '********';
            private $clientSecret = '*******';
            private $redirect_uri = '*****' // 重定向url
            // 创建链接
            public function createOauthLink()
            {
                $url = "https://twitter.com/i/oauth2/authorize?response_type=code&client_id={$this->clientId}&redirect_uri={$this->redirect_uri}&scope=users.read%20tweet.read&state=twitter&code_challenge=challenge&code_challenge_method=plain";
                
                return $url;
            }
            /**
             * 获取access_token
             * 
             * @param string code 登录授权后返回用户code
             */
            public function getAccessToken($code)
            {
                $url = 'https://api.twitter.com/2/oauth2/token';
                // Authorization Basic
                $basic = base64_encode($this->clientId . ':' . $this->clientSecret);
                $header = [
                    "Content-Type: application/x-www-form-urlencoded",
                    "Authorization: Basic $basic",
                ];
                $data = [
                    'code' => $code,
                    'grant_type' => 'authorization_code',
                    'redirect_uri' => $this->redirect_uri,
                    'code_verifier' => 'challenge',
                ];
                $data = http_build_query($data);
                $res = $this->curlMethod($url, $header, $data);
                return $res['access_token'];
            }
            /**
             * 获取用户信息
             */
            public function getUserInfo($token)
            {
                $uri = 'https://api.twitter.com/2/users/me';
                $header = [
                    "Authorization: Bearer $token",
                ];
                $res = $this->curlMethod($uri, $header, [], 'GET');
                return $res['data'];
            }
            public function curlMethod($uri, $header, $data = [], $method = 'POST', $json = true)
            {
                $curl = curl_init();
                if ($data && is_array($data) && $json) {
                    $data = json_encode($data);
                }
                curl_setopt_array($curl, array(
                    CURLOPT_URL => $uri,
                    CURLOPT_RETURNTRANSFER => true,
                    CURLOPT_ENCODING => "",
                    CURLOPT_MAXREDIRS => 10,
                    // CURLOPT_TIMEOUT => 30,
                    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                    CURLOPT_CUSTOMREQUEST => $method,
                    CURLOPT_POSTFIELDS => $data,
                    CURLOPT_HTTPHEADER => $header,
                ));
                $response = curl_exec($curl);
                $err = curl_error($curl);
                curl_close($curl);
                return json_decode($response, true);
            }
        }