diff --git a/app/Http/Controllers/OAuth/ApiTokenController.php b/app/Http/Controllers/OAuth/ApiTokenController.php new file mode 100644 index 000000000..438740b5b --- /dev/null +++ b/app/Http/Controllers/OAuth/ApiTokenController.php @@ -0,0 +1,49 @@ +getContent(), true); + + if (isset($data['access_token'])) { + $tokenId = $this->getTokenIdFromJwt($data['access_token']); + + if ($tokenId) { + $token = Token::find($tokenId); + + if ($token) { + $data['created_at'] = $token->created_at->toIso8601String(); + } + } + } + + return response()->json($data, $response->getStatusCode()); + } + + private function getTokenIdFromJwt(string $jwt): ?string + { + try { + $parts = explode('.', $jwt); + if (count($parts) !== 3) { + return null; + } + + $payload = json_decode(base64_decode(strtr($parts[1], '-_', '+/')), true); + + return $payload['jti'] ?? null; + } catch (\Exception $e) { + return null; + } + } +} diff --git a/app/Models/OAuthToken.php b/app/Models/OAuthToken.php new file mode 100644 index 000000000..f97007cf5 --- /dev/null +++ b/app/Models/OAuthToken.php @@ -0,0 +1,20 @@ +by($request->ip()); }); + Passport::useTokenModel(OAuthToken::class); Passport::tokensExpireIn(now()->addDays(config('instance.oauth.token_expiration', 356))); Passport::refreshTokensExpireIn(now()->addDays(config('instance.oauth.refresh_expiration', 400))); Passport::enableImplicitGrant(); diff --git a/routes/web.php b/routes/web.php index 7d774b79c..2c8f8e3b2 100644 --- a/routes/web.php +++ b/routes/web.php @@ -54,7 +54,7 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact 'prefix' => config('passport.path', 'oauth'), ], function () { Route::post('/token', [ - 'uses' => '\Laravel\Passport\Http\Controllers\AccessTokenController@issueToken', + 'uses' => '\App\Http\Controllers\OAuth\ApiTokenController@issueToken', 'as' => 'token', 'middleware' => 'throttle', ]); @@ -206,7 +206,7 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact Route::get('web/profile/_/{id}', 'InternalApiController@remoteProfile'); Route::get('web/post/_/{profileId}/{statusid}', 'InternalApiController@remoteStatus'); - Route::group(['prefix' => 'import', 'middleware' => 'dangerzone'], function() { + Route::group(['prefix' => 'import', 'middleware' => 'dangerzone'], function () { Route::get('job/{uuid}/1', 'ImportController@instagramStepOne'); Route::post('job/{uuid}/1', 'ImportController@instagramStepOneStore'); Route::get('job/{uuid}/2', 'ImportController@instagramStepTwo'); @@ -249,7 +249,7 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact Route::group(['prefix' => 'settings'], function () { Route::redirect('/', '/settings/home'); Route::get('home', 'SettingsController@home') - ->name('settings'); + ->name('settings'); Route::post('home', 'SettingsController@homeUpdate'); Route::get('avatar', 'SettingsController@avatar')->name('settings.avatar'); Route::post('avatar', 'AvatarController@store'); @@ -271,14 +271,14 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact Route::post('privacy/blocked-instances/unblock', 'SettingsController@blockedInstanceUnblock')->name('settings.privacy.blocked-instances.unblock'); Route::get('privacy/blocked-keywords', 'SettingsController@blockedKeywords')->name('settings.privacy.blocked-keywords'); Route::post('privacy/account', 'SettingsController@privateAccountOptions')->name('settings.privacy.account'); - Route::group(['prefix' => 'remove', 'middleware' => 'dangerzone'], function() { + Route::group(['prefix' => 'remove', 'middleware' => 'dangerzone'], function () { Route::get('request/temporary', 'SettingsController@removeAccountTemporary')->name('settings.remove.temporary'); Route::post('request/temporary', 'SettingsController@removeAccountTemporarySubmit'); Route::get('request/permanent', 'SettingsController@removeAccountPermanent')->name('settings.remove.permanent'); Route::post('request/permanent', 'SettingsController@removeAccountPermanentSubmit'); }); - Route::group(['prefix' => 'security', 'middleware' => 'dangerzone'], function() { + Route::group(['prefix' => 'security', 'middleware' => 'dangerzone'], function () { Route::get( '/', 'SettingsController@security' @@ -334,7 +334,7 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact Route::get('accessibility', 'SettingsController@accessibility')->name('settings.accessibility'); Route::post('accessibility', 'SettingsController@accessibilityStore'); - Route::group(['prefix' => 'relationships'], function() { + Route::group(['prefix' => 'relationships'], function () { Route::redirect('/', '/settings/relationships/home'); Route::get('home', 'SettingsController@relationshipsHome')->name('settings.relationships'); }); @@ -343,15 +343,15 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact Route::get('invites', 'UserInviteController@show')->name('settings.invites'); // Route::get('sponsor', 'SettingsController@sponsor')->name('settings.sponsor'); // Route::post('sponsor', 'SettingsController@sponsorStore'); - Route::group(['prefix' => 'import', 'middleware' => 'dangerzone'], function() { - Route::get('/', 'SettingsController@dataImport')->name('settings.import'); - Route::prefix('instagram')->group(function() { - Route::get('/', 'ImportController@instagram')->name('settings.import.ig'); - Route::post('/', 'ImportController@instagramStart'); - }); - Route::prefix('mastodon')->group(function() { - Route::get('/', 'ImportController@mastodon')->name('settings.import.mastodon'); - }); + Route::group(['prefix' => 'import', 'middleware' => 'dangerzone'], function () { + Route::get('/', 'SettingsController@dataImport')->name('settings.import'); + Route::prefix('instagram')->group(function () { + Route::get('/', 'ImportController@instagram')->name('settings.import.ig'); + Route::post('/', 'ImportController@instagramStart'); + }); + Route::prefix('mastodon')->group(function () { + Route::get('/', 'ImportController@mastodon')->name('settings.import.mastodon'); + }); }); Route::get('timeline', 'SettingsController@timelineSettings')->name('settings.timeline'); @@ -359,18 +359,18 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact Route::get('media', 'SettingsController@mediaSettings')->name('settings.media'); Route::post('media', 'SettingsController@updateMediaSettings'); - Route::group(['prefix' => 'account/aliases', 'middleware' => 'dangerzone'], function() { + Route::group(['prefix' => 'account/aliases', 'middleware' => 'dangerzone'], function () { Route::get('manage', 'ProfileAliasController@index'); Route::post('manage', 'ProfileAliasController@store'); Route::post('manage/delete', 'ProfileAliasController@delete'); }); - Route::group(['prefix' => 'account/migration', 'middleware' => 'dangerzone'], function() { + Route::group(['prefix' => 'account/migration', 'middleware' => 'dangerzone'], function () { Route::get('manage', 'ProfileMigrationController@index'); Route::post('manage', 'ProfileMigrationController@store'); }); - Route::group(['prefix' => 'filters'], function() { + Route::group(['prefix' => 'filters'], function () { Route::get('/', 'SettingsController@filtersHome')->name('settings.filters'); }); }); @@ -389,7 +389,7 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact Route::view('language', 'site.language')->name('site.language'); Route::get('contact', 'ContactController@show')->name('site.contact'); Route::post('contact', 'ContactController@store'); - Route::group(['prefix'=>'kb'], function() { + Route::group(['prefix' => 'kb'], function () { Route::view('getting-started', 'site.help.getting-started')->name('help.getting-started'); Route::view('sharing-media', 'site.help.sharing-media')->name('help.sharing-media'); Route::view('your-profile', 'site.help.your-profile')->name('help.your-profile'); @@ -440,7 +440,7 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact Route::get('{username}', 'ProfileController@permalinkRedirect'); }); - Route::group(['prefix' => 'installer'], function() { + Route::group(['prefix' => 'installer'], function () { Route::get('api/requirements', 'InstallController@getRequirements')->withoutMiddleware(['web']); Route::post('precheck/database', 'InstallController@precheckDatabase')->withoutMiddleware(['web']); Route::post('store', 'InstallController@store')->withoutMiddleware(['web']); @@ -448,7 +448,7 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact Route::get('/{q}', 'InstallController@index')->withoutMiddleware(['web'])->where('q', '.*'); }); - Route::group(['prefix' => 'e'], function() { + Route::group(['prefix' => 'e'], function () { Route::get('terms', 'MobileController@terms'); Route::get('privacy', 'MobileController@privacy'); }); @@ -459,7 +459,7 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact Route::redirect('groups/', '/groups/home'); Route::redirect('groups/home', '/groups/feed'); - Route::prefix('groups')->group(function() { + Route::prefix('groups')->group(function () { // Route::get('feed', 'GroupController@index'); Route::get('{id}/invite/claim', 'GroupController@groupInviteClaim'); Route::get('{id}/invite', 'GroupController@groupInviteLanding');