草庐IT

php - Soundcloud (Oauth2) API 获取访问 token 失败

coder 2024-04-07 原文

我正在尝试根据 Soundcloud 登录授权我网站上的用户。

它使用 Oauth 身份验证。

用户必须点击我网站上的一个按钮,然后被重定向到 Soundcloud 网站,并在那里登录。

之后,用户被重定向回我的站点,我必须在其中获取 accessToken。

失败并显示消息:请求的 URL 以 HTTP 代码 0 响应。

如果你需要的话,我已经把 curl 的东西扔掉了:

 [data]; False
 [info][url]                    : https://api.soundcloud.com/oauth2/token
       [content_type]           ; NULL
       [http_code]              : 0
       [header_size]            : 0
       [request_size]           : 0
       [filetime]               : -1
       [ssl_verify_result]      : 0
       [redirect_count]         : 0
       [total_time]             : 0.031
       [namelookup_time]        : 0
       [connect_time]           : 0.031
       [pretransfer_time]       : 0
       [size_upload]            : 0
       [size_download]          : 0
       [speed_download]         : 0
       [speed_upload]           : 0
       [download_content_length]: -1
       [upload_content_length]  : -1
       [starttransfer_time]     : 0
       [redirect_time]          : 0
       [certinfo]               []

我执行的代码:

    $soundcloud = new SoundcloudModel('*****', '*****', '*****');

    try {
        $accessToken = $soundcloud->accessToken($this->request['code']);
    } catch (Services_Soundcloud_Invalid_Http_Response_Code_Exception $e) {
        exit($e->getMessage());
    }

Soundcloud API 代码:

protected function _getAccessToken($postData, $curlOptions = array())
{
    $options = array(CURLOPT_POST => true, CURLOPT_POSTFIELDS => $postData);
    $options += $curlOptions;
    $response = json_decode(
        $this->_request($this->getAccessTokenUrl(), $options),
        true
    );

    if (array_key_exists('access_token', $response)) {
        $this->_accessToken = $response['access_token'];

        return $response;
    } else {
        return false;
    }
}

protected function _request($url, $curlOptions = array())
{
    $ch = curl_init($url);
    $options = $this->_curlOptions;
    $options += $curlOptions;

    if (array_key_exists(self::CURLOPT_OAUTH_TOKEN, $options)) {
        $includeAccessToken = $options[self::CURLOPT_OAUTH_TOKEN];
        unset($options[self::CURLOPT_OAUTH_TOKEN]);
    } else {
        $includeAccessToken = true;
    }

    if (array_key_exists(CURLOPT_HTTPHEADER, $options)) {
        $options[CURLOPT_HTTPHEADER] = array_merge(
            $this->_buildDefaultHeaders(),
            $curlOptions[CURLOPT_HTTPHEADER]
        );
    } else {
        $options[CURLOPT_HTTPHEADER] = $this->_buildDefaultHeaders(
            $includeAccessToken
        );
    }

    curl_setopt_array($ch, $options);

    $data = curl_exec($ch);
    $info = curl_getinfo($ch);

    print_r(array('ch'=>$ch, 'data'=>$data, 'info'=>$info));

    curl_close($ch);

    $this->_lastHttpResponseHeaders = $this->_parseHttpHeaders(
        substr($data, 0, $info['header_size'])
    );
    $this->_lastHttpResponseBody = substr($data, $info['header_size']);
    $this->_lastHttpResponseCode = $info['http_code'];

    if ($this->_validResponseCode($this->_lastHttpResponseCode)) {
        return $this->_lastHttpResponseBody;
    } else {
        throw new Services_Soundcloud_Invalid_Http_Response_Code_Exception(
            null,
            0,
            $this->_lastHttpResponseBody,
            $this->_lastHttpResponseCode
        );
    }
}

抱歉发了这么长的帖子,希望大家能帮帮我!

最佳答案

明白了。

我发现 PHP 使用的 cURL 使用过时的证书包(至少在 Windows 上)。

我已经从以下位置下载了最新的证书包:http://curl.haxx.se/docs/caextract.html 并添加了以下 cURL 选项:

curl_setopt($ch, CURLOPT_CAINFO, 'C:/absolute/path/to/cacert.pem');

关于php - Soundcloud (Oauth2) API 获取访问 token 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5533084/

有关php - Soundcloud (Oauth2) API 获取访问 token 失败的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  3. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  4. ruby-on-rails - Rails 中的 NoMethodError::MailersController#preview undefined method `activation_token=' for nil:NilClass - 2

    似乎无法为此找到有效的答案。我正在阅读Rails教程的第10章第10.1.2节,但似乎无法使邮件程序预览正常工作。我发现处理错误的所有答案都与教程的不同部分相关,我假设我犯的错误正盯着我的脸。我已经完成并将教程中的代码复制/粘贴到相关文件中,但到目前为止,我还看不出我输入的内容与教程中的内容有什么区别。到目前为止,建议是在函数定义中添加或删除参数user,但这并没有解决问题。触发错误的url是http://localhost:3000/rails/mailers/user_mailer/account_activation.http://localhost:3000/rails/mai

  5. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  6. ruby - 简单获取法拉第超时 - 2

    有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url

  7. ruby-on-rails - ActionController::RoutingError: 未初始化常量 Api::V1::ApiController - 2

    我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc

  8. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  9. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  10. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

随机推荐