Microsoft Graph - 从授权响应中获取令牌

时间:2021-06-30 14:54:33

标签: microsoft-graph-api

我正在按照此处的说明进行操作:

https://docs.microsoft.com/en-us/graph/auth-v2-user?view=graph-rest-1.0#3-get-a-token

我得到了授权响应,因此得到了所需的代码,但是当我请求令牌时,我得到了一个“HTTP/1.1 401 未授权”响应。

这是我的代码(不是用于生产,只是为了让我先获得流程/代码):

<?php
/*
    Auth
    https://docs.microsoft.com/en-us/graph/auth-v2-user?view=graph-rest-1.0
*/

define("HOST",              'https://login.microsoftonline.com');
define("TENANT",            'common');
define("AUTH_ENDPOINT",     HOST.'/'.TENANT.'/oauth2/v2.0/authorize');
define("TOKEN_ENDPOINT",    HOST.'/'.TENANT.'/oauth2/v2.0/token');
define("CLIENT_ID",         '<< FROM AZURE PORTAL >>');
define("CLIENT_SECRET",     '<< FROM AZURE PORTAL >>');
define("ALL_SCOPES",        rawurlencode('offline_access user.read mail.read'));
define("CALLBACK",          rawurlencode('http://localhost:300/graph2/auth.php'));

// Build URL
$url = AUTH_ENDPOINT."?client_id=".CLIENT_ID;
$url .= "&response_type=code";
$url .= "&redirect_uri=".CALLBACK;
$url .= "&response_mode=query";
$url .= "&scope=".ALL_SCOPES;

echo "<a href=$url>$url</a>";

if (isset($_GET))
{
    echo '<pre>';print_r($_GET);echo'</pre>';

    if (isset($_GET['code']))
    {
        // Got authorisation code - now need token
        $response = requestAccessTokenByVerifier($_GET['code']);
        echo ">".$response;
    }
}

function requestAccessTokenByVerifier($verifier)
{
    return requestAccessToken(
        array(
            'client_id' => CLIENT_ID,
            'redirect_uri' => CALLBACK,
            'client_secret' => CLIENT_SECRET,
            'code' => $verifier,
            'grant_type' => 'authorization_code',
            'scope' => ALL_SCOPES
        )
    );
  }

function requestAccessToken($content) 
{
    $response = sendRequest(TOKEN_ENDPOINT, 'POST', $content);
  
    if ($response !== false)
    {
        $authToken = json_decode($response);
        if (!empty($authToken) && !empty($authToken->{ACCESSTOKEN})) return $authToken;
    }
  
    die("No access token");
    return false;
  }

function sendRequest($url, $method = 'GET', $data = array(), $headers = array('Content-Type: application/x-www-form-urlencoded'))
{
    $context = stream_context_create(
        array(
            'http' => array(
                'method' => $method,
                'header' => $headers,
                'content' => buildQueryString($data)
            )
        )
    );

    echo "URL: $url<br>";
    echo '<pre>';print_r($data);echo '</pre>';
    echo buildQueryString($data)."<br>";
    $response = file_get_contents($url, false, $context);
    echo '<pre>';var_dump($http_response_header);echo '</pre>';
    return $response;
}

function buildQueryString($array)
{
    $result = '';
    foreach ($array as $k => $v)
    {
        if ($result == '') $prefix = ''; else $prefix = '&';
        $result .= $prefix . $k . '=' . $v;
    }
    return $result;
}
?>

正如您将看到的,我在其中放置了一些基本诊断信息,表明我已成功获取所需的代码,但无法从代码中获取令牌。

任何人都可以建议下一步尝试什么,我想知道是从调试的角度还是替代方法。

谢谢。

1 个答案:

答案 0 :(得分:0)

好的,经过仔细研究后,我意识到我犯了一个愚蠢的错误,但以防万一其他人也这样做 - 您需要使用客户端秘密值而不是 id!

enter image description here

我已经删除了那个客户端密码 :)

希望能帮助其他人用头撞砖墙。