天道酬勤,学无止境

沃尔玛卖家 API POST 不起作用,仅在 PHP 中提供 401 未授权(Walmart Seller API POST not working, Gives 401 unauthorized in PHP only)

问题

我正在尝试使用 CURL PHP 来获取 Walmart Seller API 来确认。 有人可以建议我需要使用哪个 RSA PHP 库吗? 以便在致电沃尔玛时验证身份验证签名。

有这方面的经验吗?

$headers = array(
    'WM_SVC.NAME: Walmart Marketplace',
    'WM_QOS.CORRELATION_ID: 14730688612',
    'WM_SEC.TIMESTAMP:14730688612',
    'WM_SEC.AUTH_SIGNATURE: XXXXXXXXXXX'
    'WM_CONSUMER.ID: XXXXXXXXXXX',
    'Content-Type: application/xml',
    'Accept: application/xml',
 );


$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_URL,$requestUrl);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec( $ch );
if(curl_errno($ch)):
    echo 'Curl error: '.curl_error($ch);
endif;

我使用了谷歌搜索时找到的参考。

 - https://github.com/fillup/walmart-auth-signature-php
回答1

最难的部分是生成签名并使其正常工作。

我从不同的地方提取了很多这些片段来给出一个直接的例子,所以希望它会起作用。

假设我们要进行 GET 调用以获取我们所有的提要状态。

// Your walmart info from walmart admin
$walmart_consuer_id = XXXXXXXXXXXXX;
$walmart_channel_type = XXXXXXXXXXXX;

$request_type = "GET";

$url = "https://marketplace.walmartapis.com/v2/feeds";

// We need a timestamp to generate the signature and to send as part of the header
$timestamp = round(microtime(true) * 1000);

$signature = getClientSignature($url, $request_type, $timestamp);

$headers = array();
$headers[] = "Accept: application/xml";
$headers[] = "WM_SVC.NAME: Walmart Marketplace";
$headers[] = "WM_CONSUMER.ID: ".$walmart_consuer_id;
$headers[] = "WM_SEC.TIMESTAMP: ".$timestamp;
$headers[] = "WM_SEC.AUTH_SIGNATURE: ".$signature;
$headers[] = "WM_QOS.CORRELATION_ID: ".mt_rand();
$headers[] = "WM_CONSUMER.CHANNEL.TYPE: " .$walmart_channel_type;

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_FAILONERROR, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $request_type);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);

function getClientSignature($url, $request_type, $timestamp) {
  // Your walmart info from walmart admin
  $walmart_secret = XXXXXXXXXXXXXXXX;
  $walmart_consuer_id = XXXXXXXXXXXXX;

  // Get an openssl usable private key from the walmart supplied secret
  $pem = pkcs8_to_pem(base64_decode($walmart_secret));
  $private_key = openssl_pkey_get_private($pem);

  // Construct the data we want to sign
  $data = $walmart_consuer_id."\n";
  $data .= $url."\n";
  $data .= $request_type."\n";
  $data .= $timestamp."\n";

  // Sign the data
  $hash = defined("OPENSSL_ALGO_SHA256") ? OPENSSL_ALGO_SHA256 : "sha256";
  if (!openssl_sign($data, $signature, $private_key, $hash)) {
    // ERROR
    return null;
  }

  return base64_encode($signature);
}

function pkcs8_to_pem($der) {

  static $BEGIN_MARKER = "-----BEGIN PRIVATE KEY-----";
  static $END_MARKER = "-----END PRIVATE KEY-----";

  $value = base64_encode($der);

  $pem = $BEGIN_MARKER . "\n";
  $pem .= chunk_split($value, 64, "\n");
  $pem .= $END_MARKER . "\n";

  return $pem;
}
回答2

在 2018 年 8 月之后的新 API 中,您必须生成访问令牌,然后使用完全独立的身份验证标头从其 API 中提取任何内容。 花了几个小时才弄清楚这一点,所以我希望这对将来的人有所帮助。

