Microsoft Graph身份验证

时间:2017-08-09 22:28:41

标签: python azure oauth-2.0 azure-active-directory azure-ad-graph-api

我正在使用Python构建一个可以从Azure AD检索数据的应用程序。此数据可能需要应用程序权限或委派权限。我成功检索了只需要应用程序权限的数据。但是,为了检索需要委托权限的数据,我尝试使用OAuth2。是否可以使用OAuth2通过Microsoft Graph进行身份验证,但不是让用户使用网页登录,而是通过Python脚本本身提供用户凭据?

注意:我想使用Microsoft Graph API(v1.0和beta)而不是Azure AD Graph API。

3 个答案:

答案 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 = [您在注册时注意到的申请密码]

如果成功,您将获得持有者和&刷新令牌作为响应。

Successful password grant authentication response 希望这会有所帮助,

答案 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类型。