我目前正在尝试使用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))条件(如预期的那样)并直接转到最后一个。 代码现在有点难看,但我认为它对我的问题没有影响。
任何帮助将不胜感激! 感谢
编辑:添加代码
答案 0 :(得分:0)
这对我有帮助,问题是我需要使用Azure Active Directory而不是Azure AD 2.0。 问题解决了!