【问题标题】:How to access outlook address book using outlook rest api如何使用outlook rest api访问outlook通讯录
【发布时间】:2019-12-24 11:10:21
【问题描述】:

我想通过outlook rest api访问一个组织的全球通讯录

我能够使用 OAUTH2 实现单点登录部分,但我无法理解如何访问联系人对象

我已经通过this 以及许多其他示例,但无法理解如何在 PHP 中实现它们

【问题讨论】:

    标签: php azure rest oauth-2.0 outlook


    【解决方案1】:

    首先,如果您想使用rest api访问outlook联系人,目前微软建议客户使用Microsoft Graph。更多详情请参考document

    其次,关于如何获取php应用程序的outlook联系人,需要使用oauth2-client添加Azure AD身份验证并获取Azure AD访问令牌,然后调用api获取带有访问令牌的联系人。例如,请参考以下步骤了解如何在 php web application 中实现它

    1. Register Azure AD application

    2. 配置应用程序所需的应用程序权限

    3. 使用 SDK oauth2-client 实现 Azure AD 身份验证 一个。创建一个.env 文件

      OAUTH_APP_ID=YOUR_APP_ID_HERE
      OAUTH_APP_PASSWORD=YOUR_APP_PASSWORD_HERE
      OAUTH_REDIRECT_URI=<your redirect url>
      OAUTH_SCOPES='openid profile offline_access' + <your need outlook permissions>
      OAUTH_AUTHORITY=https://login.microsoftonline.com/common
      OAUTH_AUTHORIZE_ENDPOINT=/oauth2/v2.0/authorize
      OAUTH_TOKEN_ENDPOINT=/oauth2/v2.0/token
      

      b.获取访问令牌

      
      
        <?php
      
      namespace App\Http\Controllers;
      
      use App\Http\Controllers\Controller;
      use Illuminate\Http\Request;
      
      class AuthController extends Controller
      {
      public function signin()
      {
        // Initialize the OAuth client
        $oauthClient = new \League\OAuth2\Client\Provider\GenericProvider([
          'clientId'                => env('OAUTH_APP_ID'),
          'clientSecret'            => env('OAUTH_APP_PASSWORD'),
          'redirectUri'             => env('OAUTH_REDIRECT_URI'),
          'urlAuthorize'            => env('OAUTH_AUTHORITY').env('OAUTH_AUTHORIZE_ENDPOINT'),
          'urlAccessToken'          => env('OAUTH_AUTHORITY').env('OAUTH_TOKEN_ENDPOINT'),
          'urlResourceOwnerDetails' => '',
          'scopes'                  => env('OAUTH_SCOPES')
        ]);
      
        $authUrl = $oauthClient->getAuthorizationUrl();
      
        // Save client state so we can validate in callback
        session(['oauthState' => $oauthClient->getState()]);
      
        // Redirect to AAD signin page
        return redirect()->away($authUrl);
      }
      
      public function callback(Request $request)
      {
        // Validate state
        $expectedState = session('oauthState');
        $request->session()->forget('oauthState');
        $providedState = $request->query('state');
      
        if (!isset($expectedState)) {
          // If there is no expected state in the session,
          // do nothing and redirect to the home page.
          return redirect('/');
        }
      
        if (!isset($providedState) || $expectedState != $providedState) {
          return redirect('/')
            ->with('error', 'Invalid auth state')
            ->with('errorDetail', 'The provided auth state did not match the expected value');
        }
      
        // Authorization code should be in the "code" query param
        $authCode = $request->query('code');
        if (isset($authCode)) {
          // Initialize the OAuth client
          $oauthClient = new \League\OAuth2\Client\Provider\GenericProvider([
            'clientId'                => env('OAUTH_APP_ID'),
            'clientSecret'            => env('OAUTH_APP_PASSWORD'),
            'redirectUri'             => env('OAUTH_REDIRECT_URI'),
            'urlAuthorize'            => env('OAUTH_AUTHORITY').env('OAUTH_AUTHORIZE_ENDPOINT'),
            'urlAccessToken'          => env('OAUTH_AUTHORITY').env('OAUTH_TOKEN_ENDPOINT'),
            'urlResourceOwnerDetails' => '',
            'scopes'                  => env('OAUTH_SCOPES')
          ]);
      
          try {
            // Make the token request
            $accessToken = $oauthClient->getAccessToken('authorization_code', [
              'code' => $authCode
            ]);
      
      
             return redirect()->route('contacts');
          }
          catch (League\OAuth2\Client\Provider\Exception\IdentityProviderException $e) {
            return redirect('/')
              ->with('error', 'Error requesting access token')
              ->with('errorDetail', $e->getMessage());
          }
        }
      
        return redirect('/')
          ->with('error', $request->query('error'))
          ->with('errorDetail', $request->query('error_description'));
      }
      }
          ```
      
    4. 将访问令牌与Microsoft Graph SDK 一起使用。更多详情请参考docuemnt

    public function mail()
    {
      if (session_status() == PHP_SESSION_NONE) {
        session_start();
      }
    
      $tokenCache = new \App\TokenStore\TokenCache;
    
      $graph = new Graph();
      $graph->setAccessToken($tokenCache->getAccessToken());
    
      $contacts = $graph->createRequest('GET', '/me/contacts/{Id}')
                    ->setReturnType(Model\Contact::class)
                    ->execute();
    
    
    }
    

    具体如何实现,请参考sample

    另外,如果你想用php调用outlook rest api,请参考document。但请注意,您需要更改应用权限。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多