OauthController.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: sdf_sky
  5. * Date: 16/6/27
  6. * Time: 下午3:04
  7. */
  8. namespace App\Http\Controllers\Account;
  9. use App\Http\Controllers\Controller;
  10. use App\Models\EmailToken;
  11. use App\Models\User;
  12. use App\Models\UserOauth;
  13. use App\Repositories\OauthRepository;
  14. use App\Repositories\UserRepository;
  15. use App\Services\SmsService;
  16. use Illuminate\Contracts\Auth\Guard;
  17. use Illuminate\Contracts\Auth\Registrar;
  18. use Illuminate\Http\Request;
  19. use Laravel\Socialite\Facades\Socialite;
  20. class OauthController extends Controller
  21. {
  22. public function login($type){
  23. return Socialite::with($type)->redirect();
  24. }
  25. public function callback($type,Request $request,Guard $auth){
  26. $oauthUser = Socialite::driver($type)->user();
  27. if(!$oauthUser){
  28. abort(500);
  29. }
  30. $refresh_token = '';
  31. if(isset($oauthUser->accessTokenResponseBody['refresh_token'])){
  32. $refresh_token = $oauthUser->accessTokenResponseBody['refresh_token'];
  33. }
  34. if( Auth()->check() ){ //用户登录时处理绑定请求
  35. $request->user()->userOauth()->where("auth_type",'=',$type)->delete();
  36. UserOauth::where('id','=',$oauthUser->id)->delete();
  37. $userOauth = UserOauth::create([
  38. 'id'=>$oauthUser->id,
  39. 'auth_type'=>$type,
  40. 'user_id'=> $request->user()->id,
  41. 'nickname'=>$oauthUser->nickname,
  42. 'avatar'=>$oauthUser->avatar,
  43. 'access_token'=>$oauthUser->accessTokenResponseBody['access_token'],
  44. 'refresh_token'=>$refresh_token,
  45. 'expires_in'=>$oauthUser->accessTokenResponseBody['expires_in'],
  46. ]);
  47. if($userOauth){
  48. return $this->success( route('auth.profile.oauth') , $type .'绑定成功!');
  49. }
  50. return $this->error(route('auth.profile.oauth'),'绑定失败请稍后重试!');
  51. }
  52. //游客登录处理注册流程
  53. $userOauth = UserOauth::find($oauthUser->id);
  54. if( $userOauth && $userOauth->user_id > 0 ){
  55. $auth->loginUsingId($userOauth->user_id);
  56. if($this->credit($request->user()->id,'login',Setting()->get('coins_login'),Setting()->get('credits_login'))){
  57. $message = '登陆成功! '.get_credit_message(Setting()->get('credits_login'),Setting()->get('coins_login'));
  58. return $this->success(route('website.index'),$message);
  59. }
  60. /*认证成功后跳转到首页*/
  61. return redirect()->to(route('website.index'));
  62. }
  63. UserOauth::where('id','=',$oauthUser->id)->delete();
  64. $oauthData = UserOauth::create([
  65. 'id'=>$oauthUser->id,
  66. 'auth_type'=>$type,
  67. 'user_id'=> 0,
  68. 'nickname'=>$oauthUser->nickname,
  69. 'avatar'=>$oauthUser->avatar,
  70. 'access_token'=>$oauthUser->accessTokenResponseBody['access_token'],
  71. 'refresh_token'=>$refresh_token,
  72. 'expires_in'=>$oauthUser->accessTokenResponseBody['expires_in'],
  73. ]);
  74. if($oauthData){
  75. return redirect(route('auth.oauth.profile',['auth_id'=>$oauthUser->id]));
  76. }
  77. return $this->error(route('auth.profile.oauth'),$type.'登录错误,请稍后再试!');
  78. }
  79. public function unbind( $type , Request $request){
  80. $request->user()->userOauth()->where('auth_type','=',$type)->delete();
  81. return $this->success( route('auth.profile.oauth') , $type .'已解除绑定!');
  82. }
  83. public function profile($auth_id)
  84. {
  85. $userOauth = UserOauth::find($auth_id);
  86. if(!$userOauth){
  87. abort(404);
  88. }
  89. return view('theme::account.oauth')->with(compact('userOauth'));
  90. }
  91. public function register(Request $request,UserRepository $userRepository,Guard $auth,OauthRepository $oauthRepository)
  92. {
  93. $validateRules['name'] = 'required|min:2|max:100';
  94. $request->flash();
  95. if(Setting()->get('register_type') == 'email'){
  96. $validateRules['email'] = 'required|email|max:255|unique:users';
  97. }else{
  98. $validateRules['mobile'] = 'required|regex:/^1[3456789]\d{9}$/';
  99. $validateRules['code'] = 'required|min:4|:max:8';
  100. }
  101. /*表单数据校验*/
  102. $this->validate($request,$validateRules);
  103. $formData = $request->all();
  104. $formData['password'] = 'oauth';
  105. $formData['status'] = 0;
  106. $formData['visit_ip'] = $request->getClientIp();
  107. /*手机模式认证*/
  108. $user = [];
  109. if( Setting()->get('register_type') == 'mobile' ){
  110. if( !SmsService::verifySmsCode($formData['mobile'],$request->input('code')) ) {
  111. return view("theme::account.register")->withErrors(['code'=>'验证码错误']);
  112. }
  113. $formData['status'] = 1;
  114. $user = User::where("mobile","=",$formData['mobile'])->where("status","=",1)->first();
  115. }
  116. if(!$user){
  117. $user = $userRepository->register($formData);
  118. $user->attachRole(2); //默认注册为普通用户角色
  119. }
  120. $oauthRepository->bind($formData['auth_id'],$user->id);
  121. $auth->login($user);
  122. $message = '登录成功!';
  123. if($this->credit($request->user()->id,'register',Setting()->get('coins_register'),Setting()->get('coins_register'))){
  124. $message .= get_credit_message(Setting()->get('credits_register'),Setting()->get('coins_register'));
  125. }
  126. if(Setting()->get('register_type')=='email') {
  127. /*发送邮箱验证邮件*/
  128. $emailToken = EmailToken::create([
  129. 'email' => $user->email,
  130. 'token' => EmailToken::createToken(),
  131. 'action' => 'register'
  132. ]);
  133. if ($emailToken) {
  134. $subject = '欢迎注册' . Setting()->get('website_name') . ',请激活您注册的邮箱!';
  135. $content = "「" . $request->user()->name . "」您好,请激活您在 " . Setting()->get('website_name') . " 的注册邮箱!<br /> 请在1小时内点击该链接激活注册账号 → " . route('auth.email.verifyToken', ['action' => $emailToken->action, 'token' => $emailToken->token]) . "<br />如非本人操作,请忽略此邮件!";
  136. $this->sendEmail($emailToken->email, $subject, $content);
  137. }
  138. }
  139. return $this->success(route('website.index'),$message);
  140. }
  141. }