Laravel API Token 验证

记录一次Authorization 异常的插曲:

api.php有如下配置:

Route::middleware(‘auth:api‘)->post(‘/userfollowOrUnFollowCelebrity‘, ‘[email protected]‘);

FollowController构造函数及对应方法如下:

public function __construct()
{
  $this->middleware(‘auth‘)->except([‘getFollowersData‘, ‘followOrUnFollowCelebrity‘, ‘getUserFollowedUsers‘]);
  $this->middleware(‘auth:api‘)->only([‘getFollowersData‘, ‘followOrUnFollowCelebrity‘, ‘getUserFollowedUsers‘]);
}

public function followOrUnFollowCelebrity(Request $request)
    {
        $celebrity_id = $request->get(‘celebrity‘);
        if (is_null($celebrity_id)) {
            return response()->json(json_encode([‘no available celebrity id‘]));
        }

        $celebrity = User::query()->where(‘id‘, $celebrity_id)->firstOrFail();
        if (Auth::guard(‘api‘)->check()) {

        } else {

        }

auth.php中guards如下:

‘guards‘ => [
    ‘web‘ => [
        ‘driver‘ => ‘session‘,
        ‘provider‘ => ‘users‘,
    ],

    ‘api‘ => [
        ‘driver‘ => ‘token‘,
        ‘provider‘ => ‘users‘,
      ‘hash‘ => true,
    ],
],

数据库中用户已经有api_token 但是死活验证不成功一直报 message: "Unauthenticated."

查了资料看到:

https://laravel.com/docs/5.8/api-authentication

https://rickkuilman.nl/blog/hashing-api-tokens-for-improved-security/

后 发现 原来用户表里我设置的api_token时 直接设置 忘记了hash存入;

那么

’hash’=>false

就可以了。

更安全的参照下面:

In order to make the login function working again, we have to run the hash function once on all the users. This can be done quickly by running the following command in php artisan tinker:

 use App\User;
User::all()->each(function ($user) {
    $user->update([‘api_token‘ => hash(‘sha256‘, $user->api_token)]);
 });

有时候不起左右:

执行:

php artisan config:clear

From now on the user‘s API token is safely stored away in the database.

https://learnku.com/docs/laravel/6.x/api-authentication/5429

注意如果使用hash的api_token,那么就不要在RegisterController中生成API token,而应该在登录或者刷新页面的同时,请求生成一个新的Api Token,生成后,网站数据库中存储一个副本然后返回token文本值给前端视图,阅后即焚,在该页面的post 或者ajax请求的时候上传比对,下次页面刷新或者登录的时候,又下一次生成一次性的Api Token存入数据库并返回一个json 给前端。

比如ApiTokenController:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ApiTokenController extends Controller
{
    //
    public function update(Request $request)
    {

        $token = str_random(80);

        auth()->user()->forceFill([
            ‘api_token‘ => hash(‘sha256‘, $token),
        ])->save();

        return [‘token‘ => $token];
    }
}

注意这个也是生成一个hash结果然后存入数据库,前端收到的也是这个,然后如果api中

‘api‘ => [
‘driver‘ => ‘token‘,
‘provider‘ => ‘users‘,
‘hash‘ => true,
], 还是’hash’=>true那么又成了数据库中的值比对前端传来的值再hash一次的比对,又会false,这个逻辑的具体实现,这里暂时不做,因为更好的是使用passport 以及 jwt。

原文地址:https://www.cnblogs.com/dzkjz/p/12635631.html

时间: 2024-11-10 14:02:28

Laravel API Token 验证的相关文章

asp.net core web api token验证和RestSharp访问

对与asp.net core web api验证,多种方式,本例子的方式采用的是李争的<微软开源跨平台移动开发实践>中的token验证方式. Asp.net core web api项目代码: 首先定义三个Token相关的类,一个Token实体类,一个TokenProvider类,一个TokenProviderOptions类 代码如下: /// <summary> /// Token实体 /// </summary> public class TokenEntity

web api token验证理解

最近一直在学习web api authentication,以Jwt为例,可以这样理解,token是身份证,用户名和密码是户口本,身份证是有有效期的(jwt 有过期时间),且携带方便(自己带有所有信息 self contained),户口本不会过期(用户名和密码什么时候都有用),携带不方便(用户名和密码从数据库验证),jwt同样也有身份证的缺点,丢了别人有些地方可以用,户口本改名字了,身份证还可以用(同样,用户名和密码修改后jwt不修改).针对身份证的缺点,可以设置较短过期时间,另外token

redis jwt spring boot spring security 实现api token 验证

文章地址:http://www.haha174.top/article/details/258083 项目源码:https://github.com/haha174/jwt-token.git 具体的实际效果可以看考这里 目前已经部署一个 个人测试机器上面: http://cloud.codeguoj.cn/api-cloud-server/swagger-ui.html#!/token45controller/loginUsingPOST 相信很多人都调用过api, 一般的大致基本步骤都是先用

基于.Net Framework 4.0 Web API开发(4):ASP.NET Web APIs 基于令牌TOKEN验证的实现

概述:  ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.但是在使用API的时候总会遇到跨域请求的问题, 特别各种APP万花齐放的今天,对API使用者身份角色验证是不能避免的(完全开发的API不需要对使用者身份角色进行管控,可以绕过),这篇文章就来谈谈基于令牌TOKEN身份验证的实现. 问题: 对于Web API的选择性的开放,使用者无论使用AJAX,还是HttpClient对接,总要对使用者的身份角色

Django学习之Rest Framework 的Token验证功能优化详解

本文和大家分享的主要是django 中Rest Framework的Token相关内容,一起来看看吧,希望对大家 学习django有所帮助. api 的通信采用 token + ssl ,简化和方便线上脚本的调用. Django 版本 1.8.16 ,djangorestframework 版本 3.5.3 ,用了框架提供的 rest_framework.authtoken.views.obtain_auth_token 和rest_framework.authentication.TokenA

.net 微信Token验证

首次接受这个项目,看了微信的API,云里雾里,经过几经测试,理清思路 开发者自个申请,微信API给出四个参数: 下面我解释下 signature 是微信加密签名 即:微信服务器将 timetamp nonce  token(你提交的)使用SHA1加密后 会使用GET方式发送给你. timestamp是腾讯服务器发送的一个时间戳 nonce是腾讯服务器发送的一个随机数 成功申请的关键是在下面,上面的几个参数只是 微信提供 用户请求--->你自己的网站 的一个验证方式. echostr就是 腾讯服务

springmvc跨域+token验证

  1)app后台跨域设置      2)拦截器中设置http报文header中token      3)token的生成实现 ==================================================================================================== 1,app后台跨域的设置 1.1   springmvc4 有直接在请求映射中对跨域的处理,只需加一个@CrossOrign() @CrossOrigin(origins

webapi中使用token验证(JWT验证)

本文介绍如何在webapi中使用JWT验证 准备 安装JWT安装包 System.IdentityModel.Tokens.Jwt 你的前端api登录请求的方法,参考 axios.get("api/token?username=cuong&password=1").then(function (res) { // 返回一个token /* token示例如下 "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZ

基于gin框架和jwt-go中间件实现小程序用户登陆和token验证

本文核心内容是利用jwt-go中间件来开发golang webapi用户登陆模块的token下发和验证,小程序登陆功能只是一个切入点,这套逻辑同样适用于其他客户端的登陆处理. 小程序登陆逻辑 小程序的登陆逻辑在其他博主的文章中已经总结得非常详尽,比如我参考的是这篇博文:微信小程序登录逻辑整理,所以在这里不再赘述,只是大致归纳一下我的实现流程: 在小程序端调用wx.login方法,异步获得到微信下发的 jscode ,然后将 jscode 发送到 golang 服务端(如果需要详细用户信息,见参考