如何使用新的Microsoft图形API登录用户到yii网站

时间:2019-03-25 16:21:05

标签: php yii2 microsoft-graph yii2-authclient

我正在创建一个需要通过Microsoft oauth授权的站点。在yii / authclient中,只有实时客户端,并且不再起作用。

我试图写自己的书,但是出了点问题。据我了解,我的AuthAction没有看到clientId并返回404异常(无文本)。这是我的身份验证客户端代码。

我得到了什么 What I get

运行AuthAction类方法(默认) AuthAction class method run (it's default)

class Office365OAuth extends OAuth2
{
    public $authUrl = 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize';
    public $tokenUrl = 'https://login.microsoftonline.com/common/oauth2/v2.0/token';
    public $apiBaseUrl = 'https://login.microsoftonline.com/common/oauth2/v1.0';

    public $scope = null;

    public function init()
    {
        parent::init();
        if ($this->scope === null)
        {
            $this->scope = 'https://graph.microsoft.com/User.Read';
        }
    }

    /**
     * Overrides default function to fix malformed url
     */
    public function getReturnUrl()
    {
        return $this->returnUrl;
    }

    protected function defaultName()
    {
        return 'office365';
    }

    protected function defaultTitle()
    {
        return 'Office365';
    }

    /**
     * For popup mode
     */
    protected function defaultViewOptions()
    {
        return [
            'popupWidth' => 800,
            'popupHeight' => 500,
        ];
    }

    /**
     * Gets new auth token to replace expired one.
     */
    protected function initUserAttributes()
    {
        return $this->api('me', 'GET');
    }
}

那么,如何通过MS图形进行身份验证?

1 个答案:

答案 0 :(得分:0)

yii\authclient软件包需要使用具有请求参数authclient=live的returnUrl,例如https://example.com/site/auth?authclient=live

但是,Azure禁止returnUrl中的请求参数。因此,要使yii\authclient与Azure一起工作,即returnUrl为https://example.com/site/auth/live。您需要使用请求参数来美化网址,如下所示:

config/main.php

'components' => [
     'urlManager' => [
         'class' => 'yii\web\UrlManager',
         'enablePrettyUrl' => true,
         'rules' => [
             'site/auth/<authclient>' => 'site/auth'
         ]
     ]
]

controllers/SiteController.php中,

public function actions()
{
    return [
        'auth' => [
            'class' => 'yii\authclient\AuthAction',
            'successCallback' => [$this, 'onAuthSuccess']
        ]
    ];
}

...

public function onAuthSuccess($client) {
    // get user data from client
    $userAttributes = $client->getUserAttributes();
    // DO YOUR THING
}