在 Microsoft Graph 客户端库中应用访问令牌
Apply access token in Microsoft Graph Client Library
我正在尝试使用 Microsoft.Graph 库以便从 C# 代码访问 Outlook Calendar REST API。
在我的应用程序中,我试图将事件列表发送到 Outlook 日历。
阅读 Outlook REST API 参考后,我发现我无法在一个 http 请求中发送事件列表,这就是我将 Microsoft.Graph 库连接到项目的原因。但是当我试图通过图形客户端访问我的日历时,我遇到了下一条消息的异常:
ServiceException:代码:InvalidAuthenticationToken
消息:CompactToken 解析失败,错误代码:-2147184118
public static string clientId = ConfigurationManager.AppSettings["OutlookCalendarClientId"];
public static string clientSecret = ConfigurationManager.AppSettings["OutlookCalendarClientSecret"];
public static string redirectUri = "https://localhost:56110/appointments/calendar";
public static string scope = ConfigurationManager.AppSettings["OutlookCalendarRWScope"];
public static string accessToken = "EwAgA+l3BAAUWm1xSeJRIJK6txKjBez4GzapzqMAAUOcqDTcOceYJGraa4Q4StlEcWf9iaTwtQECi2/jBcvYwGqwrJ1mTU+ERYp0wJg1ADPAluTd5zkvv6IBxjeUzM6BtONBpFS8ZLaDjNWgNMFKOjAz61F/shGmo4Hp7MER6gYNpxhGwH0RNO0cJsRy7bE4JQWaGro83sZq2NtPBB7qg23OKdeSWVq1ardL9SNHYb4nWWRnm9GNxPGy7nVWK0ZLF7YWNS5rsY34b8MEQetMetVmU0SY7HGDIGrFzmD1YNsBbxO94UGcsoitcjnh8JIWLPflPdLPpbaZCxuoWQhVEZO2TN70SMuJOzixjQQ1tZB62gTlUmP6C36Pug2OMYUDZgAACOCpEMwEMVuu8AFrzisYPh5GC0P+u1ps2//daB+4qoxbqJU8ojACUqd7NGMiZjU1rkCpAuUjLJHMpETZsxETxIed0nA+9FQ4ALuzJmdb/iOZo1es1hil0R8MiYt1kCypfNq6+VWSS8AnKNOPq7hed7E+Zz+V559rLqusPIqMntWGwuK/6Mq4fgMEM4Em/iZ2c1yPcuI6Dqvq5wEdsqWEWS/xSXQQfbRayUZDUMNVoqpfiWTXQ6XBFpXPkZU8Q1+PcerGiGAXPbxe4WIDdmLteS8kATde5aO+RHpe3Dd3Hpqeo+nZKb4jg3ypqW9na9NnRkr+RC+BO5AxIS0CfmIdKIlR9lvRjBmscAncg/3ZH2LXUlwXeQPhp4tJltq7V8bFhAjBWH/d35CV0pUbeqcuvRLq77O1xr375NAH6aS2FHkhuC5zQ38xh7o3lKZRcmdX6Pgcf/m91EC6ktFAVrDN2DnXoFhk+mrhsF4MmiKhNU1SoTWEzBRY3d2Y1hfWAyZYBRJtYqRgNjPCX1NQvOvTuTN9jCbpPxXlrVYpJ76jflyM/CKrjpbTqKLPlF/p3B//8KIacvDK2c2IHYGK/osqlZUXX/I5bsfiNZNRm0UuwOU9xBl8Q5CydFDwmTm/mxfIw+OCCAgJd/fZ0QxI5oyBxfs8l5up+50ZuIYgGAI=";
var client = new GraphServiceClient(
new DelegateAuthenticationProvider(
(requestMessage) =>
{
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
return Task.FromResult(0);
}));
var response = client.Me.Calendar.Events.Request().GetAsync().Result;
此处显示的访问令牌是我通过发送 2 个 HTTP 请求获得的(如 API 参考资料中所述):
https://login.microsoftonline.com/common/oauth2/v2.0/authorize
?client_id=MY_APPLICATION_ID
&scope=openid+https://outlook.office.com/calendars.readwrite
&redirect_uri=http://localhost:56110/appointments/calendar
&response_type=code
和
https://login.microsoftonline.com/common/oauth2/v2.0/token
最后一个请求返回了一个实际的访问令牌,我正在尝试将其与图形客户端一起使用。在这种情况下最有趣的是,当我直接调用休息服务时(例如,通过提琴手)我可以使用这个令牌,但在 Graph 客户端的情况下不能使用它。
现在我正试图找出为什么会这样,我做错了什么以及应该如何呈现访问令牌才能对 Graph Client 有效?
有人遇到过这样的问题吗?
根据描述,您使用的是 access_token Outlook 日历 REST 调用 Microsoft Graph REST。
这将不起作用,因为这两个 REST 的受众不同。要为 Microsoft Graph REST 获取 access_token 以读取日历,我们可以使用 Calendars.Read
范围。您可以参考以下请求:
获取授权码:
GET:https://login.microsoftonline.com/common/oauth2/v2.0/authorize?response_type=code&client_id={client_id}&scope=Calendars.Read%20offline_access&redirect_uri={redirect_uri}
获取令牌:
POST:https://login.microsoftonline.com/common/oauth2/v2.0/token
client_id={client_id}&client_secret={client_secret}&grant_type=authorization_code&redirect_uri={redirect_uri}
关于 Microsoft Graph 范围的更多详细信息,您可以参考下面link:
我正在尝试使用 Microsoft.Graph 库以便从 C# 代码访问 Outlook Calendar REST API。
在我的应用程序中,我试图将事件列表发送到 Outlook 日历。 阅读 Outlook REST API 参考后,我发现我无法在一个 http 请求中发送事件列表,这就是我将 Microsoft.Graph 库连接到项目的原因。但是当我试图通过图形客户端访问我的日历时,我遇到了下一条消息的异常: ServiceException:代码:InvalidAuthenticationToken 消息:CompactToken 解析失败,错误代码:-2147184118
public static string clientId = ConfigurationManager.AppSettings["OutlookCalendarClientId"];
public static string clientSecret = ConfigurationManager.AppSettings["OutlookCalendarClientSecret"];
public static string redirectUri = "https://localhost:56110/appointments/calendar";
public static string scope = ConfigurationManager.AppSettings["OutlookCalendarRWScope"];
public static string accessToken = "EwAgA+l3BAAUWm1xSeJRIJK6txKjBez4GzapzqMAAUOcqDTcOceYJGraa4Q4StlEcWf9iaTwtQECi2/jBcvYwGqwrJ1mTU+ERYp0wJg1ADPAluTd5zkvv6IBxjeUzM6BtONBpFS8ZLaDjNWgNMFKOjAz61F/shGmo4Hp7MER6gYNpxhGwH0RNO0cJsRy7bE4JQWaGro83sZq2NtPBB7qg23OKdeSWVq1ardL9SNHYb4nWWRnm9GNxPGy7nVWK0ZLF7YWNS5rsY34b8MEQetMetVmU0SY7HGDIGrFzmD1YNsBbxO94UGcsoitcjnh8JIWLPflPdLPpbaZCxuoWQhVEZO2TN70SMuJOzixjQQ1tZB62gTlUmP6C36Pug2OMYUDZgAACOCpEMwEMVuu8AFrzisYPh5GC0P+u1ps2//daB+4qoxbqJU8ojACUqd7NGMiZjU1rkCpAuUjLJHMpETZsxETxIed0nA+9FQ4ALuzJmdb/iOZo1es1hil0R8MiYt1kCypfNq6+VWSS8AnKNOPq7hed7E+Zz+V559rLqusPIqMntWGwuK/6Mq4fgMEM4Em/iZ2c1yPcuI6Dqvq5wEdsqWEWS/xSXQQfbRayUZDUMNVoqpfiWTXQ6XBFpXPkZU8Q1+PcerGiGAXPbxe4WIDdmLteS8kATde5aO+RHpe3Dd3Hpqeo+nZKb4jg3ypqW9na9NnRkr+RC+BO5AxIS0CfmIdKIlR9lvRjBmscAncg/3ZH2LXUlwXeQPhp4tJltq7V8bFhAjBWH/d35CV0pUbeqcuvRLq77O1xr375NAH6aS2FHkhuC5zQ38xh7o3lKZRcmdX6Pgcf/m91EC6ktFAVrDN2DnXoFhk+mrhsF4MmiKhNU1SoTWEzBRY3d2Y1hfWAyZYBRJtYqRgNjPCX1NQvOvTuTN9jCbpPxXlrVYpJ76jflyM/CKrjpbTqKLPlF/p3B//8KIacvDK2c2IHYGK/osqlZUXX/I5bsfiNZNRm0UuwOU9xBl8Q5CydFDwmTm/mxfIw+OCCAgJd/fZ0QxI5oyBxfs8l5up+50ZuIYgGAI=";
var client = new GraphServiceClient(
new DelegateAuthenticationProvider(
(requestMessage) =>
{
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
return Task.FromResult(0);
}));
var response = client.Me.Calendar.Events.Request().GetAsync().Result;
此处显示的访问令牌是我通过发送 2 个 HTTP 请求获得的(如 API 参考资料中所述):
https://login.microsoftonline.com/common/oauth2/v2.0/authorize
?client_id=MY_APPLICATION_ID
&scope=openid+https://outlook.office.com/calendars.readwrite
&redirect_uri=http://localhost:56110/appointments/calendar
&response_type=code
和
https://login.microsoftonline.com/common/oauth2/v2.0/token
最后一个请求返回了一个实际的访问令牌,我正在尝试将其与图形客户端一起使用。在这种情况下最有趣的是,当我直接调用休息服务时(例如,通过提琴手)我可以使用这个令牌,但在 Graph 客户端的情况下不能使用它。
现在我正试图找出为什么会这样,我做错了什么以及应该如何呈现访问令牌才能对 Graph Client 有效? 有人遇到过这样的问题吗?
根据描述,您使用的是 access_token Outlook 日历 REST 调用 Microsoft Graph REST。
这将不起作用,因为这两个 REST 的受众不同。要为 Microsoft Graph REST 获取 access_token 以读取日历,我们可以使用 Calendars.Read
范围。您可以参考以下请求:
获取授权码:
GET:https://login.microsoftonline.com/common/oauth2/v2.0/authorize?response_type=code&client_id={client_id}&scope=Calendars.Read%20offline_access&redirect_uri={redirect_uri}
获取令牌:
POST:https://login.microsoftonline.com/common/oauth2/v2.0/token
client_id={client_id}&client_secret={client_secret}&grant_type=authorization_code&redirect_uri={redirect_uri}
关于 Microsoft Graph 范围的更多详细信息,您可以参考下面link: