使用者檔案加入 建立 Token
This commit is contained in:
parent
733cf67fe6
commit
45ea55fd54
101
resources/views/livewire/profile/new-token-form.blade.php
Normal file
101
resources/views/livewire/profile/new-token-form.blade.php
Normal file
@ -0,0 +1,101 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Livewire\Volt\Component;
|
||||
|
||||
new class extends Component
|
||||
{
|
||||
public string $token = '';
|
||||
public string $tokenName = 'My Token';
|
||||
public array $tokens = [];
|
||||
|
||||
public function mount()
|
||||
{
|
||||
$this->loadTokens();
|
||||
}
|
||||
|
||||
public function newToken(): void
|
||||
{
|
||||
$user = Auth::user();
|
||||
|
||||
// 從 Spatie 權限套件取得權限名稱作為 abilities
|
||||
$abilities = $user->getAllPermissions()->pluck('name')->toArray();
|
||||
|
||||
$token = $user->createToken($this->tokenName, $abilities);
|
||||
|
||||
$this->token = $token->plainTextToken;
|
||||
$this->loadTokens();
|
||||
|
||||
session()->flash('status', 'Token created!');
|
||||
}
|
||||
|
||||
public function loadTokens()
|
||||
{
|
||||
$this->tokens = Auth::user()
|
||||
->tokens()
|
||||
->get()
|
||||
->map(function ($token) {
|
||||
return [
|
||||
'name' => $token->name,
|
||||
'abilities' => $token->abilities,
|
||||
'last_used_at' => $token->last_used_at,
|
||||
'created_at' => $token->created_at->toDateTimeString(),
|
||||
];
|
||||
})->toArray();
|
||||
}
|
||||
|
||||
public function deleteToken($name)
|
||||
{
|
||||
Auth::user()->tokens()->where('name', $name)->delete();
|
||||
$this->loadTokens();
|
||||
}
|
||||
};
|
||||
?>
|
||||
|
||||
<section class="space-y-6">
|
||||
<header>
|
||||
<h2 class="text-lg font-medium text-gray-900">
|
||||
{{ __('New API Token') }}
|
||||
</h2>
|
||||
|
||||
<p class="mt-1 text-sm text-gray-600">
|
||||
{{ __('Create a new personal access token.') }}
|
||||
</p>
|
||||
</header>
|
||||
|
||||
<form wire:submit="newToken" class="space-y-4">
|
||||
<div>
|
||||
<x-input-label for="tokenName" value="Token Name" />
|
||||
<x-text-input id="tokenName" wire:model.defer="tokenName" class="mt-1 block w-full" required />
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<x-primary-button>{{ __('Create Token') }}</x-primary-button>
|
||||
</div>
|
||||
|
||||
@if($token)
|
||||
<div class="mt-4">
|
||||
<x-input-label value="New Token" />
|
||||
<x-wireui:textarea readonly rows="2" class="mt-1 w-full">{{ $token }}</x-wireui:textarea>
|
||||
<p class="text-xs text-gray-500 mt-1">Please copy this token now. You won't be able to see it again.</p>
|
||||
</div>
|
||||
@endif
|
||||
</form>
|
||||
|
||||
<div class="mt-6">
|
||||
<h3 class="text-md font-semibold text-gray-800 mb-2">Existing Tokens ({{ count($tokens) }})</h3>
|
||||
|
||||
@forelse ($tokens as $token)
|
||||
<div class="p-3 mb-2 border rounded bg-gray-50">
|
||||
<div><strong>Name:</strong> {{ $token['name'] }}</div>
|
||||
<div><strong>Abilities:</strong> {{ implode(', ', $token['abilities']) }}</div>
|
||||
<div><strong>Created At:</strong> {{ $token['created_at'] }}</div>
|
||||
<div><strong>Last Used:</strong> {{ $token['last_used_at'] ?? 'Never' }}</div>
|
||||
|
||||
<button wire:click="deleteToken('{{ $token['name'] }}')" class="mt-2 text-sm text-red-600 hover:underline">Delete</button>
|
||||
</div>
|
||||
@empty
|
||||
<p class="text-sm text-gray-500">No tokens created yet.</p>
|
||||
@endforelse
|
||||
</div>
|
||||
</section>
|
@ -19,6 +19,12 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="p-4 sm:p-8 bg-white shadow sm:rounded-lg">
|
||||
<div class="max-w-xl">
|
||||
<livewire:profile.new-token-form />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="p-4 sm:p-8 bg-white shadow sm:rounded-lg">
|
||||
<div class="max-w-xl">
|
||||
<livewire:profile.delete-user-form />
|
||||
|
Loading…
x
Reference in New Issue
Block a user