middleware('auth:api', ['except' => ['login', 'refresh','getSendToken']]);
// 另外关于上面的中间件,官方文档写的是『auth:api』
// 但是我推荐用 『jwt.auth』,效果是一样的,但是有更加丰富的报错信息返回
}
/**
* 获取签名token
* @return mixed
*/
public function getSendToken()
{
$time=time();
$send_token_num=session('send_token_num','0');
$send_token_time=session('send_token_time','');
session(['send_token_num' => ++$send_token_num]);
if($send_token_time<$time-60 && $send_token_num>2){
return response()->json([
'msg' => "",
'data' => [
'send_token_str' =>'验证失败'
],
'code' => 0,
]);
}
session(['send_token_time' =>$time]);
$str = '';
$strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
$max = strlen($strPol) - 1;
for ($i = 0; $i < 10; $i++) {
$str .= $strPol[rand(0, $max)];//rand($min,$max)生成介于min和max两个数之间的一个随机整数
}
session(['send_token_str' => $str]);
return response()->json([
'msg' => "",
'data' => [
'send_token_str' =>$str
],
'code' => 1,
]);
}
/**
* @return \Illuminate\Http\JsonResponse
* @throws \App\Exceptions\Sign\SignException
*/
public function login()
{
if( strtolower(env('APP_ENV')) == 'down' ){
return $this->apiResponseError(null, '系统维护中...');
}
$is_behavior=Yp::validateYP();
if(empty($is_behavior) ){
return $this->apiResponseError(null, '请完成滑块验证...');
// return $this->apiResponseError(null, '系统升级中...');
}
// $send_token_sign=request()->input('send_token_sign', '');
// if($send_token_sign){
// //滑块验证
// $send_token_str=session('send_token_str');
// if(empty($send_token_sign) || empty($send_token_str)){
// return response()->json([
// 'msg' => '请按住滑块验证',
// 'data' => [],
// 'code' => 0,
// ]);
// }
// $sys_token_sign=md5( substr($send_token_str,5).'ziUDRO96uFhSOxdCMc58bPPznJDataaM');
// if($send_token_sign!=$sys_token_sign){
// return response()->json([
// 'msg' => '滑块验证失败,请重新验证',
// 'data' => [],
// 'code' => 0,
// ]);
// }
// }
$credentials = request(['phone', 'password']);
$rCount = Member::where('phone', request()->input('phone', ''))->count();
if( $rCount <= 0 ){ return $this->apiResponseError(null, '账户不存在'); }
if (! $token = auth('api')->attempt($credentials)) { return $this->apiResponseError(null, '密码不正确'); }
// 登录成功缓存token
$user = auth('api')->user();
if ( !empty($user->deleted_at) ) { return $this->apiResponseError(null, '账号已被注销'); }
$new_token = SignServer::loginSign($user);
// 判断当前会员是否被冻结
if( $user->is_show >= 1 ){
JWTAuth::setToken($user->last_jwt_token)->invalidate(); // 加入黑名单
auth('api')->logout();
$apiDetection = ApiDetection::where('member_id', $user->id)->first();
if( !empty($apiDetection) && $apiDetection->{'count'} >= 5 ){
return $this->apiResponseError(null, '系统检查你是机器人,自动封号,请联系客服');
}else{
return $this->apiResponseError(null, '账号已被冻结');
}
}
// if($user->id!= 1 && $user->id!=12277 && $user->phone!='18200172438'){
// return $this->apiResponseError(null, '系统升级中...');
// }
if( $user->id > 1 && $user->id != 12277 ){
$loginMac = request()->input('mac', '');
// 记录会员数据
// file_put_contents(base_path('member_login.txt'),"Phone:{$user->phone}; Mac:{$loginMac}; Member_user:{$user->mac}\r\n", FILE_APPEND);
if( empty($loginMac)) {
return $this->apiResponseError(null, '无法获取手机设备信息');
}else{
$loginMac=explode(',',$loginMac);
if(!empty($loginMac[0]))$loginMac=$loginMac[0];
}
// 判断当前是否绑定MAC
if ( !empty($user->mac) ) {
$xMember = Member::where('mac', $loginMac)->where('id','<>',$user->id)->first();
if( !empty($xMember) ){ return $this->apiResponseError(null, '已绑定'.":".(empty($xMember->{'phone'}) ? '' : $xMember->{'phone'}) ); }
}else{
// 判断mac是否已被绑定
$countMac = Member::where('mac', $loginMac)->count();
if( $countMac > 0 ) {
$xMember = Member::where('mac', $loginMac)->first();
return $this->apiResponseError(null, '已绑定:'.$xMember->{'phone'});
}else{
Member::where('id', $user->id)->update([
'mac' => $loginMac
]);
}
}
}
// 之前token加入黑名单
$oldToken = $user->last_jwt_token;
if( !empty($oldToken) && JWTAuth::setToken($oldToken)->check() ){
JWTAuth::setToken($oldToken)->invalidate(); // 加入黑名单
}
// 清除登录信息
ApiToken::where('member_id', $user->id)->update(['count' => 0]);
// 保存最后一次token
Member::where('id', $user->id)->update(['last_jwt_token' => $token]);
return $this->respondWithToken($token,$user->id, $new_token);
}
/**
* Get the authenticated User.
*
* @return \Illuminate\Http\JsonResponse
*/
public function me()
{
$user = auth('api')->user();
// 判断会员矿机状态
$status = 1;
if ( $user->machine_status == 0 ) {
$status = 1; // 可以挖矿
}else if( $user->machine_status == 1 ){
// 判断当前是否已经释放完成
if(
Carbon::now(config('app.timezone'))->lt(Carbon::parse($user->machine_end_time, config('app.timezone')))
){
$status = 2; // 挖矿进行中
}else{
// 挖矿已结束
if( $user->machine_receive == 0 ){
$status = 3; // 待领取
}else{
$status = 4; // 已领取
}
}
}
$config = Config::where('key', '_me_de')->first();
$span = explode("\r\n", $config->{'value'});
$st = Tip::where('member_id', $user->id)->where('status', 1)->count();
return response()->json([
'msg' => '获取用户信息',
'data' => [
'm_id' => $user->{'id'}, // 会员ID
'username' => empty($user->username) ? "小富农" : $user->username, // 会员昵称
'phone' => $user->phone, // 会员手机账号
'referee_phone' => $user->referee_phone, // 推荐人账号
'level_name' => $user->level->name, // 会员级别
'star_name' => $user->star->name, // 会员星级
'fruit' => MemberServer::frontUnit($user->fruit / 1000000),// 会员果实(两位小数)
'contribution' => MemberServer::frontUnit($user->contribution), // 贡献值(两位小数)
'activity' => MemberServer::frontUnit($user->activity), // 活跃度(两位小数)
'honor' => MemberServer::frontUnit($user->honor), // 荣誉值(两位小数)
'is_prove' => $user->is_active, // 是否实名认证;0:未认证;1:已认证;
'is_prove_name' => $user->is_active > 1 ? '已认证' : '未认证', // 实名认证
'freeze' => $user->is_show, // 限制登录;0:正常用户;1:冻结账户
'avatar' => $user->avatar ?: asset('/storage/avatar/default/default_av.png'), // 用户头像
'machine_status' => $user->machine_status, // 矿机挖矿状态;0:今日未手动开启;1:当日手动开启;
'machine_start_time'=> Carbon::now(config('app.timezone'))->timestamp, // 矿机开始时间
'machine_end_time' => empty($user->machine_end_time) ? 0 : Carbon::parse($user->machine_end_time, config('app.timezone'))->timestamp, // 矿机结束时间
'machine_unit' => $user->machine_unit, // 矿机每秒单价
'machine_total' => empty($user->machine_start_time) ? 0 : (
((Carbon::now(config('app.timezone'))->timestamp >= Carbon::parse($user->machine_end_time, config('app.timezone'))->timestamp) ? Carbon::parse($user->machine_end_time, config('app.timezone'))->timestamp : Carbon::now(config('app.timezone'))->timestamp)
-
Carbon::parse($user->machine_start_time, config('app.timezone'))->timestamp
) * $user->machine_unit, // 矿机产矿总数
'machine_receive' => $user->machine_receive, // 挖矿领取状态;0:未领取;1:当日已领取;
'area_id' => $user->area_id > 0 ? $user->area->name : '', // 城主
'machine_receive_status' => $status, // 1:可以挖矿;2:挖矿进行中;3:待领取;4:已领取
'me_de' => "{$span[0]}{$span[1]}", //
'is_unread' => $st > 0 ? true : false,
'mac' => $user->mac, // 设备信息
],
'code' => 1,
],200);
}
/**
* Log the user out (Invalidate the token).
*
* @return \Illuminate\Http\JsonResponse
*/
public function logout()
{
auth('api')->logout();
return $this->apiResponseSuccess(null, '成功');
}
/**
* Refresh a token.
* 刷新token,如果开启黑名单,以前的token便会失效。
* 值得注意的是用上面的getToken(登录)再获取一次Token并不算做刷新,两次获得的Token是并行的,即两个都可用。
* @return \Illuminate\Http\JsonResponse
*/
public function refresh()
{
$user = auth('api')->user();
return $this->respondWithToken(auth('api')->refresh(), $user->id);
}
/**
* Get the token array structure.
*
* @param $token
* @param null $mId
* @return \Illuminate\Http\JsonResponse
*/
protected function respondWithToken($token, $mId = null, $new_token = null)
{
return $this->apiResponseSuccess(
[
'access_token' => $token,
'token_type' => 'bearer',
'expires_in' => auth('api')->factory()->getTTL() * 60,
'm_id' => empty($mId) ? auth('api')->user()->{'id'} : $mId,
],
'token获取成功',1,200,[],0,$new_token, time()
);
}
}