(这适用于 Marketplace API,但应该适用于任何 Walmart API)

要生成访问令牌,您必须传递以下标头:

Array(
[0] => Authorization: Basic BASE64_ENCODED_VARIABLE (see below)
[1] => Content-Type: application/x-www-form-urlencoded
[2] => Accept: application/json
[3] => WM_SVC.NAME: Walmart Marketplace
[4] => WM_QOS.CORRELATION_ID: 10_DIGIT_RANDOM_GENERATED_ALPHANUMERIC_ID
[5] => WM_SVC.VERSION: 1.0.0
[6] => WM_CONSUMER.CHANNEL.TYPE: PROVIDED_WHEN_GENERATING_CLIENT_ID_AND_SECRET
)

要生成 BASE64_ENCODED_VARIABLE,请使用 base64_encode 创建一个变量,如下所示:

$auth = base64_encode($clientId . ":" . $clientSecret);

...其中 Client ID 和 Client Secret 是从 Wal-Mart 的 Developer Portal API 区域生成的。

============================================

在您成功地将该数据发布到 Walmart 并收到一个访问令牌作为回报后,您希望在您与 Wal-Mart 进行的任何 API CALL 中传递以下标头:

Array(
[0] => Authorization: Basic BASE64_ENCODED_VARIABLE (as described above)
[1] => WM_SVC.NAME: Walmart Marketplace
[2] => WM_QOS.CORRELATION_ID: 10_DIGIT_RANDOM_GENERATED_ALPHANUMERIC_ID
[3] => WM_CONSUMER.CHANNEL.TYPE: PROVIDED_WHEN_GENERATING_CLIENT_ID_AND_SECRET
[4] => WM_SEC.ACCESS_TOKEN: GENERATED_FROM_PREVIOUS_STEP (returned as [access_token])
[5] => Content-Type: application/json
[6] => Accept: application/json
)

...然后打电话。

在不断收到 UNAUTHORIZED.GMP_GATEWAY_API 错误之后,这就是最终对我有用的东西。

传递“Authorization: Bearer TOKENTOKENTOKEN”而不是我上面列出的方式将不能作为身份验证标头。 相信我 :-)

回答3
<?php
$consumer_id='xxxxxxxxxx';
$private_key='xxxxxxxxxx';
$timestamp='xxxxxxxx';
$correlation_id='xxxxxxxxxxx';
$channel_id='xxxxxxxxxx';

$endPoint = "v3/feeds?feedType=item";
$requestUrl = "https://marketplace.walmartapis.com/$endPoint";
$requestMethod = 'POST';
$signature = new Signature($consumer_id, $private_key, $requestUrl,       $requestMethod);
$actual_signature = $signature->getSignature($timestamp);

$file = '..../walmart_product.xml';

$headers = [];
$headers[] = "WM_SVC.NAME: Walmart Marketplace";
$headers[] = "WM_QOS.CORRELATION_ID: ".$correlation_id;
$headers[] = "WM_SEC.TIMESTAMP: ".$timestamp;
$headers[] = "WM_SEC.AUTH_SIGNATURE: ".$actual_signature;
$headers[] = "WM_CONSUMER.ID: " .$consumer_id;
$headers[] = "Content-Type: multipart/form-data";
$headers[] = "Accept: application/xml";
$headers[] = "WM_CONSUMER.CHANNEL.TYPE: ".$channel_id;
$headers[] = "HOST: marketplace.walmartapis.com";


$body ['file'] = new \CurlFile ( $file, 'application/xml' );

$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $requestUrl );
curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers );
curl_setopt ( $ch, CURLOPT_HEADER, 1 );
curl_setopt ( $ch, CURLOPT_POST, 1 );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $body );
curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, 0 );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
$server_output = curl_exec ( $ch );
?>
回答4
$ch = curl_init();

$headers = $actual;

$qos = uniqid();

$url='https://api-gateway.walmart.com/v3/items';

