我正在使用Microsoft Outlook Rest PHP API来认证帐户并获取用户事件。 我想将自定义参数添加到重定向URL。 我没有找到将自定义参数添加到重定向网址中的任何方法。
我正在使用这个Outlook / rest / php API-这是网址:
https://docs.microsoft.com/en-us/outlook/rest/php-tutorial#implementing-oauth2
这是我的控制器AuthController.php。
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
class AuthController extends Controller
{
public function signin()
{
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
// 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')
]);
// Output the authorization endpoint
echo 'Auth URL: '.$oauthClient->getAuthorizationUrl();
exit();
}
public function gettoken()
{
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
// Authorization code should be in the "code" query param
if (isset($_GET['code'])) {
// Check that state matches
if (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth_state'])) {
exit('State provided in redirect does not match expected value.');
}
// Clear saved state
unset($_SESSION['oauth_state']);
// 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' => $_GET['code']
]);
// Save the access token and refresh tokens in session
// This is for demo purposes only. A better method would
// be to store the refresh token in a secured database
$tokenCache = new \App\TokenStore\TokenCache;
$tokenCache->storeTokens($accessToken->getToken(), $accessToken->getRefreshToken(),
$accessToken->getExpires());
// Redirect back to mail page
return redirect()->route('mail');
}
catch (League\OAuth2\Client\Provider\Exception\IdentityProviderException $e) {
exit('ERROR getting tokens: '.$e->getMessage());
}
exit();
}
elseif (isset($_GET['error'])) {
exit('ERROR: '.$_GET['error'].' - '.$_GET['error_description']);
}
}
}
这是.env文件的详细信息
OAUTH_APP_ID=YOUR_APP_ID_HERE
OAUTH_APP_PASSWORD=YOUR_APP_PASSWORD_HERE
OAUTH_REDIRECT_URI=http://localhost:8000/authorize
OAUTH_SCOPES='openid profile offline_access User.Read Mail.Read'
OAUTH_AUTHORITY=https://login.microsoftonline.com/common
OAUTH_AUTHORIZE_ENDPOINT=/oauth2/v2.0/authorize
OAUTH_TOKEN_ENDPOINT=/oauth2/v2.0/token
请为我提供一些有关添加自定义参数的建议。
我需要使用user_id添加自定义参数。
答案 0 :(得分:1)
您不能在进行身份验证时将Microsoft重定向URL与在Microsoft App中注册的URL进行比较,如果它们与请求请求的请求不同。
我的建议是捕获应用程序中的身份验证端点,然后根据来自/ me端点的用户数据进行重定向。
答案 1 :(得分:1)
我相信Azure身份验证人员会推荐使用state
参数,该参数旨在执行您想要的操作。来自https://docs.microsoft.com/azure/active-directory/develop/v2-oauth2-auth-code-flow:
state
包含在请求中的值,该值也将在令牌响应中返回。它可以是您希望的任何内容的字符串。随机生成的唯一值通常用于防止跨站点请求伪造攻击。该值还可以对有关身份验证请求发生之前应用程序中用户状态的信息进行编码,例如用户所在的页面或视图。