add metaMask-login

This commit is contained in:
hujiabin 2022-07-19 14:27:05 +08:00
parent 1879fdd653
commit 22c47593a6
9 changed files with 110 additions and 38 deletions

View File

@ -3,15 +3,15 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class IndexController extends Controller class IndexController extends Controller
{ {
// //
public function index(){ public function index(){
echo '首页'; // $data = DB::table('t_mint')->get()->toArray();
echo '首页'; // dump($data);
echo '首页'; // echo uniqid().md5(strtotime(now('')));
echo '首页'; echo env('WEB3_SERVE_URL');
} }
} }

View File

@ -0,0 +1,69 @@
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
class MeteMaskLoginController extends Controller
{
public function getNonce(Request $request)
{
$account = $request->get('account', '');
if (!$account) {
return $this->error(ERROR_CODE_PARAM_INVALID, '缺少参数:account');
}
$nonce = uniqid() . '_' . md5(time());
return $this->success($nonce);
}
public function mateMaskLogin(Request $request)
{
$account = strtolower($request->get('account', ''));
$tips = strtolower($request->get('tips', ''));
$nonce = strtolower($request->get('nonce', ''));
$signature = strtolower($request->get('signature', ''));
$param = [
'c' => 'BcService',
'a' => 'authVerifySignature',
'tips' => $tips,
'nonce' => $nonce,
'signature' => $signature
];
$response = Http::get(env('WEB3_SERVE_URL'), $param);
if (!$response->successful()) {
return $this->error(ERROR_CODE_INTERNAL_ERROR, 'WEB3服务出现错误');
}
$res = $response->json();
if (! isset($res['recovered'])){
return $this->error(ERROR_CODE_INTERNAL_ERROR, 'Signature verification failed');
}
if(! $this->isSameAddress($res['recovered'],$account)){
return $this->error(ERROR_CODE_INTERNAL_ERROR, 'Signature verification failed');
}
$user = User::withTrashed()->firstOrCreate([
'account' => $account
]);
if($user->trashed()) {
return $this->error(ERROR_CODE_PERMISSION_NO,'账号号已禁用, 无法登陆');
}
$user['token'] = $user->createToken('api')->accessToken;
return $this->success($user);
}
/**
* 退出登录
* @return \Illuminate\Http\JsonResponse
*/
public function logout (Request $request) {
$request->user()->token()->revoke();
return $this->success();
}
private function isSameAddress($a,$b){
return strtolower($a) == strtolower($b);
}
}

View File

@ -14,4 +14,8 @@ class UserController extends Controller
public function show(){ public function show(){
echo '有权访问show'; echo '有权访问show';
} }
public function create(){
echo '有权访问create';
}
} }

View File

@ -20,27 +20,27 @@ class CheckNode
*/ */
public function handle(Request $request, Closure $next) public function handle(Request $request, Closure $next)
{ {
$uid = $request->user()->id; // $uid = $request->user()->id;
$url = $request->route()->getActionName(); // $url = $request->route()->getActionName();
$controller = strtolower(substr($url,strrpos($url,'\\')+1,strrpos($url,'@')-strrpos($url,'\\')-1)) ; // $controller = strtolower(substr($url,strrpos($url,'\\')+1,strrpos($url,'@')-strrpos($url,'\\')-1)) ;
$action = strtolower(substr($url,strrpos($url,'@')+1)); // $action = strtolower(substr($url,strrpos($url,'@')+1));
$path = $controller.'/'.$action; // $path = $controller.'/'.$action;
$user = User::with('nodeGroup')->find($uid)->toArray(); // $user = User::with('nodeGroup')->find($uid)->toArray();
if (empty($user['node_group'])) { // if (empty($user['node_group'])) {
return $this->error(ERROR_CODE_PERMISSION_NO,'无权访问'); // return $this->error(ERROR_CODE_PERMISSION_NO,'无权访问');
} // }
$node_ids = array_column($user['node_group'],'node_ids'); // $node_ids = array_column($user['node_group'],'node_ids');
foreach ($node_ids as &$val){ // foreach ($node_ids as &$val){
$val = explode(',',$val); // $val = explode(',',$val);
} // }
$node_ids = arrayValues($node_ids); // $node_ids = arrayValues($node_ids);
if (count($node_ids) == 1 && $node_ids[0] == 'all'){ // if (count($node_ids) == 1 && $node_ids[0] == 'all'){
return $next($request); // return $next($request);
} // }
$route_uri = array_filter(array_unique(array_column(Node::getRouteUriById($node_ids),'route_uri'))); // $route_uri = array_filter(array_unique(array_column(Node::getRouteUriById($node_ids),'route_uri')));
if (! in_array($path,$route_uri)){ // if (! in_array($path,$route_uri)){
return $this->error(ERROR_CODE_PERMISSION_NO,'无权访问'); // return $this->error(ERROR_CODE_PERMISSION_NO,'无权访问');
} // }
return $next($request); return $next($request);
} }
} }

