Outlook - OAuth 2 - 无法检索访问令牌,不支持grant_type = password,只有authorization_code和refresh_token是

时间:2017-04-11 12:13:05

标签: php azure oauth outlook

我目前正在尝试使用Azure API实现一种将我的PHP App日历与我的客户端的Outlook日历同步的方法。 我使用OAuth2和自定义Microsoft provider by Steven Maguire. 我目前遇到的问题是我的回复中出现错误:

{“error”:“unsupported_grant_type”,“error_description”:“输入参数'grant_type'的提供值无效。预期值如下:'authorization_code','refresh_token'。”}

我无法理解为什么不支持grant_type密码,即使它在Azure的文档中说明了它。

请求如下所示:

的client_id = 44bef79b - **********************&安培; client_secret = H ************* ***&安培; REDIRECT_URI = HTTPS%3A%2F%2F192.168.1.123%2Fmapeyral%2Fcalendarsync.php&安培; grant_type =密码&安培;用户名= ******************&安培;密码= ***********& scope = openid%20profile%20offline_access%20Calendars.ReadWrite

使用的授权网址是:https://login.live.com/oauth20_token.srf 如Steven Maguire提供商所定义。 标题包含内容类型application / x-www-form-urlencoded(我已经看过很多帖子,这是导致错误的原因)。

我的一些代码:

$this->provider = new Microsoft([
      'clientId'                => MicrosoftGraphConstants::CLIENT_ID,
      'clientSecret'            => MicrosoftGraphConstants::CLIENT_SECRET,
      'redirectUri'             => MicrosoftGraphConstants::REDIRECT_URI,
      'urlAuthorize'            => MicrosoftGraphConstants::AUTHORITY_URL . MicrosoftGraphConstants::AUTHORIZE_ENDPOINT,
      'urlAccessToken'          => MicrosoftGraphConstants::AUTHORITY_URL . MicrosoftGraphConstants::TOKEN_ENDPOINT,
      'urlResourceOwnerDetails' => MicrosoftGraphConstants::RESOURCE_ID,
      'scope'                  => MicrosoftGraphConstants::SCOPES
    ]);

if ($_SERVER['REQUEST_METHOD'] === 'GET' && !isset($_GET['code']))
    {
      // Try getting access token from Database
      $workingAccount = $GLOBALS['AppUI']->getState('working_account');
      if (isset($workingAccount))
      {
        // DB access
        $DB = new DatabaseConnection();
        $dbAccess = $DB->getConnection();

        $contactData = DBUserUtils::getContactDataFromEmail($GLOBALS['AppUI']->getState('working_account'), $dbAccess);

        // If at least one user contact found
        if (!is_null($contactData))
        {
          // If has refresh token => fill session variables using refresh token
          if (!is_null($contactData['contact_refreshToken']))
          {
            log_msg('debug.log', 'Has refresh token');
            $GLOBALS['AppUI']->setState('preferred_username', $contactData['contact_email']);
            $GLOBALS['AppUI']->setState('given_name', $contactData['contact_first_name']." ".$contactData['contact_last_name']);
            // Get new tokens
            $newAccessToken = $this->provider->getAccessToken('refresh_token', [
              'refresh_token' => $contactData['contact_refreshToken']
            ]);

            // Update tokens and DB
            $GLOBALS['AppUI']->setState('refresh_token', $newAccessToken->getRefreshToken());
            $GLOBALS['AppUI']->setState('access_token', $newAccessToken->getToken());

            DBOAuthUtils::updateTokenForUser($contactData['contact_id'], $GLOBALS['AppUI']->getState('refresh_token'), $dbAccess);

            $this->redirectTo($redirectURL);
          }
          else
          {
             $this->getAccessToken();

          }
        }
        else
        {
           $this->getAccessToken();
        }
      }
      else
      {
         $this->getAccessToken();
      }

function getAccessToken(){
 $accessToken = $this->provider->getAccessToken('password', [
              'username' => '*************',
              'password' => '********',
              'scope'    => MicrosoftGraphConstants::SCOPES
            ]);
}

在第一次尝试期间,它没有通过if(isset($ workingAccount))条件(如预期的那样)并直接转到最后一个。 代码现在有点难看,但我认为它对我的问题没有影响。

任何帮助将不胜感激! 感谢

编辑:添加代码

1 个答案:

答案 0 :(得分:0)

这对我有帮助,问题是我需要使用Azure Active Directory而不是Azure AD 2.0。 问题解决了!