在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仍然有效吗?如果不是,是否还有其他方法可以仅使用登录名和密码来获得用户授权,而无需任何用户交互,而仅获取其登录名和密码?
答案 0 :(得分:1)
您无法通过v1端点动态指定scope
。只有更新的v2端点支持该模型(请参见文档中的Scopes, not Resources)。
为了访问用户的邮箱,您需要在Azure门户的应用程序注册中添加Mail.Read
。
请记住,您要么需要管理员才能为租户中的所有用户同意您的应用程序,要么让每个用户至少以交互方式登录一次,以便他们同意。
如果我没有指出使用密码授予几乎总是一个错误的主意,那我也会很失落。从根本上说,它不如其他所有OAuth授权安全。