Microsoft Graph API,密码授予选项

时间:2019-06-03 22:05:44

标签: microsoft-graph

this主题中,作者解释了如何基于用户的登录名和密码来获取访问令牌,而跳过了授权对话框。

我可以点击端点并获得访问令牌,然后刷新令牌:

GET https://login.microsoftonline.com/348a...6e4/oauth2/token?grant_type=password&\
client_id=6d5f...64f&client_secret=g...f2&username=user@Domain.com&\
password=P@ssW0RD&resource=https://graph.microsoft.com/&\
scope=user.read%20calendars.read%20MailboxSettings.Read%20Mail.read%20Mail.Send

//RESPONSE
{
    "token_type": "Bearer",
    "scope": "User.Read",
    "expires_in": "3600",
    "ext_expires_in": "3600",
    "expires_on": "1559602338",
    "not_before": "1559598438",
    "resource": "https://graph.microsoft.com/",
    "access_token": "eyJ0eXAiOiJKV...KJmNhyz5bvhzCWiFA",
    "refresh_token": "AQABAAA...VkgAA",
    "id_token": "eyJ0...xLjAifQ."
}

但是当我尝试获取用户的电子邮件时,出现错误:

GET https://graph.microsoft.com/v1.0/me/messages?\
$select=sender,subject,ReceivedDateTime&\
$filter=ReceivedDateTime%20ge%202019-05-01&$top=20

RESPONSE

{
    "error": {
        "code": "ErrorAccessDenied",
        "message": "Access is denied. Check credentials and try again.",
        "innerError": {
            "request-id": "e35f...94",
            "date": "2019-06-03T21:39:40"
        }
    }
}

此身份验证方法对Microsoft Graph API仍然有效吗?如果不是,是否还有其他方法可以仅使用登录名和密码来获得用户授权,而无需任何用户交互,而仅获取其登录名和密码?

1 个答案:

答案 0 :(得分:1)

您无法通过v1端点动态指定scope。只有更新的v2端点支持该模型(请参见文档中的Scopes, not Resources)。

为了访问用户的邮箱,您需要在Azure门户的应用程序注册中添加Mail.Read

请记住,您要么需要管理员才能为租户中的所有用户同意您的应用程序,要么让每个用户至少以交互方式登录一次,以便他们同意。

如果我没有指出使用密码授予几乎总是一个错误的主意,那我也会很失落。从根本上说,它不如其他所有OAuth授权安全。