我制作了一个应用程序,用户在该应用程序中登录其Office 365帐户,并使用Microsoft Graph API执行操作。首次启动该应用程序时,我要求的权限很少,例如个人资料和邮件权限。但是,我现在要访问用户的日历,因此添加了更多权限(Calendars.Read,Calendars.ReadWrite)。
现在,当我尝试获取用户的日历事件时,出现以下错误:
{代码:ErrorAccessDenied,消息:访问被拒绝。检查凭证 然后重试。,innerError:{request-id: 33074527-630e-41cf-bd00-4fcd5f0ac816,日期:2018-09-10T03:15:07}}
我注意到,一旦添加了这些日历权限,便没有提示用户接受这些新权限,因此我认为这就是为什么我没有访问权限。为了获得用户的这些权限,是否必须删除我的应用程序或其他内容?我试图强迫用户再次登录,将新的权限请求添加到scopes
变量中,但是它仍然没有向用户询问这些权限。
答案 0 :(得分:1)
否,您需要更新为用户记录的同意书。我的猜测是您正在使用Azure v1 OAUth2 endpoints,因为该问题比v2端点更容易出现在此问题上:)。
这里的问题是,您的用户第一次同意时,Azure记录了他们的同意,因此不会再次提示他们。该记录捕获了您最初在应用程序注册中配置的权限。自记录用户同意以来,Azure v1不够“智能”,无法检测到您已在应用程序注册中添加了新权限,因此它很乐意继续使用旧权限发行令牌,从而跳过了用户提示。
要显示提示,您需要在授权URL上包含一个prompt=consent
查询参数,如记录的here所示。
如果您使用的是v2 OAuth2 endpoints,这会变得容易一些。对于v2端点,您要做的就是在scope
查询参数的授权URL中包括新的权限范围。 Azure将检测到用户未同意他们,并会提示。
那么您如何知道您正在使用哪个端点?
您是否正在使用MSAL库?那是v2。
您的代码是否将用户发送到其中带有v2.0
的URL?您猜对了,那就是v2。如果其中没有v2.0
,则为v1。