View File

@ -8,19 +8,15 @@ use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable; use Illuminate\Notifications\Notifiable;
//use Laravel\Sanctum\HasApiTokens; //use Laravel\Sanctum\HasApiTokens;
use Laravel\Passport\HasApiTokens; use Laravel\Passport\HasApiTokens;
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Authenticatable class User extends Authenticatable
{ {
use HasApiTokens, HasFactory, Notifiable; use HasApiTokens, HasFactory, Notifiable,SoftDeletes;
protected $fillable = [ protected $fillable = [
'username', 'account'
'password'
]; ];
protected $hidden = [
'password',
];
public function nodeGroup () { public function nodeGroup () {
return $this->belongsToMany(NodeGroup::class, 'user_node_line', 'user_id', 'node_group_id'); return $this->belongsToMany(NodeGroup::class, 'user_node_line', 'user_id', 'node_group_id');

View File

@ -54,7 +54,7 @@ return [
'unix_socket' => env('DB_SOCKET', ''), 'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4', 'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci', 'collation' => 'utf8mb4_unicode_ci',
'prefix' => 'king_', 'prefix' => '',
'prefix_indexes' => true, 'prefix_indexes' => true,
'strict' => true, 'strict' => true,
'engine' => null, 'engine' => null,

View File

@ -16,8 +16,8 @@ class CreateUsersTable extends Migration
{ {
Schema::create('users', function (Blueprint $table) { Schema::create('users', function (Blueprint $table) {
$table->id(); $table->id();
$table->string('username',32)->comment("账户"); $table->string('nickname',32)->comment("昵称");
$table->string('password',64)->comment("密码"); $table->string('account',64)->comment("小狐狸钱包账号");
$table->timestamps(); $table->timestamps();
$table->softDeletes(); $table->softDeletes();
}); });

View File

@ -13,10 +13,12 @@ use Illuminate\Support\Facades\Route;
| is assigned the "api" middleware group. Enjoy building your API! | is assigned the "api" middleware group. Enjoy building your API!
| |
*/ */
Route::post('login',[\App\Http\Controllers\LoginController::class,'login']); //Route::post('login',[\App\Http\Controllers\LoginController::class,'login']);
Route::get('get-nonce',[\App\Http\Controllers\MeteMaskLoginController::class,'getNonce']);
Route::post('metamask-login',[\App\Http\Controllers\MeteMaskLoginController::class,'mateMaskLogin']);
Route::middleware('auth:api')->group(function () { Route::middleware('auth:api')->group(function () {
Route::get('logout',[\App\Http\Controllers\LoginController::class,'logout']); Route::get('logout',[\App\Http\Controllers\MeteMaskLoginController::class,'logout']);
Route::get('home',[\App\Http\Controllers\IndexController::class,'index']); Route::get('home',[\App\Http\Controllers\IndexController::class,'index']);

View File

@ -16,3 +16,4 @@ use Illuminate\Support\Facades\Route;
Route::get('/', function () { Route::get('/', function () {
return view('welcome'); return view('welcome');
}); });
Route::get('/a', [\App\Http\Controllers\IndexController::class,'index']);