$options = 
array (
    CURLOPT_URL => $url,

    CURLOPT_RETURNTRANSFER => true,

    CURLOPT_TIMEOUT => 60,

    CURLOPT_HEADER => false,

    CURLOPT_POST => 1,

    CURLOPT_HTTPHEADER => array(
    'WM_SVC.NAME: Drop Ship Vendor Services',

    'WM_QOS.CORRELATION_ID:'.$qos,

    'WM_SEC.TIMESTAMP:1451606400',

    'WM_SEC.AUTH_SIGNATURE: '.$headers,

    'WM_CONSUMER.ID:'.$WalmartConsumerID
,
    'WM_CONSUMER.CHANNEL.TYPE:**********',

    'Accept: application/xml'
        ),

    CURLOPT_HTTPGET => true
);

curl_setopt_array($ch, $options);

$response = curl_exec ($ch);

print_r($response);

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Laravel 5.6-自耗API的Passport JWT httponly cookie SPA身份验证?(Laravel 5.6 - Passport JWT httponly cookie SPA authentication for self consuming API?)
    问题 注意:我在这个问题上有4个赏金,但是以下未提出答案的答案都不是该问题所需的答案。 所需的一切都在下面的Update 3中,只是在寻找Laravel代码来实现。 更新3:此流程图正是我要完成的流程,下面的所有内容都是原始问题,其中包含一些较旧的更新。 该流程图总结了所需的一切。 下面流程图中的绿色部分是我知道该怎么做的部分。 我正在寻找红色部分及其旁注,以寻求使用Laravel代码完成的帮助。 我已经做了很多研究,但是在将Laravel与JWT httponly cookie结合使用以用于自用API时,信息总是会变得很简短,而且并不完整(大多数在线教程仅显示JWT存储在本地存储中不是很安全) )。 看起来,当通过每条请求发送到服务器以验证用户是他们所说的身份时,包含Passport的JWT的httponly cookie都应该用于在Javascript端标识用户。 要了解如何使此设置有效的完整图片,还需要一些其他事项,而我在一个涵盖此内容的单个教程中没有遇到过: 从JS端登录后,Laravel Passport(不是tymon auth)将生成加密的JWT,并将其作为httponly cookie发送为响应。 使用什么中间件? 如果刷新令牌增加了安全性,该如何实施? 调用auth端点的JavaScript(例如,axios)api伪代码,httponly
  • java.io.IOException:找不到身份验证挑战(java.io.IOException : No authentication challenges found)
    问题 我是android的新手,这是我在android上的第一个项目。 我为“身份验证”问题苦苦挣扎超过一天。 我尝试了几种选择,但没有一个起作用。 基本上,我想调用REST API并获得响应。 我确信API不会出现问题,因为我在另一个iOS应用程序中使用了相同的API。 我通过授权标头,但仍显示身份验证,未显示任何消息。 我发现很少有与此相关的关于stackoverflow的问题,但是其中一些没有用,有些对我来说没有意义。 我收到状态码401 。 我知道这意味着没有通过身份验证,或者如果通过了身份验证,那么它们是错误的。 在这里,我确信我通过的是正确的。 下面是我的代码: try { url = new URL(baseUrl); } catch (MalformedURLException me) { Log.e(TAG, "URL could not be parsed. URL : " + baseUrl + ". Line : " + getLineNumber(), me); me.printStackTrace(); } try { urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod(method); urlConnection
  • Google 日历 api 推送通知:401 - 未经授权的 WebHook 回调通道(Google calendar api Push notification: 401 - Unauthorized WebHook callback channel)
    问题 该问题的任何解决方案。 这似乎不起作用 { "error": { "errors": [ { "domain": "global", "reason": "push.webhookUrlUnauthorized", "message": "Unauthorized WebHook callback channel: https://xxxxx" } ], "code": 401, "message": "Unauthorized WebHook callback channel: https://xxxxx" } } 无论如何要解决这个问题 回答1 推送通知要求您已验证域所有权,因此无法在 API Explorer 中创建,因为它不提供将请求与您已验证所有权的项目相关联的方法。 如果您使用项目凭据,这可以在 OAuth Playground 中完成,详情如下: 配置API项目: 在 https://console.developers.google.com/project/ 访问您的 API 项目。 确保您已根据 https://developers.google.com/admin-sdk/directory/v1/guides/push#registering-your-domain 上的说明注册了网站的 HTTPS 版本。 从“产品和服务”菜单(左上角的三条水平线)中
  • 为什么在POST请求中“ Content-Length:0”?(Why “Content-Length: 0” in POST requests?)
    问题 客户有时在提交表单时发送Content-Length: 0 POST请求(10到40多个字段)。 我们使用了不同的浏览器,从不同的位置对其进行了测试,但无法重现该错误。 客户正在使用Internet Explorer 7和代理。 我们要求他们让系统管理员从他们的角度看问题。 在没有代理的情况下运行某些测试等。 同时(半年后,仍然没有答案),我很好奇是否有人知道Content-Length: 0请求有类似问题。 也许是在某些大型公司的特殊代理服务器的Windows网络内部。 Internet Explorer 7是否存在已知问题? 有代理系统吗? Windows网络本身? Google仅在NTLM(及类似)身份验证的上下文中显示了某些内容,但我们不在Web应用程序中使用它。 也许这就是代理通过Windows登录名在客户网络中运行的方式吗? (我不是Windows专家。只是猜测。) 我没有有关基础架构的更多信息。 更新:在2010年12月,可以将此信息通知一位管理员,包括。 答案中的链接。 联系也是由于代理引起的另一个问题。 此后没有反馈。 并且错误消息仍然存在。 我在笑是为了防止我哭泣。 更新2:此问题自2008年年中以来一直存在。每隔几个月就会使客户感到烦恼,并希望尽快修复它。 我们再次向他们发送所有旧电子邮件,并要求他们与管理员联系以修复它或进行一些进一步的测试。
  • 403禁止vs 401未经授权的HTTP响应(403 Forbidden vs 401 Unauthorized HTTP responses)
    问题 对于存在的网页,但用户没有足够特权(他们没有登录或不属于正确的用户组)的网页,可以提供什么正确的HTTP响应? 401 Unauthorized ? 403 Forbidden吗? 还有别的吗 到目前为止,我对两者的区别还不清楚。 每种使用情况适合哪些用例? 回答1 丹尼尔·欧文(Daniel Irvine)的明确解释: 401 Unauthorized出现问题,HTTP状态码用于身份验证错误。 就是这样:它用于身份验证,而不是授权。 服务器收到401响应后,会告诉您:“您未通过身份验证-完全没有身份验证或身份验证不正确-但请重新进行身份验证,然后重试。” 为了帮助您,它将始终包含描述如何进行身份验证的WWW-Authenticate标头。 这是通常由您的Web服务器而不是Web应用程序返回的响应。 这也是非常临时的。 服务器要求您重试。 因此,对于授权,我使用403禁止响应。 它是永久的,与我的应用程序逻辑相关,并且比401更具体。 服务器收到403响应,告诉您:“很抱歉。 我知道您是谁-我相信您说的是谁-但您只是没有访问此资源的权限。 也许如果您很好地询问系统管理员,您将获得许可。 但是请不要再困扰我,直到您的困境改变为止。” 总而言之,当用户通过身份验证但无权对给定资源执行请求时,应使用401未经授权的响应来进行丢失或错误的身份验证,然后使用403禁止响应。
  • HTTP 401不使用HTTP基本身份验证时未授权?(HTTP 401 Unauthorized when not using HTTP basic auth?)
    问题 当构建不使用HTTP基本身份验证(但使用其他类似api-key的身份)的REST API且客户端提供无效的凭据时,您应该返回什么HTTP状态代码? 401未经授权还是403禁止? IANA HTTP状态代码注册表将RFC7235第3.1节列为负责“ 401未经授权”的内容,其中指出: 产生401回应的伺服器必须传送WWW-Authenticate标头栏位 这是否意味着REST API仅在使用HTTP基本身份验证时才返回401,而在例如通过api密钥使用身份验证时不应该返回401? Django似乎同意: HTTP 401响应必须始终包含WWW-Authenticate标头,该标头指示客户端如何进行身份验证。 HTTP 403响应不包含WWW-Authenticate标头。 将使用的响应类型取决于身份验证方案。 理查森似乎不同意: 401(“未经授权”) 重要性:高。 客户端尝试在受保护的资源上操作,而没有提供适当的身份验证凭据。 它可能提供了错误的凭据,或者根本没有提供。 凭据可以是用户名和密码,API密钥或身份验证令牌,无论所涉及的服务期望什么。 客户端通常会发出一个URI请求并接受一个401,以便它知道要发送哪种凭证以及采用哪种格式。 [...] 回答1 您假设www-authenticate值必须是基本值。 您可以返回诸如“ API密钥
  • ASP.NET Web API:返回401 /未经授权的响应的正确方法(ASP.NET Web API : Correct way to return a 401/unauthorised response)
    问题 我有一个MVC webapi网站,该网站使用OAuth /令牌身份验证对请求进行身份验证。 所有相关的控制器都具有正确的属性,并且身份验证正常。 问题在于,并非所有请求都可以在属性范围内得到授权-某些授权检查必须在控制器方法调用的代码中执行-在这种情况下,返回401未经授权的响应的正确方法是什么? 我试过throw new HttpException(401, "Unauthorized access"); ,但是当我这样做时,响应状态代码为500,并且我还得到了堆栈跟踪。 即使在我们的日志记录DelegatingHandler中,我们也可以看到响应为500,而不是401。 回答1 您应该从您的API方法中抛出HttpResponseException,而不是HttpException: throw new HttpResponseException(HttpStatusCode.Unauthorized); 或者,如果您想提供自定义消息: var msg = new HttpResponseMessage(HttpStatusCode.Unauthorized) { ReasonPhrase = "Oops!!!" }; throw new HttpResponseException(msg); 回答2 只需返回以下内容: return Unauthorized()
  • 从 android 连接到 PrestaShop 网络服务时出现 401 错误(401 Error when connecting to PrestaShop webservice from android)
    问题 我正在尝试在 PrestaShop 中调用网络服务,但出现 401 未授权错误。 即使我已经通过了用户名密钥。 我也尝试了身份验证器,但出现错误 HttpRetryingError。 在下面找到我所做的代码片段。 方法一: final String username = "key_here"; final String password = "";// leave it empty URL urlToRequest = new URL(urlStr); urlConnection = (HttpURLConnection) urlToRequest.openConnection(); urlConnection.setDoOutput(true); urlConnection.setRequestMethod("GET"); urlConnection.setRequestProperty("Content-Type", "text/xml;charset=utf-8"); String authToBytes = username + ":" + password; //.... byte[] authBytes = org.apache.commons.codec.binary.Base64.encodeBase64(authToBytes.getBytes())
  • 在 PHP 中创建一个 RESTful API?(Create a RESTful API in PHP?)
    问题 我开发了一个非常快速和简单的 PHP 应用程序,用于从 XML 文件中读取分类广告并允许用户对其执行 CRUD 操作(这是一项家庭作业)。 我现在的任务是将此应用程序开发为 RESTful 服务。 教授实际上似乎对 RESTful 服务没有任何经验,因为他说我的应用程序被找到以用于下一个任务,当我的研究表明它并没有真正满足所有 RESTful 要求时。 无论如何,我想出于学习目的正确地做到这一点,即使我可以交出我的旧作业并取得好成绩。 不过,我在学习从哪里开始时遇到了麻烦; 我不确定 RESTful 服务到底是什么。 我认为获得建议的最好方法是发布我之前作业中的示例代码,看看我是如何处理事情的,以及我需要如何处理事情。 例如,这是我创建新分类广告的方式。 创建.php //Basically just a list of <INPUT TYPE = "text" NAME = "something"> in the <body> fields 创建成功.php <html><head><?php $simplerXML = simplexml_load_file('file.xml'); //Generate the basic ad information $newAd = $simplerXML->addChild('advertisement',''); $newAd-
  • 在快速服务器上成功调用 api 后使用角度路由重定向页面(redirecting a page with angular routing after successfully calling an api on express server)
    问题 在使用角度路由的单页面应用程序中,如何在 api 调用后重定向页面。 就我而言,我想在用户调用登录 api 后将用户重定向到个人资料页面。 所以这就是我认为可行的方法,但事实并非如此。 在客户端,main.js。 我设置了角度路由 app.config(function($routeProvider){ $routeProvider //the home page display .when('/', { templateUrl: 'main.html', controller: 'mainController' }) .when('/login', { templateUrl: 'login.html', controller: 'loginController' }) .when('/signUp', { templateUrl: 'signUp.html', controller: 'signUpController' }) .when('/profile', { templateUrl: 'profile.html', //controller: 'mainController' }); }); 并从我的控制器中调用 /login post api app.controller('authController', function($scope, $http,
  • UI 中未经授权的操作是否应该隐藏、禁用或导致错误? [关闭](Should unauthorized actions in the UI be hidden, disabled, or result in an error? [closed])
    问题 关闭。 这个问题是基于意见的。 它目前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑这篇文章用事实和引文来回答问题。 2年前关闭。 改进这个问题 这对我来说是一个长期存在的问题,我从未真正解决过,所以我希望得到您的意见。 如果我知道用户由于权限不足或对象状态不足而无法执行某些操作,这些操作的 UI 元素是否应该对用户隐藏、可见但已禁用,或可见并在尝试时导致错误? 你回答的理由是什么? 如果禁用,您会说明原因吗?如果是,如何说明? 这是一个 Web 界面,所以我已经知道我需要检查传入的 post/get 的权限并处理那里的错误。 我主要是在谈论如何处理 UI。 这类似于关于禁用或隐藏菜单项的规则,尽管我对所有类型的 UI 元素感兴趣,而不仅仅是菜单。 例子: 我有一个允许用户创建新事件的新页面。 事件可以是主事件或子事件。 创建主事件需要“EditMasterEvent”权限,而创建子事件只需要“EditEvent”权限。 我有一个下拉菜单,允许选择一个现有事件作为父事件(主事件)或没有父事件(这是一个主事件)。 如果用户只有“EditEvent”权限,是否应在下拉列表中显示或省略“创建主事件”选项。 删除事件需要您是应用程序管理员或对事件类型具有适当的编辑权限。 在后一种情况下,事件也必须超过 5 年。 删除事件会导致系统中相关数据的重大级联删除,出于法律原因
  • Laravel护照范围(Laravel Passport Scopes)
    问题 我对laravel示波器部分感到有些困惑。 我有一个用户模型和表格。 如何为用户分配用户,客户和/或管理员的角色。 我有一个带有vue和laravel api后端的SPA。 我使用https://laravel.com/docs/5.3/passport#taking-your-api-with-javascript Passport::tokensCan([ 'user' => 'User', 'customer' => 'Customer', 'admin' => 'Admin', ]); 如何分配哪个用户模型具有哪个范围? 还是作用域与角色不同? 您将如何实施? 提前致谢! 回答1 还是作用域与角色不同? 两者之间的最大区别是它们适用的上下文。 直接使用Web应用程序时,基于角色的访问控制(RBAC)控制用户的访问控制,而Oauth-2范围代表用户为外部客户端控制对API资源的访问。 如何分配哪个用户模型具有哪个范围? 在一般的Oauth流程中,要求用户(作为资源所有者)就其可以或不能代表他/她做的事情授权客户端,这些就是您所谓的scope 。 在成功授权后,客户端请求的范围将分配给生成的令牌,而不是分配给用户本身。 根据您选择的Oauth授予流程,客户端应在其请求中包括范围。 在授权代码授予流程中,将用户重定向到授权页面时,范围应包含在HTTP GET查询参数中
  • 在 PHP 中发送 POST 请求到 pushbullet API 401 错误(send POST request in PHP to pushbullet API 401 error)
    问题 我正在尝试使用 pushbullet 发送简单的推送通知,只需使用电子邮件并将其发送到链接帐户以避免需要帐户数据。 (请参阅此处的参考:https://docs.pushbullet.com/#pushes) 因此,我在 php 中使用了一种非 cURL 方法,我(不仅)在这里找到:How do I send a POST request with PHP? 不幸的是,我收到如下错误: <br /> <b>Warning</b>: file_get_contents(https://api.pushbullet.com/v2/pushes): failed to open stream: HTTP request failed! HTTP/1.0 401 Unauthorized in <b>/path/to/function.php</b> on line <b>42</b><br /> bool(false) 将 url 用于 file_get_contents 的选项设置为“on”。 我的代码: $pushdata = array( "email" => $email, "type" => "link", "title" => "Demo Pushbullet Notification", "body" => "You have new comment(s)!",
  • AngularJS 中的授权标头不起作用(Authorization header in AngularJS not working)
    问题 我正在为我的 API 使用 Django REST 令牌身份验证。 我发布了我的凭据以获取令牌端点。 但是,当我尝试以正确的方式设置标头时,它会不断响应 http 401 错误。 我尝试使用curl -X GET http://127.0.0.1:8000/events/ -H 'Authorization: Token 4d92d36768ca5d555b59cf68899eceab39c23704 '并且确实有效! 这是我的代码: app.controller('HomeController', ['$scope','$http', function($scope,$http) { $scope.username = ''; $scope.password = ''; $scope.submitLogin = function () { var credentials = { username : $scope.username, password : $scope.password, }; var req = $http.post('http://127.0.0.1:8000/api-token-auth/', credentials); req.success(function(data, status, headers, config) { $scope.token
  • NSURLSession 生命周期和基本授权(NSURLSession lifecycle and basic authorization)
    问题 如果我使用下面的代码,我将无法始终如一地从服务器读取响应。 标题: #import <Foundation/Foundation.h> @interface TestHttpClient : NSObject<NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDownloadDelegate> -(void)POST:(NSString*) relativePath payLoad:(NSData*)payLoad; @end 执行: #import "TestHttpClient.h" @implementation TestHttpClient -(void)POST:(NSString*)relativePath payLoad:(NSData*)payLoad { NSURL* url = [NSURL URLWithString:@"http://apps01.ditat.net/mobile/batch"]; // Set URL credentials and save to storage NSURLCredential *credential = [NSURLCredential credentialWithUser:@"BadUser" password:@"BadPassword"
  • Keeping session alive with Curl and PHP(Keeping session alive with Curl and PHP)
    问题 我正在尝试连接到API,对用户进行身份验证,然后查看用户详细信息。 这是通过首先访问位于以下位置的登录端点来完成的 http://api.example.com/login/<username>/<password> 登录,然后单击以下命令查看用户详细信息: http://api.example.com/user/ 所有这些都可以在Web浏览器中使用。 但是,一旦我尝试使用Curl,登录就可以正常工作,但是当尝试查看用户详细信息时,我又得到了401未经授权的错误。 我相信这是因为Curl没有正确保存会话cookie? 有人可以指出为什么它不起作用以及如何解决吗? 我尝试过搜索堆栈交换,但是,我尝试过的所有解决方案都无法满足我的情况。 我用来卷曲端点的代码如下所示。 谢谢! define("COOKIE_FILE", "cookie.txt"); // Login the user $ch = curl_init('http://api.example.com/login/joe/smith'); curl_setopt ($ch, CURLOPT_COOKIEJAR, COOKIE_FILE); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, true)
  • Google GCM服务器返回未经授权的错误401(Google GCM server returns Unauthorized Error 401)
    问题 我正在使用GCM服务从服务器推送信息。 如果我使用浏览器密钥,它将成功消息显示为: {“ multicast_id”:4849013215736515938,“ success”:1,“ failure”:0,“ canonical_ids”:0,“ results”:[{“ message_id”:“ 0: 1348742583011905%2adac3a0f9fd7ecd“}]},但我在设备上未收到任何通知。 而且,如果我使用服务器密钥,它将显示未授权错误401 。 我的代码如下所示: $apiKey = "xxxxx"; $registrationIDs = array("xxxxxxxx"); $message = "testing Process"; $url = 'https://android.googleapis.com/gcm/send'; $fields = array( 'registration_ids' => $registrationIDs, 'data' => array("message"=>$message), ); $headers = array( 'Authorization: key=' . $apiKey, 'Content-Type: application/json' ); $ch = curl_init(); curl
  • OneDrive for Business REST API - PUT、POST - 401 未经授权(OneDrive for Business REST API - PUT,POST - 401 Unauthorized)
    问题 我们有Microsoft azure的试用版,并且正在根据链接通过 java 客户端的REST API使用 One drive for Business CRUD 操作。 获得令牌后,我可以成功使用GET列出任何文件夹、下载文件并获取文件的属性。 但是,创建文件夹、上传文件、重命名文件/文件夹等所需的PUT 、 POST等操作不起作用。 我返回"401 UnAuthorized"错误。 错误响应json : {"error":{"code":"-2147024891, System.UnauthorizedAccessException","message":"Access denied. You do not have permission to perform this action or access this resource."}} 我以与在http request为GET设置的方式类似的方式设置访问令牌,并且我正在使用jboss rest Easy 客户端来访问 rest API 这里是“创建文件夹”的代码 ResteasyProviderFactory factory = ResteasyProviderFactory.getInstance(); ResteasyProviderFactory.pushContext(javax.ws.rs.ext
  • Azure AD API 请求 401 未经授权(Azure AD API request 401 Unauthorized)
    问题 我在启用了 Azure AD 身份验证的 Azure 网站上运行了一个标准 Web API,当在浏览器中浏览 API 时,我能够通过浏览器登录并访问 API。 但是,WPF 桌面应用程序在提交请求时收到了未经授权的响应: var authContext = new AuthenticationContext(authority, new FileCache()); var accessToken = await authContext.AcquireTokenAsync(apiResourceid, clientId, redirectUri, new PlatformParameters(PromptBehavior.Auto)); // accessToken is valid var apiUrl = "https://example.azurewebsites.net/api/list"; var request = new HttpRequestMessage(HttpMethod.Get, apiUrl); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.AccessToken); var response =
  • Google 日历推送通知:未经授权的 webhook 调用(Google calendar push notification : Unauthorized webhook call)
    问题 目前我们正在开发一款处理谷歌日历的 iPhone 应用程序。 需要将日历事件同步到服务器端。 一切正常。 但是对于推送通知,我们遵循这个过程 每当我们将请求发布到:https://www.googleapis.com/calendar/v3/calendars/email@gmail.com/events/watch 带参数 "id":Unique string ( channel id) , "type": "web_hook", "address": "https://abc-api.herokuapp.com/user/notifications" 在标题中,我们发送 Authorization : **Bearer 'Access_token'** 和内容类型:json 我们已经在 google api 控制台中添加了域作为授权域 Access_token 是用户的帐户访问令牌。 我们收到“未经授权的 webhook 调用”错误。 { "error": { "errors": [ { "domain": "global", "reason": "push.webhookUrlUnauthorized", "message": "Unauthorized WebHook callback channel: https://abc-api.herokuapp.com