【问题标题】:Errors when retrieving user details from Microsoft Graph using oauth2-microsoft使用 oauth2-microsoft 从 Microsoft Graph 检索用户详细信息时出错
【发布时间】:2019-06-30 21:46:50
【问题描述】:

我正在使用oauth2-microsoft 为我的应用开发“使用 Microsoft 登录”工具。我已成功验证并接收令牌,但随后我收到示例代码中的错误。

我正在使用下面的示例代码,并在“urlResourceOwnerDetails”字段中尝试了各种 URL 组合,包括将其留空。

$provider = new \Stevenmaguire\OAuth2\Client\Provider\Microsoft([
  'clientId'                  => '<redacted>',
  'clientSecret'              => '<redacted>',
  'redirectUri'               => 'http://localhost/test.php',
        'urlAuthorize'              => 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize',
        'urlAccessToken'            => 'https://login.microsoftonline.com/common/oauth2/v2.0/token',
        'urlResourceOwnerDetails'   => 'https://graph.microsoft.com/v1.0/me/drive'
    ]);

    $options = [
        'scope' => ['wl.basic', 'wl.signin']
    ];

之后是身份验证和令牌生成。

然后这一行抛出错误:

$user = $provider->getResourceOwner($token);

一个令牌肯定正在生成,我可以echo $token 看到它。

上面的代码应该创建一个$user 对象,其中包含有关登录用户的详细信息。但是,它反而会产生以下错误:

如果 'urlResourceOwnerDetails' 设置为 https://graph.microsoft.com/v1.0/me/drive 我得到:

League\OAuth2\Client\Provider\Exception\IdentityProviderException: Access token is empty

如果 'urlResourceOwnerDetails' 设置为 https://outlook.office.com/api/v2.0/me 我得到:

UnexpectedValueException: Invalid response received from Authorization Server. Expected JSON.

如果'urlResourceOwnerDetails' 为空,我会得到:

GuzzleHttp\Exception\RequestException: cURL error 3: malformed (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)

有什么想法吗?

【问题讨论】:

  • 您能分享一下您的计划吗?到目前为止,我了解您想要获取令牌并使用该令牌尝试访问 Graph API 对吗?但是您使用的是哪种grant_type?
  • 嗨,对不起 - 我只是想用它来登录,所以我想根据我的数据库检查他们的电子邮件地址并检索他们的名字等基本信息。

标签: php oauth-2.0 microsoft-graph-api microsoft-graph-sdks


【解决方案1】:

目前看来oauth2-microsoft不完全支持Microsoft Graph Auth,例如this thread

关于错误

联赛\OAuth2\Client\Provider\Exception\IdentityProviderException: 访问令牌为空

访问令牌应作为Authorization 标头传递,但根据Microsoft.php provider 实现,它改为作为查询字符串传递:

 public function getResourceOwnerDetailsUrl(AccessToken $token)
{
    $uri = new Uri($this->urlResourceOwnerDetails);
    return (string) Uri::withQueryValue($uri, 'access_token', (string) $token);
}

根据库的设计方式,可以引入以下提供程序类来支持 Microsoft Graph 调用(通过在请求的 Authorization 标头中包含访问令牌)

class MicrosoftGraphProvider extends AbstractProvider
{

    /**
     * Get provider url to fetch user details
     *
     * @param  AccessToken $token
     *
     * @return string
     */
    public function getResourceOwnerDetailsUrl(AccessToken $token)
    {
        return 'https://graph.microsoft.com/v1.0/me';
    }


    protected function getAuthorizationHeaders($token = null)
    {
        return ['Authorization'=>'Bearer ' . $token->getToken()];
    }


    public function getBaseAuthorizationUrl()
    {
        return 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize';
    }

    public function getBaseAccessTokenUrl(array $params)
    {
        return 'https://login.microsoftonline.com/common/oauth2/v2.0/token';
    }


    protected function getDefaultScopes()
    {
        return ['openid profile'];
    }

    protected function checkResponse(\Psr\Http\Message\ResponseInterface $response, $data)
    {
        // TODO: Implement checkResponse() method.
    }


    protected function createResourceOwner(array $response, AccessToken $token)
    {
        return  (object)$response;
    }
}

【讨论】:

  • 感谢您的回复@Vadim。我不确定我是否理解正确,但是您是否建议我应该修改/扩展 oauth2-microsoft 以解决此问题。老实说,与 Google 相比,为 Microsoft 实施基本登录检查有多么困难,这让我感到非常震惊。谁能给我指个白痴指南的方向,好吗?
  • 你运气好吗?我被同样的错误信息困住了......! Laravel 6 不工作,虽然示例代码适用于 5.4
猜你喜欢
  • 2020-05-09
  • 2023-01-12
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 2017-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多