Ability to choose particular tenant (by tenantId)
Closed this issue · 4 comments
First of all, i was super happy to find this package! Definitely reduce the gymnastic around Laravel's OAuth2!!
Is your feature request related to a problem? Please describe.
Currently the tenantId is selected by hardcode i found in AuthorizationCallbackController.php line 29
$tenantId = $identity->getConnections()[0]->getTenantId();
Describe the solution you'd like
I wonder if we could have the OAuthCredentialManager to store connections as an array which we can iterate to select connection with the right tenantId
Describe alternatives you've considered
I am considering to override the vendor's AuthorizationCallbackController.php
Additional context
I truly wonder if there is a much better way to allow this Package to support multiple tenant Xero account
Ah.. i manage to solve my issue by doing the following:
-
Copy \vendor\webfox\laravel-xero-oauth2\src\Controllers\AuthorizationCallbackController.php to app\Http\Controllers\AuthorizationCallbackController.php
-
Then i added this to my route (web.php)
Route::middleware('web')->group(function() { Route::get('/xero/auth/callback', AuthorizationCallbackController::class)->name('xero.auth.callback'); });
-
Then on .env I added:
XERO_TENANT_NAME="TENANT_NAME_HERE"
-
Finally i altered the __invoke function as shown below:
`
public function __invoke(Request $request, OauthCredentialManager $oauth, IdentityApi $identity, Oauth2Provider $provider)
{
try {
$this->validate($request, [
'code' => ['required', 'string'],
'state' => ['required', 'string', "in:{$oauth->getState()}"]
]);$accessToken = $provider->getAccessToken('authorization_code', $request->only('code')); $identity->getConfig()->setAccessToken((string)$accessToken->getToken()); $tenantId = ''; foreach ($identity->getConnections() as $connection) { if ($connection['tenant_name'] == env('XERO_TENANT_NAME')) { $tenantId = $connection['tenant_id']; } } if ($tenantId == '') return $this->onFailure(new \throwable('Tenant Not Found')); $oauth->store($accessToken, $tenantId); Event::dispatch(new XeroAuthorized($oauth->getData())); return $this->onSuccess(); } catch (\throwable $e) { return $this->onFailure($e); }
}
`
Interesting, We've never really run into a case where we have multiple tenants on a single access token.
Is this when the user you've logged into Xero with is connected to multiple organizations?
I'd definitely be open to finding a way of supporting this without users having to copy and callback controller.
Is this when the user you've logged into Xero with is connected to multiple organizations? yes! :)
Im not sure about other scenario, but right now with mine is i am developing a web app for a client which require me to interact with Xero via XeroAPI.
I am connecting to Xero with my developer account, and i have multiple tenants because i test my codes to Demo Company as the tenant, and the client will soon be another tenant for the web app to connect to :)
My temporary solution above works (for now) but it would be great if we find a way for the others to do this in an easier manner haha.
By the way i also notice that on Xero's official Postman sample environment, they also hard coded it! see below:
postman.setEnvironmentVariable("xero-tenant-id", data[0].tenantId);
This is exactly my current scenario AppoloSoft. I have a client whom has access to their clients accounts (tenants) and we authorise them all but then want to access the details of individual accounts from a single application, kinda like XERO does natively but for an easier generalisation.