我正在使用Python构建一个可以从Azure AD检索数据的应用程序。此数据可能需要应用程序权限或委派权限。我成功检索了只需要应用程序权限的数据。但是,为了检索需要委托权限的数据,我尝试使用OAuth2。是否可以使用OAuth2通过Microsoft Graph进行身份验证,但不是让用户使用网页登录,而是通过Python脚本本身提供用户凭据?
注意:我想使用Microsoft Graph API(v1.0和beta)而不是Azure AD Graph API。
答案 0 :(得分:2)
是的,这是可能的 - 但请记住,有两个Azure AD端点用于应用程序注册!
尝试在AAD V2.0端点(apps.dev.microsoft.com)上注册应用程序,然后使用密码'您的请求中的grant_type。
以下是您需要的步骤:
- 在AAD v2.0端点上注册您的应用程序,并生成密码(拍摄
注意事项)
- 分配您所需的权限(在这种情况下,委派)
- 作为回调网址,我建议首先使用邮递员的Oauth2回调网址,以便您可以调试自己正在做的事情:https://www.getpostman.com/oauth2/callback
- 重要!如果任何这些权限需要管理员同意,您必须首先同意他们使应用程序可用。这需要管理员用户登录一次。
一旦获得同意,以下是您获取持票人令牌的要求: 发布https://login.microsoftonline.com/common/oauth2/token 请求正文(x-www-form-urlencoded): grant_type = [口令] 用户名= [用户电子邮件地址] 密码= [用户密码] 资源= https://graph.microsoft.com client_id = [您新注册的应用程序ID] client_secret = [您在注册时注意到的申请密码]
如果成功,您将获得持有者和&刷新令牌作为响应。
本
答案 1 :(得分:1)
假设您已经注册并配置了(API权限)您的Azure应用程序,并且已经复制了应用程序“客户端ID”和“客户端机密”,则可以定义一个保存会话的类。 以下代码适用于我的应用程序:
import json
import requests
from requests_oauthlib import OAuth2Session
from oauthlib.oauth2 import BackendApplicationClient
class SharepointSession(object):
""" Base Class without credentials, use real credentials in derived Classes
or instances
"""
api_uri = "https://graph.microsoft.com"
api_version = "v1.0"
scope = ["https://graph.microsoft.com/.default"]
directory_id = "" # - tenant id
token_url = "https://login.microsoftonline.com/{}/oauth2/v2.0/token"
sites_url = "{}/{}/sites".format(api_uri, api_version)
site = document_name = app_name = client_id = client_secret = ""
site_id = None
doc_id = None
def __init__(self):
""" """
def getTokenizedSession(self):
"""
OAuth2 to get access token
First set up a backend client, mind to set grant_type
build a OAuth2 Session with the client
get access token
Mind: python 3.x oauthlib requires scope params on more calls than py 2.x
"""
client = BackendApplicationClient(
client_id=self.client_id, scope=self.scope, grant_type="client_credentials")
session = OAuth2Session(client=client, scope=self.scope)
# fill access token
token = session.fetch_token(token_url=self.token_url.format(self.directory_id),
client_id=self.client_id,
scope=self.scope,
client_secret=self.client_secret)
self.session = session
self.token = token
return session, token
def getSiteId(self):
# get the site id
ae = "{}/myonline.sharepoint.com:/sites/{}:".format(
self.sites_url, self.site)
rt = self.session.get(ae)
response = json.loads(rt.text)
self.site_id = response.get("id")
return self.site_id
def someOtherMethod(self):
""" ... """
现在,您可以使用从Azure应用注册中复制的凭据实例化会话类,即“目录ID”(与租户ID相同),“客户端ID”和“客户端机密” 像这样:
mysp_session = SharepointSession()
mysp_session.directory_id = "XXXXXXXX-XXXX-YYYY-ZZZZ-XXXXXXXXX"
mysp_session.site = "MySitename"
mysp_session.document_name = "Testlist"
mysp_session.client_id = r"xxxxxxxxxxxxxxxxxxxxxxx"
mysp_session.client_secret = r"xxxxxxxxxxxxxxxxxxxxxxx"
# connect
session, token = mysp_session.getTokenizedSession()
# do your business logic
mysp_session.getSiteId()
....
mysp_session.someOtherMethod()
希望有帮助
答案 2 :(得分:0)
您需要Azure AD应用程序才能使用Graph API进行身份验证。本机Azure AD应用程序以及此处描述的流程和注意事项适用于ADAL.net。我使用它来无人值守地配置Microsoft团队:http://www.cloudidentity.com/blog/2014/07/08/using-adal-net-to-authenticate-users-via-usernamepassword/
我想对于Python你应该看一下ADAL for Python:https://github.com/introp-software/azure-activedirectory-library-for-python-old/blob/master/README.md
我认为用户名/密码auth仅适用于本机Azure AD应用,而不适用于web / web api类型。