wechat redirect
parent
f7b1dd7680
commit
ab41b7f28f
|
|
@ -4,9 +4,66 @@ namespace App\Admin\Controllers;
|
|||
|
||||
use Slowlyo\OwlAdmin\Controllers\AuthController as AdminAuthController;
|
||||
use Slowlyo\OwlAdmin\Admin;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Slowlyo\OwlAdmin\Models\AdminUser;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use App\Enums\SocialiteType;
|
||||
use App\Models\UserSocialite;
|
||||
|
||||
class AuthController extends AdminAuthController
|
||||
{
|
||||
public function login(Request $request)
|
||||
{
|
||||
if (Admin::config('admin.auth.login_captcha')) {
|
||||
if (!$request->has('captcha')) {
|
||||
return $this->response()->fail(__('admin.required', ['attribute' => __('admin.captcha')]));
|
||||
}
|
||||
|
||||
if (strtolower(admin_decode($request->sys_captcha)) != strtolower($request->captcha)) {
|
||||
return $this->response()->fail(__('admin.captcha_error'));
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
$validator = Validator::make($request->all(), [
|
||||
'username' => 'required',
|
||||
'password' => 'required',
|
||||
], [
|
||||
'username' . '.required' => __('admin.required', ['attribute' => __('admin.username')]),
|
||||
'password.required' => __('admin.required', ['attribute' => __('admin.password')]),
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
abort(Response::HTTP_BAD_REQUEST, $validator->errors()->first());
|
||||
}
|
||||
$adminModel = Admin::config("admin.auth.model", AdminUser::class);
|
||||
$user = $adminModel::query()->where('username', $request->username)->first();
|
||||
if ($user && Hash::check($request->password, $user->password)) {
|
||||
$module = Admin::currentModule(true);
|
||||
$prefix = $module ? $module . '.' : '';
|
||||
$token = $user->createToken($prefix . 'admin')->plainTextToken;
|
||||
|
||||
// 更新第三方账户
|
||||
$openid = $request->input('openid');
|
||||
$open_type = $request->input('open_type');
|
||||
if ($openid && $open_type) {
|
||||
UserSocialite::where(['openid' => $openid, 'type' => SocialiteType::from($open_type)])->update([
|
||||
'user_id' => $user->id,
|
||||
'user_type' => $user->getMorphClass(),
|
||||
]);
|
||||
}
|
||||
|
||||
return $this->response()->success(compact('token'), __('admin.login_successful'));
|
||||
}
|
||||
|
||||
abort(Response::HTTP_BAD_REQUEST, __('admin.login_failed'));
|
||||
} catch (\Exception $e) {
|
||||
return $this->response()->fail($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public function currentUser()
|
||||
{
|
||||
$userInfo = Admin::user()->only(['name', 'avatar', 'id']);
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ Route::group([
|
|||
$router->resource('dashboard', \App\Admin\Controllers\HomeController::class);
|
||||
$router->get('menus', [\App\Admin\Controllers\HomeController::class, 'menus']);
|
||||
$router->get('current-user', [\App\Admin\Controllers\AuthController::class, 'currentUser']);
|
||||
$router->post('login', [\App\Admin\Controllers\AuthController::class, 'login']);
|
||||
|
||||
$router->get('login', [App\Admin\Controllers\AuthController::class, 'loginPage']);
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
namespace App\Enums;
|
||||
|
||||
use Dcat\Admin\Admin;
|
||||
|
||||
enum SocialiteType: string
|
||||
{
|
||||
case WxMini = 'wx-mini';
|
||||
case WxOfficial = 'wx-official';
|
||||
|
||||
public static function options()
|
||||
{
|
||||
return [
|
||||
self::WxMini->value => '微信小程序',
|
||||
self::WxOfficial->value => '微信公众号',
|
||||
];
|
||||
}
|
||||
|
||||
public function text()
|
||||
{
|
||||
return data_get(self::options(), $this->value);
|
||||
}
|
||||
}
|
||||
|
|
@ -3,12 +3,36 @@
|
|||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\UserSocialite;
|
||||
use App\Enums\SocialiteType;
|
||||
use Slowlyo\OwlAdmin\Admin;
|
||||
|
||||
class WechatController extends Controller
|
||||
{
|
||||
public function oauth(Request $request)
|
||||
{
|
||||
$user = session('easywechat.oauth_user.default');
|
||||
dump($user);
|
||||
$openid = $user->getId();
|
||||
$socialite = UserSocialite::updateOrCreate([
|
||||
'type' => SocialiteType::WxOfficial,
|
||||
'openid' => $openid,
|
||||
], [
|
||||
'data' => $user,
|
||||
]);
|
||||
$user = $socialite->user;
|
||||
if (!$user) {
|
||||
return redirect(url('/h5/pages/login/login') . '?openid=' . $openid);
|
||||
}
|
||||
|
||||
$module = Admin::currentModule(true);
|
||||
$prefix = $module ? $module . '.' : '';
|
||||
$token = $user->createToken($prefix . 'admin')->plainTextToken;
|
||||
|
||||
return redirect(url('/h5/pages/index/welcome') . '?token=' . $token);
|
||||
}
|
||||
|
||||
protected function response()
|
||||
{
|
||||
return Admin::response();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,33 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Http\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Overtrue\Socialite\User as SocialiteUser;
|
||||
|
||||
class UserSocialite
|
||||
{
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
|
||||
*/
|
||||
public function handle(Request $request, Closure $next): Response
|
||||
{
|
||||
if (config('app.debug')) {
|
||||
$user = new SocialiteUser([
|
||||
'id' => 'omDRm6ial5hRdys0NpnHQpYJ44aY',
|
||||
'name' => '潘亮',
|
||||
'nickname' => '潘亮',
|
||||
'avatar' => 'https://via.placeholder.com/64x64.png',
|
||||
'email' => null,
|
||||
'original' => [],
|
||||
'provider' => 'WeChat',
|
||||
]);
|
||||
session(['easywechat.oauth_user.default' => $user]);
|
||||
}
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use App\Enums\SocialiteType;
|
||||
use App\Traits\HasDateTimeFormatter;
|
||||
|
||||
class UserSocialite extends Model
|
||||
{
|
||||
use HasDateTimeFormatter;
|
||||
|
||||
protected $fillable = ['type', 'user_type', 'user_id', 'openid', 'data'];
|
||||
|
||||
protected $casts = [
|
||||
'type' => SocialiteType::class,
|
||||
'data' => 'json'
|
||||
];
|
||||
|
||||
public function user()
|
||||
{
|
||||
return $this->morphTo(__FUNCTION__, 'user_type', 'user_id');
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('user_socialites', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('type');
|
||||
$table->nullableMorphs('user');
|
||||
$table->string('openid');
|
||||
$table->json('data');
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('user_socialites');
|
||||
}
|
||||
};
|
||||
|
|
@ -1,2 +1,2 @@
|
|||
<!doctype html><html lang="zh-CN"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>宝芝堂</title><script>var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || CSS.supports('top: constant(a)'))
|
||||
document.write('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + (coverSupport ? ', viewport-fit=cover' : '') + '" />')</script><link rel="stylesheet" href="/h5/static/index.5841170f.css"/><script defer="defer" src="/h5/static/js/chunk-vendors.7032a432.js"></script><script defer="defer" src="/h5/static/js/index.731c9d79.js"></script></head><body><noscript><strong>Please enable JavaScript to continue.</strong></noscript><div id="app"></div></body></html>
|
||||
document.write('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + (coverSupport ? ', viewport-fit=cover' : '') + '" />')</script><link rel="stylesheet" href="/h5/static/index.5841170f.css"/><script defer="defer" src="/h5/static/js/chunk-vendors.7032a432.js"></script><script defer="defer" src="/h5/static/js/index.1de8d1b9.js"></script></head><body><noscript><strong>Please enable JavaScript to continue.</strong></noscript><div id="app"></div></body></html>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1 @@
|
|||
"use strict";(self["webpackChunkuniapp"]=self["webpackChunkuniapp"]||[]).push([[545],{9892:function(n,e,u){var t;u.r(e),u.d(e,{default:function(){return p}});var r,a=function(){var n=this,e=n.$createElement,u=n._self._c||e;return u("div")},i=[],l={data:function(){return{}},onLoad:function(n){n.token?(uni.setStorageSync("medical_record_auth_token",n.token),uni.reLaunch({url:"/pages/index/index"})):uni.reLaunch({url:"/pages/login/login"})}},c=l,o=u(1503),s=(0,o.Z)(c,a,i,!1,null,null,null,!1,t,r),p=s.exports}}]);
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -15,4 +15,6 @@ use Illuminate\Support\Facades\Route;
|
|||
|
||||
Route::redirect('/', '/admin');
|
||||
|
||||
Route::get('oauth', [App\Http\Controllers\WechatController::class, 'oauth'])->middleware('easywechat.oauth:default,snsapi_base');
|
||||
Route::group(['middleware' => [App\Http\Middleware\UserSocialite::class, 'easywechat.oauth:default,snsapi_base']], function () {
|
||||
Route::get('oauth', [App\Http\Controllers\WechatController::class, 'oauth']);
|
||||
});
|
||||
|
|
|
|||
Loading…
Reference in New Issue