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;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class IndexController extends Controller
{
//
public function index(){
echo '首页';
echo '首页';
echo '首页';
echo '首页';
// $data = DB::table('t_mint')->get()->toArray();
// dump($data);
// echo uniqid().md5(strtotime(now('')));
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(){
echo '有权访问show';
}
public function create(){
echo '有权访问create';
}
}

View File

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

View File

@ -8,19 +8,15 @@ use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
//use Laravel\Sanctum\HasApiTokens;
use Laravel\Passport\HasApiTokens;
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
use HasApiTokens, HasFactory, Notifiable,SoftDeletes;
protected $fillable = [
'username',
'password'
'account'
];
protected $hidden = [
'password',
];
public function nodeGroup () {
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', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => 'king_',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,

View File

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

View File

@ -13,10 +13,12 @@ use Illuminate\Support\Facades\Route;
| 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::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']);

View File

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