2

我对用 PHP 编写的 onelogin api 有一个简单的 curl 请求。该请求适用于我的终端参数,我可以登录我的用户,但是我在服务器上运行的 php 版本会生成访问令牌,但是当我尝试任何 GET 或 POST 请求时会出现 401 错误。我尝试了各种卷曲参数。一个 html 表单提交到托管在 lampp 堆栈上的这个 php 页面。似乎不起作用。下面是带有简单 GET 请求的 php 脚本。非常感谢您对此的任何帮助:

<?php

//form will post these variables for post request
//$username = $_POST['uname'];
//$password = $_POST['pwd'];

$data = array("grant_type" => "client_credentials");
$data_string = json_encode($data);

$ch = curl_init('https://api.us.onelogin.com/auth/oauth2/token');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Authorization: client_id:XXX, client_secret:XXX",
    "Content-Type: application/json")
);

//execute post
$result = curl_exec($ch);

if(!curl_exec($ch)){
    die('Error: "' . curl_error($ch) . '" - Code: ' . curl_errno($ch));
}

//parsse out bearer token and set header
$json = json_decode($result, true);
$a_token = $json['data'][0]['access_token'];
$bearer_token = "Authorization: bearer: ". $a_token;

curl_setopt($ch, CURLOPT_URL, "https://api.us.onelogin.com/api/1/users");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array($bearer_token));

//execute 
$result2 = curl_exec($ch);

if(!curl_exec($ch)){
    die('Error: "' . curl_error($ch) . '" - Code: ' . curl_errno($ch));
}

//close connection
curl_close($ch);

echo $result2;

?>

4

3 回答 3

0

这会导致您的问题

if(!curl_exec($ch)){
   die('Error: "' . curl_error($ch) . '" - Code: ' . curl_errno($ch));
}

您正在使用 curl_exec 两次!

于 2017-02-01T20:26:40.493 回答
0

我只是在这里猜测,但我最好的选择是您没有正确配置不记名令牌标头(OneLogin 不喜欢最后一个 ':' 之后的空格并将其解释为不记名令牌的一部分)

所以你应该试试

$bearer_token = "Authorization: Bearer:". $a_token; // no space after Bearer: 
于 2016-07-06T21:20:13.327 回答
0

鉴于我的第一个答案失败......

检查您返回的不记名令牌,以确保它被正确解析

为第二个请求创建一个新的请求对象,例如

$ch2 = curl_init('api.us.onelogin.com/api/1/users'); 

curl_setopt($ch2, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_HTTPHEADER, array($bearer_token));

由于您正在重用第一个请求,它可能仍设置为执行 POST(第二个端点是 GET),并且可能与第一个请求留下的其他选项混杂在一起。

于 2016-07-06T22:07:40.467 回答