代码之家  ›  专栏  ›  技术社区  ›  Rob

使用oauth2 Microsoft从Microsoft Graph检索用户详细信息时出错

  •  0
  • Rob  · 技术社区  · 7 年前

    我在用 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)
    
    

    有什么想法吗?

    0 回复  |  直到 7 年前
        1
  •  1
  •   Vadim Gremyachev    7 年前

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

    关于这个错误

    League\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调用(通过在 批准 请求的标题)

    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;
        }
    }
    
    推荐文章