如何授权服务在没有用户交互的情况下使用 Microsoft Graph 用户帐户?
How to authorize service to use Microsoft Graph user account without user interaction?
我希望我的服务器应用程序使用 Microsoft Graph 与其自己的 Excel 文件进行交互。也就是说,文件属于应用程序,而不是应用程序的特定用户。
我已经使用 Azure ID 注册了一个应用程序并授予 "Have full access to all files user can access" Microsoft Graph 权限。
我正在尝试使用 OAuth 资源所有者密码凭据授予。
我可以获得这样的授权令牌:
POST https://login.microsoftonline.com/common/oauth2/token
Content-Type: application/x-www-form-urlencoded
grant_type=password
&resource=https://graph.microsoft.com
&client_id=<ID of application registered with Azure AD>
&username=<Microsoft username>
&password=<password>&scope=Files.ReadWrite.All
但响应仅指示范围 User.Read
:
{
"token_type": "Bearer",
"scope": "User.Read",
"expires_in": "3600",
"ext_expires_in": "0",
"expires_on": "1494467388",
"not_before": "1494463488",
"resource": "https://graph.microsoft.com",
"access_token": "eyJ0e...",
"refresh_token": "AQAB..."
}
当我尝试在帐户的 One Drive 中列出文件时,我没有收到错误,但响应不包含任何项目:
Request:
GET https://graph.microsoft.com/v1.0/me/drive/root/children
Authorization: bearer eyJ0e...
Response:
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('<account ID>')/drive/root/children",
"value": []
}
当我使用同一帐户登录时在 Graph Explorer 中发出相同的请求时,响应包括该帐户的一个驱动器根目录中的所有项目。
我了解 Microsoft Graph 目前不支持仅应用程序的文件访问,当通过 OAuth 客户端凭据授予授权时(根据 calling Microsoft Graph in a service 的说明),但由于我正在获得特定用户帐户的授权(不仅仅是应用程序)我希望能够访问该用户文件。
我做错了什么,还是不支持使用资源所有者密码凭据授予文件访问权限?
如果是后者,我如何实现允许我的应用程序使用用户凭据在没有用户交互的情况下通过 Microsoft Graph 操作 Excel 文件?
更新:
我已经为我正在使用的帐户分配了管理员权限,并在 Azure 门户中重新设置了 Microsoft Graph 的应用程序权限,但它仍然对我不起作用。
以下是我使用的帐户的详细信息:
请在授予 "Have full access to all files user can access" Microsoft Graph 权限后,尝试在 "Required permissions" blade 中单击 Grant Permissions
(最好使用管理员帐户):
在使用资源所有者密码流程获取令牌之后,您会在 scp
声明中找到 Files.ReadWrite.All
。然后你可以调用 microsoft graph api 来列出文件 .
更新
以下是我如何使资源所有者流程工作的步骤:
注册一个原生应用,为Microsoft Graph添加"Have full access to all files user can access"委托权限(不要点击上图的grant permissions
按钮)。使用资源所有者密码凭据授予并获取访问令牌,仅在 scp
声明中找到 User.Read
:
POST https://login.microsoftonline.com/common/oauth2/token
Content-Type: application/x-www-form-urlencoded
grant_type=密码&client_id=XXXXXXXXXX&resource=https://graph.microsoft.com/&username=XXXXXX&password=XXXXXXX
如上图所示点击grant permissions
按钮,使用Resource Owner Password Credentials Grant并获取访问令牌,你可以在scp
声明中找到Files.ReadWrite.All User.Read
:
此问题是由于图表 API 的权限所致。原因是因为您以 Microsoft Graph Explorer 的特定用户身份登录 - 您可以看到所有内容...由于您已通过身份验证为一个人...您什么也看不到的原因是因为该应用程序- 只有权限不起作用。
我希望我的服务器应用程序使用 Microsoft Graph 与其自己的 Excel 文件进行交互。也就是说,文件属于应用程序,而不是应用程序的特定用户。
我已经使用 Azure ID 注册了一个应用程序并授予 "Have full access to all files user can access" Microsoft Graph 权限。
我正在尝试使用 OAuth 资源所有者密码凭据授予。
我可以获得这样的授权令牌:
POST https://login.microsoftonline.com/common/oauth2/token
Content-Type: application/x-www-form-urlencoded
grant_type=password
&resource=https://graph.microsoft.com
&client_id=<ID of application registered with Azure AD>
&username=<Microsoft username>
&password=<password>&scope=Files.ReadWrite.All
但响应仅指示范围 User.Read
:
{
"token_type": "Bearer",
"scope": "User.Read",
"expires_in": "3600",
"ext_expires_in": "0",
"expires_on": "1494467388",
"not_before": "1494463488",
"resource": "https://graph.microsoft.com",
"access_token": "eyJ0e...",
"refresh_token": "AQAB..."
}
当我尝试在帐户的 One Drive 中列出文件时,我没有收到错误,但响应不包含任何项目:
Request:
GET https://graph.microsoft.com/v1.0/me/drive/root/children
Authorization: bearer eyJ0e...
Response:
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('<account ID>')/drive/root/children",
"value": []
}
当我使用同一帐户登录时在 Graph Explorer 中发出相同的请求时,响应包括该帐户的一个驱动器根目录中的所有项目。
我了解 Microsoft Graph 目前不支持仅应用程序的文件访问,当通过 OAuth 客户端凭据授予授权时(根据 calling Microsoft Graph in a service 的说明),但由于我正在获得特定用户帐户的授权(不仅仅是应用程序)我希望能够访问该用户文件。
我做错了什么,还是不支持使用资源所有者密码凭据授予文件访问权限?
如果是后者,我如何实现允许我的应用程序使用用户凭据在没有用户交互的情况下通过 Microsoft Graph 操作 Excel 文件?
更新:
我已经为我正在使用的帐户分配了管理员权限,并在 Azure 门户中重新设置了 Microsoft Graph 的应用程序权限,但它仍然对我不起作用。
以下是我使用的帐户的详细信息:
请在授予 "Have full access to all files user can access" Microsoft Graph 权限后,尝试在 "Required permissions" blade 中单击 Grant Permissions
(最好使用管理员帐户):
在使用资源所有者密码流程获取令牌之后,您会在 scp
声明中找到 Files.ReadWrite.All
。然后你可以调用 microsoft graph api 来列出文件 .
更新
以下是我如何使资源所有者流程工作的步骤:
注册一个原生应用,为Microsoft Graph添加"Have full access to all files user can access"委托权限(不要点击上图的
grant permissions
按钮)。使用资源所有者密码凭据授予并获取访问令牌,仅在scp
声明中找到User.Read
:POST https://login.microsoftonline.com/common/oauth2/token Content-Type: application/x-www-form-urlencoded grant_type=密码&client_id=XXXXXXXXXX&resource=https://graph.microsoft.com/&username=XXXXXX&password=XXXXXXX
如上图所示点击
grant permissions
按钮,使用Resource Owner Password Credentials Grant并获取访问令牌,你可以在scp
声明中找到Files.ReadWrite.All User.Read
:
此问题是由于图表 API 的权限所致。原因是因为您以 Microsoft Graph Explorer 的特定用户身份登录 - 您可以看到所有内容...由于您已通过身份验证为一个人...您什么也看不到的原因是因为该应用程序- 只有权限不起作用。