我正在构建一个Ruby on Rails应用程序,其中组织内的事件使用Microsoft Graph API对会议室进行分组和显示,并使用以下链接中描述的仅限应用授权流程.
http://graph.microsoft.io/docs/authorization/app_only
我使用以下请求列出会议室的事件
https://graph.microsoft.com/v1.0/users/<meeting room email>/events
Run Code Online (Sandbox Code Playgroud)
但问题是,并非所有事件都会在接下来的几周内列出,我认为这些都是反复出现的事件.
有没有办法将重复发生的事件包含在结果中.
如果有人可以提供帮助,我会很高兴.
提前致谢
以下代码是我到目前为止使用Microsoft Graph Client Library更新对象的唯一方法
场景:
码
var client = new GraphServiceClient(...);
var org = client.Organization["orgid"].Request().GetAsync().Result;
var secPhones = new List<string>(org.SecurityComplianceNotificationPhones);
secPhones.Add("12345");
var patchOrg = new Organization();
patchOrg.SecurityComplianceNotificationPhones = secPhones;
var orgReq = new OrganizationRequest(
client.Organization[org.Id].Request().RequestUrl,
client, new Option[] {});
orgReq.UpdateAsync(patchOrg).Wait();
Run Code Online (Sandbox Code Playgroud)
我需要使用patchOrg实例,因为有两件事:
该图形API文档状态
"在请求正文中,提供应更新的相关字段的值.请求正文中未包含的现有属性将保留其先前的值,或者根据对其他属性值的更改重新计算.为获得最佳性能,您不应该包括尚未改变的现有值."
如果你真的这样做包括没有改变现有的值(即assginedLicenses)请求失败,如果这些现有值是只读的.
我的问题是:是否有更简单的方法来更新现有对象,例如在Azure ActiveDirectory GraphClient中?仅供比较,Azure Active Directory Graph中的相同方案
var client = new ActiveDirectoryClient(...);
var org = client.TenantDetails.GetByObjectId("orgid").ExecuteAsync().Result;
org.SecurityComplianceNotificationPhones.Add("12345");
org.UpdateAsync().Wait();
Run Code Online (Sandbox Code Playgroud) 从文档中,我找不到任何方法来获取我放置webpart的网站的siteId.
例如,
我当前的网站是:https://{hostname}/sites/main1
< - 不是root网站,但我想获得这个siteId
我在这里测试我的webpart: https://{hostname}/sites/main1/_layouts/15/workbench.aspx
我怎样才能做到这一点?从文档中,
站点是唯一标识符,它是以下值的组合ID:
网站集主机名(contoso.sharepoint.com)
网站集唯一ID(guid)
网站唯一ID(guid)
我可以通过使用location.hostname
(是的,我使用JavaScript + React构建我的webpart)轻松获取主机名,但是如何使用Graph API轻松获取site-id?
我正在尝试开发一个简单的后台应用程序以连接到我的onedrive帐户(工作)并定期下载一些文件。
我已经在这里注册了该应用程序https://apps.dev.microsoft.com/portal/register-app
我写下了client_id
和client_secret
要获取访问令牌,我向发出POST请求
https://login.microsoftonline.com/common/oauth2/v2.0/token 与以下表单编码数据
{
'client_id': 'clientid here',
'client_secret': 'secret is here',
'scope': 'https://graph.microsoft.com/.default',
'grant_type': 'client_credentials',
}
Run Code Online (Sandbox Code Playgroud)
我回来了 access_token
{'ext_expires_in': 0,
'token_type': 'Bearer',
'expires_in': 3600,
'access_token': 'eyJ0eXAiOiJKV1QiLCJhbGciO---SHORTENED FOR BREVITY'}
Run Code Online (Sandbox Code Playgroud)
接下来,我Bearer
向https://graph.microsoft.com/v1.0/me发出一个GET请求(正确设置了标题)
并得到这个错误的响应(对于任何端点,我都会得到)
{
"error": {
"code": "BadRequest",
"message": "Current authenticated context is not valid for this request",
"innerError": {
"request-id": "91059f7d-c798-42a1-b3f7-2487f094486b",
"date": "2017-08-05T12:40:33"
}
}
}
Run Code Online (Sandbox Code Playgroud)
任何想法可能有什么问题吗?
我很难弄清楚/me/drive/search
端点如何与文档匹配.
当我尝试/v1.0/me/drive/search(q='myQuery')
接收名称的文件时myQuery
.这是有道理的.没有意义的是,如果尝试/v1.0/me/drive/search(q='.')
我收到来自整个组织的巨大结果列表.看来我可以访问这些文档,但是当我尝试按名称搜索其中一个时,它们就不会出现.
例
/v1.0/me/drive/search(q='.')
返回许多文档,其中一个文档名为"我的测试文档"
/v1.0/me/drive/search(q='My Test Document')
没有结果.
可以预期第二个查询返回与第一个查询相同的文档.
我能够访问用户的accessToken,并GET https://graph.microsoft.com/v1.0/me
使用Authorization: Bearer <token>
标头进行调用.
但是,在响应正文中,我得到的是这样的:
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users",
"value": [
{
"givenName": "Foo",
"surname": "Bar",
"displayName": "Foo Bar",
"id": "b41efha115adcca29",
"userPrincipalName": "email.address@outlook.com",
"businessPhones": [],
"jobTitle": null,
"mail": null,
"mobilePhone": null,
"officeLocation": null,
"preferredLanguage": null
}
]
}
Run Code Online (Sandbox Code Playgroud)
该mail
属性是null
,并且userPrincipalName
在此响应正文中恰好是用户的电子邮件地址.但是,这是来自微软的文档:
虽然UPN和电子邮件共享相同的格式,但用户的UPN值可能与用户的电子邮件地址相同,也可能不同.
在启动用户的登录请求时,我们正在请求"user.read"
和"email"
范围.我们使用MSAL.js库来获取访问令牌,我们的代码读取如下内容:
login (): ng.IPromise<IMicrosoftOAuthResponse> {
const prom = this.userAgentApplication.loginPopup(["user.read", "email"])
.then((idToken) => {
return this.userAgentApplication.acquireTokenSilent(["user.read", "email"]);
})
.then((accessToken) => {
// at this …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Microsoft Graph API过滤我的Sharepoint项目结果查询,如此处所述,所以我正在尝试这样
https://graph.microsoft.com/beta/sites/{site-id}/lists/{list-id}/items
做,所以我尝试添加
?&filter=od eq 1
或从复制expand
?filter=fields(select%3Did) = 1
,均无效。请帮忙
我正在使用以下方法连接到Microsoft Graph:
public GraphServiceClient GetAuthenticatedClient(string token)
{
GraphServiceClient graphClient = new GraphServiceClient(
new DelegateAuthenticationProvider(
async (requestMessage) =>
{
// Append the access token to the request.
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", token);
}));
return graphClient;
}
Run Code Online (Sandbox Code Playgroud)
我正在服务器上运行此代码。我正在使用的令牌是由外部应用发送给我的。
在最初的一个小时内一切正常,然后令牌过期。
我的问题是:由于我也可以访问刷新令牌,因此如何获得新令牌?
当尝试使用应用程序权限更新(PATCH
)用户的mobilePhone
属性时,Graph的响应是"没有足够的权限来完成操作"(Authorization_RequestDenied
).
无论是User.ReadWrite.All
和Directory.ReadWrite.All
授予权限.通过client_credentials
授权(oauth2/v2.0/token端点)请求访问令牌,并指定.default
范围,并且role
访问令牌中的声明中存在两个权限.
更新其他属性工作正常.仅在更新mobilePhone
属性且仅具有应用程序权限时才会出错(使用带有管理员用户的图形资源管理器).
此行为突然在10月2日2018年开始.在此之前,更新移动电话属性也适用于应用程序权限(相同的权限).
据我所知,没有新的限制/所需权限添加到用户PATCH
请求或mobilePhone
属性的Graph文档中.这可能是什么问题?
注意:请求是使用Microsoft.Graph.GraphServiceClient(.NET标准)进行的,但使用Postman发出请求时也是如此.
编辑:
这是Graph API的响应:
{
"error": {
"code": "Authorization_RequestDenied",
"message": "Insufficient privileges to complete the operation.",
"innerError": {
"request-id": "e956cb0b-af0a-4bb7-aae3-59d39d007a82",
"date": "2018-10-11T08:27:19"
}
}
}
Run Code Online (Sandbox Code Playgroud) 我们得到一个的权限driveItem
使用Microsoft图形作为记录在这里。
每个返回的权限对象通常包含一个grantedTo
以为IdentitySet
其值的字段。但问题在于,每个Identity
始终都是user
:
"grantedTo": {
"user": {
"displayName": "data Owners",
"email": "data@example.onmicrosoft.com",
"id": "94c3e81b-f6fb-43c6-8df5-b98462ccf191"
}
}
Run Code Online (Sandbox Code Playgroud)
"grantedTo": {
"user": {
"displayName": "Data Members"
}
}
Run Code Online (Sandbox Code Playgroud)
即使这些是组,也会发生这种情况。因此,无法使用这些数据来确定什么是组,什么是用户。
我们希望避免执行任何其他操作,因为这可能会导致效率低下。
因此,我们问是否有一种无需任何其他API请求即可识别它是组还是用户的方法?例如一些未记录的查询参数或关系?