Azure市场SaaS实现API-解析订阅- PHP

m3eecexj  于 2022-12-21  发布在  PHP
关注(0)|答案(1)|浏览(156)

我正在尝试使用Azure实现API解析Azure Marketplace订阅。我已经按照Microsoft SaaS实现API文档中的说明进行了操作,但无法使用PHP解析订阅。我可以获取access_token,顺便说一句,我可以使用该令牌,并将其与订阅者重新注册时从Azure门户获得的购买标识令牌一起使用。指向SaaS登录页面,在使用postman时获得成功的json响应。我在使用PHP时无法获得同样的成功。我收到403错误-缺少授权,不正确或无效。我认为授权参数的查询字符串位格式不正确。这与特权或权限无关,因为我能够在Postman上获得成功的输出。

<?php
 use Microsoft\Graph\Graph;
 use Microsoft\Graph\Http;
 use Microsoft\Graph\Model;
 use GuzzleHttp\Client;

 class GraphHelper {
private static Client $tokenClient;
private static Client $tokenWebClient;
private static string $clientId = '';
private static string $tenantId = '';
private static string $clientSec = '';
private static string $graphUserScopes = '';
private static Graph $userClient;
private static string $userToken;
private static string $resolveToken;
private static string $subToken= '';

public static function initializeGraphForUserAuth(): void {
    GraphHelper::$tokenClient = new Client();
    GraphHelper::$clientId = $_ENV['CLIENT_ID'];
    GraphHelper::$clientSec = $_ENV['CLIENT_SECRET'];
    GraphHelper::$tenantId = $_ENV['TENANT_ID'];
    GraphHelper::$graphUserScopes = $_ENV['GRAPH_USER_SCOPES'];
    GraphHelper::$userClient = new Graph();
    
}
public static function getUserToken(): void {
//getting the access token 
    $accessCodeRequestUrl = 'https://login.microsoftonline.com/'.GraphHelper::$tenantId.'/oauth2/token';
    $tokenRequestUrl = 'https://marketplaceapi.microsoft.com/api/saas/subscriptions/resolve?api-version=2018-08-31';
    $subToken = $_SESSION['subToken'];
  $tokenResponse = GraphHelper::$tokenClient->post($accessCodeRequestUrl, [
        'form_params' => [
            'client_id' =>  GraphHelper::$clientId,
            'grant_type' => 'client_credentials',
            'client_secret' => GraphHelper::$clientSec,
            'resource' => '20e940b3-4c77-4b0b-9a53-9e16a1b010a7'
        ],
        // These options are needed to enable getting
            // the response body from a 4xx response
            'http_errors' => false,
            'curl' => [
                CURLOPT_FAILONERROR => false
            ]
    ]);
        if ($tokenResponse->getStatusCode() == 200) {
            // Return the access_token
            $responseBody = json_decode($tokenResponse->getBody()->getContents());
            GraphHelper::$resolveToken = $responseBody->access_token;
            $resolveAccessToken= $responseBody->access_token;
        } else if ($tokenResponse->getStatusCode() == 400) {
            // Check the error in the response body
            $responseBody = json_decode($tokenResponse->getBody()->getContents());
            if (isset($responseBody->error)) {
                $error = $responseBody->error;
                // authorization_pending means we should keep polling
                if (strcmp($error, 'authorization_pending') != 0) {
                    throw new Exception('Token endpoint returned '.$error, 100);
                }
            }
        }

//resolving the subscription
    

 $resolveResponse = GraphHelper::$tokenClient->post($tokenRequestUrl, [
            'form_params' => [
                'content-type' => 'application/json', 
                
                'authorization' =>   'Bearer '.$resolveAccessToken,
            'x-ms-marketplace-token'=> $subToken
            ],
            // These options are needed to enable getting
            // the response body from a 4xx response
            'http_errors' => false,
            'curl' => [
                CURLOPT_FAILONERROR => false
            ]
        ]);

//test whether there is a reponse 
return  $resolveResponse->getStatusCode(); // this returns a 403 - Authorization is missing, incorrect or invalid.
    }
}

?>
pftdvrlh

pftdvrlh1#

我发现我需要使用cUrl来包含authorization和其他头文件。Postman自动完成了这一操作,因此我可以使用postman而不是PHP来获得结果。最终,这段代码为我完成了这一操作。

$subToken = rawurldecode($_SESSION['subToken']);
    $ch = curl_init ();

    curl_setopt ($ch, CURLOPT_URL, $tokenRequestUrl);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($ch, CURLOPT_HTTPHEADER, array ('Authorization: Bearer '.GraphHelper::$resolveToken,

                                        'Content-type: application/json',
                                        'X-ms-marketplace-token:'. $subToken));
    
curl_setopt($ch, CURLOPT_POST, true);   

 $results =  json_decode (curl_exec ($ch), 1);
 if (array_key_exists ('error', $results)){  

 echo ($results['error']);    

 die();

}
        curl_close($ch);
        return $results['subscriptionName'] ;

我发现端点不接受get请求。它抛出了错误Subscription resolve not found","target":"subscriptionId","code":"EntityNotFound。但是包含post选项可以纠正这一错误,并且在此之后没有抛出任何错误。同样,当从url解码令牌时-不要使用urldecode(),而是使用rawurldecode ()

相关问题