2017-09-01 185 views
1

我已经设置了Office 365 E3试用帐户。我在AAD注册了两个应用程序。AAD microsoft graph,客户端凭证

第一个使用“授权码流”并按预期工作(可以访问登录的用户日历)。

第二个应用程序使用“客户端凭据流”,不起作用。

1. login in Browser (Edge) 

GET /OAuthTest3 HTTP/1.1 

HTTP/1.1 302 Found 
Location: https://login.microsoftonline.com/<tenant>/adminconsent?client_id=<app_id>&redirect_uri=http://localhost:1234/OAuthTest3 

GET /OAuthTest3?admin_consent=True&tenant=<tenant> HTTP/1.1 

HTTP/1.1 200 OK 


2. connect to https://login.microsoftonline.com/ 

POST /<tenant>/oauth2/token HTTP/1.1 
Host: login.microsoftonline.com 

client_id=<app_id>& 
client_secret=<client_secret>& 
grant_type=client_credentials& 
redirect_uri=http://localhost:1234/OAuthTest3& 
resource=https://graph.microsoft.com/& 
scope=https://graph.microsoft.com/calendars.readwrite 


HTTP/1.1 200 OK 
{ 
    "token_type": "Bearer", 
    "expires_in": "3600", 
    "ext_expires_in": "0", 
    "expires_on": "1504333342", 
    "not_before": "1504329442", 
    "resource": "https://graph.microsoft.com/", 
    "access_token": <token> 
} 


3. connect to https://graph.microsoft.com/ 

GET /v1.0/users/<user>/calendars HTTP/1.1 
Host: graph.microsoft.com 
Authorization: Bearer <token> 

HTTP/1.1 403 Forbidden 
{ 
    "error": { 
    "code": "ErrorAccessDenied", 
    "message": "Access is denied. Check credentials and try again.", 
    "innerError": { 
     "request-id": "e7228de4-2b27-4779-abef-ccab0d88970a", 
     "date": "2017-09-02T05:22:27" 
    } 
    } 
} 

感谢

周华健

+0

Hello Emil。我想你正在使用V2端点,你使用的是哪个库? –

+0

嗨让马克,我使用端点https://login.microsoftonline.com/ /adminconsent和https://login.microsoftonline.com/ /oauth2 /令牌授权。 和https://graph.microsoft.com/v1.0/users/ 为图api。我正在实施我自己的图书馆。 –

回答

1

为了使用客户端凭证在AAD V2.0流,你需要首先对象管理同意您的应用程序。即使您不需要使用授权代码授权同意范围,也是如此。

查看v2 Endpoint and Admin Consent获取同意书的步骤。

UPDATE:

作用域与客户端凭证工作方式不同。您不需要使用空格分隔列表(https://graph.microsoft.com/user.read https://graph.microsoft.com/calendars.readwrite)动态请求范围,您需要在应用程序的注册中定义它们。

这是通过使用https://apps.dev.microsoft.com门户完成的。在您的应用程序的注册中,找到“应用程序权限”部分,然后单击“添加”按钮。此时会弹出一个对话框,您可以选择您所需要的权限:

permissions

在您的应用程序,你也需要让系统知道从您注册使用的范围,改变你的scope参数。

POST /<tenant>/oauth2/v2.0/token HTTP/1.1 
Host: login.microsoftonline.com 

client_id=<app_id>& 
client_secret=<client_secret>& 
grant_type=client_credentials& 
redirect_uri=http://localhost:1234/OAuthTest3& 
resource=https://graph.microsoft.com/& 
scope=https://graph.microsoft.com/.default 

重要:你改变你的范围的任何时间,你将不得不重新执行管理员同意前流的新范围会同意这是通过https://graph.microsoft.com/.default的范围内进行。

+1

我更新了我的问题,详细介绍了我的协议实现。 –

+0

太棒了,这是超级有用的。我已经更新了我的答案。 –

+0

非常感谢您的帮助。我现在可以访问我自己的日历和其他用户的日历。 –

相关问题