webapi生成token传 密码 - CSDN
精华内容
参与话题
  • webapi token、参数签名是如何生成

    万次阅读 2019-08-09 14:43:43
    API接口保障安全性原则:1.有调用者身份2.请求的唯一性3.请求的参数不能被篡改4.请求的有效时间 在刚接触接口开发时,可能脑子里压根就没有这个接口调用安全性的原则,但常识性的经验告诉我们,每一个请求都应该...

     

    API接口保障安全性原则:1.有调用者身份2.请求的唯一性3.请求的参数不能被篡改4.请求的有效时间

     

    在刚接触接口开发时,可能脑子里压根就没有这个接口调用安全性的原则,但常识性的经验告诉我们,每一个请求都应该有原则地保障安全性。

    例如这个接口  http://127.0.0.1/api/user/list?type=value 这个获取用户列表信息的请求总不能在地址栏一输入就直接显示信息(虽然有点夸张,不至于阿猫阿狗的信息这么容易get吧),在写webapi接口原则性的基本要求必须得保证数据的安全性和请求的有效性

    在这里我就使用Token+参数签名+时间戳  这三个系统参数来办证请求的有效性(即时100%请求有效,也不能说100%也安全了)。

     

    参数名 必选 类型 作用
    token string 调用方标识,保障其身份是来自本系统认证过的,有效识别用户身份
    sign 否    string 接口参数的key,value的记录,防止参数值被篡改,防止伪装请求
    timestamp f否 int 时间戳,防止重放攻击

     

    那么问题来

     

    1.token 如何生成?作用是什么?

    2.参数签名如何生成?作用是什么?

    3.时间戳的作用是什么?

    看了这篇文章你就知道了。这三个系统参数是如何保证请求的有效性,一定程度上提高数据的安全性

    1.token如何生成的?作用是什么?

    token生成:一般的api基本上主要分为两种客户端访问api的token和需要用户登录之后的token,这里我就来说一下后者,(简单通俗做法)用户登录输入用户名、密码,访问api,验证数据库成功。这个时候可以产生token,失败直接返回。问题又来了!

    1.token生成的方式是什么?2.token存在哪里?3.token如何验证是否正确

    在验证数据成功之后可以获取唯一用户标识(用户名也行),就以username:zhanglin为例吧,对这个标识进行加密(des,MD5、其他的也行,关键数据必须得加密),这个加密之后的字符串就可以做为一个Token了。

    2.token每次请求都需要进行传递,推荐存在cookie,也可以持久化到客户端。现在有这样一个api接口http://127.0.0.1/api/user/list?token=encryptUsernameStr

    这个encryptZhanglinStr就是登录成功后加密的username返回的给客户端,客户端用什么保存这里就不多介绍了,只需要知道返回给客户端一个用户访问的Token类即可,到了服务器端方法验证的时候再进行解密,获取到字符串zhanglin,然后将这个zhanglin与系统用户(可采用缓存数据库、缓存token的值)对比,如果对比存在,则说明有权限去访问api,反之非法的请求。

    还是代码来实现一下吧。代码比较容易理解,就是为了把这个原理说清楚一点

            [Route("login")]
            public bool login(string account, string pwd)
            {
                var obj = Db.dbUsers.FirstOrDefault(f => f.Account == account && f.Pwd == pwd);
                if (obj != null)
                {
                    string token = account.DESEncrypt(desKey);//加密产生token,
                    HttpCookie cookie = new HttpCookie(cookieToken,token);
                    HttpContext.Current.Response.Cookies.Add(cookie);//保存cookie
                    return true;
                }
                else
                {
                    return false;
                }
            }

    token的产生就是登陆之后根据用户标识保存在cookie里,这样在客户端每次发送请求的时候都会带上token这个参数,如下:

            [Route("list"), HttpGet]
            public List<string> List(string  type,string token)
            {
                var obj = Db.dbUsers.FirstOrDefault(p => p.Account == token.DESDecrypt(desKey));
                //验证token
                if (obj != null)
                {
                    //返回数据集
                }
                else
                {
                    //非法请求
                }
            }

     

    3.这样就可以验证token是否正确,一般都是用缓存。

    Token的作用的就是判断请求是否是系统用户发出的,这样能有效识别请求用户的身份信息

    2..参数签名如何生成?作用是什么?

    参数签名sign:为了提高传参过程中,防止参数被恶意修改,在请求接口的时候加上sign可以有效防止参数被篡改,那么sign是如何起作用的呢?

    看看它的生成方法就明白了

     

    比如有这样一个接口http:127.0.0.1/api/product?&type=zl&p1=value1&p2=value2&p3=&sign=signValue

    第一步:拼接参数字符串,除去sign参数本身和为空值的p3,那么剩下的就是字符串type=zl&p1=value1&p2=value2,然后按参数名字符升(降)序,得到字符串

    p1=value1&p2=value2&type=zl

    第二步:然后做参数名和值的拼接,得到字符串p1value1p2value2type=zl,注意编码,不能出现这种&quot; ,要转码后“后拼接

    第三步:将字符串进行DES加密,假设p1value1p2value2type=zl进行des加密后的结果是abc123,最终得到的字符串abc123就是参数sign的值signValue

    第四步:在接口中我们会接收到参数名sign的参数值abc123,然后解密得到字符串p1value1p2value2type=zl,再与接口中参数拼接排序后进行比较,如果不一样则说明参数的循序不一样,参数的值就一定是被修改过了。

    总结:

    1.接口的调用方和接口的提供方统一约定参数加密算法

    2.参数签名就是对参数key ,value的一个记录。参数如果被修改肯定对不上参数签名,就不会调用请求

     

    3.时间戳的作用?

    在api请求的接口,客户端请求的发生时间便是时间戳,这个参数到了服务器,与服务器端时间对比,如果时间间隔较长则无效。

    在asp.net mvc的开发webapi接口时,可以使用mvc的过滤器进行以上三个关键参数的拦截过滤。以下代码是在.net core中实现的,方法还是一样的,都是在进入方法前进行拦截,这是一个登录的api。

    返回api结果是一个类ApiResult.cs,序列化成json对象,该类包含两个泛型方法请求成功的Ok方法,请求失败的Error方法

    public class MyFilterAttribute : Microsoft.AspNetCore.Mvc.Filters.ActionFilterAttribute
        {
            public override void OnActionExecuting(ActionExecutingContext context)
            {
                var request_param = context.ActionArguments.Values;
                var  queryCollection = context.HttpContext.Request.Query;
                string account = string.Empty;
                string password = string.Empty;
                long timespan = 0;
                string signature = string.Empty;
                try
                {
                    account = queryCollection.Where(p => p.Key == "account").Select(f => f.Value).FirstOrDefault().ToString();
                    password = queryCollection.Where(p => p.Key == "password").Select(f => f.Value).FirstOrDefault().ToString();
                    timespan = long.Parse(queryCollection.Where(p => p.Key == "timespan").Select(f => f.Value).FirstOrDefault().ToString());
                    signature = queryCollection.Where(p => p.Key == "signature").Select(f => f.Value).FirstOrDefault().ToString();
                }
                catch (Exception ex)
                {
                    var apiresult = ApiResult<bool>.Error("参数异常"+ex.ToString());
                    context.Result = new JsonResult(apiresult);
                }
                //var accountName = context.RouteData.Values["accountName"].ToString()
                var expires_minute = (timespan - DateTime.Now.Ticks) / 60000000000;
                if (expires_minute> 10||expires_minute<-10)
                {
                    var apimodel = ApiResult<bool>.Error("请求超时"+expires_minute);
                    //var json = JsonConvert.SerializeObject(apimodel);
                    JsonResult ret = new JsonResult(apimodel);
                    context.Result =ret;
                }
                var ok = ("account" + account + "password" + password).Contains(signature);//ToDO 加密解密
                if (ok == false)
                {
                    var apimodel = ApiResult<bool>.Error("非法请求");
                    var json = JsonConvert.SerializeObject(apimodel);
                    JsonResult ret = new JsonResult(apimodel);
                    context.Result = ret;
                }
                base.OnActionExecuting(context);
            }
    
        }


    作者:张林
    原文标题: webapi token、参数签名是如何生成的
    原文链接:http://blog.csdn.net/kebi007/article/details/72861532
    转载随意注明出处

     有兴趣的可以关注一下我的微信公众号[dotNet全栈开发],分享一些编程相关的经典文章

     

    展开全文
  • ASP.NET WebApi 实现Token验证

    万次阅读 2018-11-27 14:20:41
    基于令牌的认证  我们知道WEB网站的身份验证一般通过session或者cookie完成的,登录成功后客户端发送的任何请求都带上cookie... WEB API使用这样的方法不是很适合,于是就有了基于令牌的认证,使用令牌认证有几...

    转自:https://www.cnblogs.com/dukang1991/p/5627584.html

    基于令牌的认证

        我们知道WEB网站的身份验证一般通过session或者cookie完成的,登录成功后客户端发送的任何请求都带上cookie,服务端根据客户端发送来的cookie来识别用户。

        WEB API使用这样的方法不是很适合,于是就有了基于令牌的认证,使用令牌认证有几个好处:可扩展性、松散耦合、移动终端调用比较简单等等,别人都用上了,你还有理由不用吗?

        下面我们花个20分钟的时间来实现一个简单的WEB API token认证:

    Step 1:安装所需的NuGet包:

    打开NuGet包管理器控制台,然后输入如下指令:

    Install-Package Microsoft.AspNet.WebApi.Owin -Version 5.1.2
    Install-Package Microsoft.Owin.Host.SystemWeb -Version 2.1.0
    Install-Package Microsoft.AspNet.Identity.Owin -Version 2.0.1
    Install-Package Microsoft.Owin.Cors -Version 2.1.0

    Step 2 在项目根目录下添加Owin“Startup”类

    using System;
    using System.Web.Http;
    
    using Owin;
    using Microsoft.Owin;
    using Microsoft.Owin.Security.OAuth;
    using SqlSugar.WebApi;
    
    [assembly: OwinStartup(typeof(WebApi.Startup))]
    namespace WebApi
    {
        public class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                HttpConfiguration config = new HttpConfiguration();
                ConfigureOAuth(app);
    
                WebApiConfig.Register(config);
                app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
                app.UseWebApi(config);
            }
    
            public void ConfigureOAuth(IAppBuilder app)
            {
                OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
                {
                    AllowInsecureHttp = true,
                    TokenEndpointPath = new PathString("/token"),
                    AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
                    Provider = new SimpleAuthorizationServerProvider()
                };
                app.UseOAuthAuthorizationServer(OAuthServerOptions);
                app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
            }
        }
    }

    Step 3:在项目根目录下添加验证类 SimpleAuthorizationServerProvider,为了简单用户的验证部分我们省略掉;

    using System.Threading.Tasks;
    using System.Security.Claims;
    using Microsoft.Owin.Security.OAuth;
    
    namespace WebApi
    {
        /// <summary>
        /// Token验证
        /// </summary>
        public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
        {
            public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
            {
                await Task.Factory.StartNew(() => context.Validated());
            }
    
            public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
            {
                await Task.Factory.StartNew(() => context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" }));
                /*
                 * 对用户名、密码进行数据校验
                using (AuthRepository _repo = new AuthRepository())
                {
                    IdentityUser user = await _repo.FindUser(context.UserName, context.Password);
    
                    if (user == null)
                    {
                        context.SetError("invalid_grant", "The user name or password is incorrect.");
                        return;
                    }
                }*/
    
                var identity = new ClaimsIdentity(context.Options.AuthenticationType);
                identity.AddClaim(new Claim("sub", context.UserName));
                identity.AddClaim(new Claim("role", "user"));
                identity.AddClaim(new Claim(ClaimTypes.Name, user.UserName));
    
                context.Validated(identity);
    
            }
        }
    }

    Step 4:让CORS起作用

    在ASP.NET Web API中启用OAuth的Access Token验证非常简单,只需在相应的Controller或Action加上[Authorize]标记

            [Authorize]
            public ActionResult Index()
            {
                ViewBag.Title = "Home Page";
    
                return View();
            }

    Step 5 : 请求 Token

    获取token, POST   http://localhost:23477/token

    参数BODY x-www-form-urlencoded 格式:

    grant_type=password&username=admin&password=123456

    返回状态200 结果为

    Step 5 调用api

    只要在http请求头中加上Authorization:bearer Token就可以成功访问API就成功了:

    GET   http://localhost:58192/api/testapi/testapi

    Authorization : bearer 

    T5jF97t5n-rBkWcwpiVDAlhzXtOvV7Jw2NnN1Aldc--xtDrvWtqLAN9hxJN3Fy7piIqNWeLMNm2IKVOqmmC0X5_s8MwQ6zufUDbvF4Bg5OHoHTKHX6NmZGNrU4mjpCuPLtSbT5bh_gFOZHoIXXIKmqD3Wu1MyyKKNhj9XPEIkd9bl4E9AZ1wAt4dyUxmPVA_VKuN7UvYJ97TkO04XyGqmXGtfVWKfM75mNVYNhySWTg

     

      结果为:

     

    展开全文
  • 1 概述 在存在账号体系的信息系统中,对... 随着移动互联网时代到来,客户端的类型越来越多, 逐渐出现了 一个服务器,N个客户端的格局 。 不同的客户端产生了不同的用户使用场景,这些场景: ...本文将使用一定
     
    

    1   概述

    在存在账号体系的信息系统中,对身份的鉴定是非常重要的事情。

    随着移动互联网时代到来,客户端的类型越来越多, 逐渐出现了 一个服务器,N个客户端的格局 。

    不同的客户端产生了不同的用户使用场景,这些场景:

    1. 有不同的环境安全威胁
    2. 不同的会话生存周期
    3. 不同的用户权限控制体系
    4. 不同级别的接口调用方式

    综上所述,它们的身份认证方式也存在一定的区别。

    本文将使用一定的篇幅对这些场景进行一些分析和梳理工作。

    2   使用场景

    下面是一些在IT服务常见的一些使用场景:

    1. 用户在web浏览器端登录系统,使用系统服务
    2. 用户在手机端(Android/iOS)登录系统,使用系统服务
    3. 用户使用开放接口登录系统,调用系统服务
    4. 用户在PC处理登录状态时通过手机扫码授权手机登录(使用得比较少)
    5. 用户在手机处理登录状态进通过手机扫码授权PC进行登录(比较常见)

    通过对场景的细分,得到如下不同的认证token类别:

    1. 原始账号密码类别
      • 用户名和密码
      • API应用ID/KEY
    2. 会话ID类别
      • 浏览器端token
      • 移动端token
      • API应用token
    3. 接口调用类别
      • 接口访问token
    4. 身份授权类别
      • PC和移动端相互授权的token

    3   token的类别

    不同场景的token进行如下几个维度的对比:

    天然属性 对比:

    1. 使用成本

      本认证方式在使用的时候,造成的不便性。比如:

      • 账号密码需要用户打开页面然后逐个键入
      • 二维码需要用户掏出手机进行扫码操作
    2. 变化成本

      本认证方式,token发生变化时,用户需要做出的相应更改的成本:

      • 用户名和密码发生变化时,用户需要额外记忆和重新键入新密码
      • API应用ID/KEY发生变化时,第三方应用需要重新在代码中修改并部署
      • 授权二维码发生变化时,需要用户重新打开手机应用进行扫码
    3. 环境风险

      • 被偷窥的风险
      • 被抓包的风险
      • 被伪造的风险

    可调控属性 对比:

    1. 使用频率
      • 在网路中传送的频率
    2. 有效时间
      • 此token从创建到终结的生存时间

    最终的目标:安全和影响。

    安全和隐私性主要体现在:

    • token 不容易被窃取和盗用(通过对传送频率控制)
    • token 即使被窃取,产生的影响也是可控的(通过对有效时间控制)

    关于隐私及隐私破坏后的后果,有如下的基本结论:

    1. 曝光频率高的容易被截获
    2. 生存周期长的在被截获后产生的影响更严重和深远

    遵守如下原则:

    1. 变化成本高的token不要轻易变化
    2. 不轻易变化的token要减少曝光频率(网络传输次数)
    3. 曝光频率高的token的生存周期要尽量短

    将各类token的固有特点及可控属性进行调控后, 对每个指标进行量化评分(1~5分),我们可以得到如下的对比表:


    备注:

    • user_name/passwd 和 app_id/app_key 是等价的效果

    4   token的层级关系

    参考上一节的对比表,可以很容易对这些不同用途的token进行分层,主要可以分为4层:

    1. 密码层

      最传统的用户和系统之间约定的数字身份认证方式

    2. 会话层

      用户登录后的会话生命周期的会话认证

    3. 调用层

      用户在会话期间对应用程序接口的调用认证

    4. 应用层

      用户获取了接口访问调用权限后的一些场景或者身份认证应用

    token的分层图如下:

    在一个多客户端的信息系统里面,这些token的产生及应用的内在联系如下:

    1. 用户输入用户名和用户口令进行一次性认证
    2. 在 不同 的终端里面生成拥有 不同 生命周期的会话token
    3. 客户端会话token从服务端交换生命周期短但曝光 频繁 的接口访问token
    4. 会话token可以生成和刷新延长 access_token 的生存时间
    5. access_token可以生成生存周期最短的用于授权的二维码的token

    使用如上的架构有如下的好处:

    1. 良好的统一性。可以解决不同平台上认证token的生存周期的 归一化 问题
    2. 良好的解耦性。核心接口调用服务器的认证 access_token 可以完成独立的实现和部署
    3. 良好的层次性。不同平台的可以有完全不同的用户权限控制系统,这个控制可以在 会话层 中各平台解决掉

    4.1   账号密码

    广义的 账号/密码 有如下的呈现方式:

    1. 传统的注册用户名和密码
    2. 应用程序的app_id/app_key

    它们的特点如下:

    1. 会有特别的意义

      比如:用户自己为了方便记忆,会设置有一定含义的账号和密码。

    2. 不常修改

      账号密码对用户有特别含义,一般没有特殊情况不会愿意修改。 而app_id/app_key则会写在应用程序中,修改会意味着重新发布上线的成本

    3. 一旦泄露影响深远

      正因为不常修改,只要泄露了基本相当于用户的网络身份被泄露,而且只要没被察觉这种身份盗用就会一直存在

    所以在认证系统中应该尽量减少传输的机会,避免泄露。

    4.2   客户端会话token

    功能:充当着session的角色,不同的客户端有不同的生命周期。

    使用步骤:

    1. 用户使用账号密码,换取会话token

    不同的平台的token有不同的特点。

    Web平台生存周期短

    主要原因:

    1. 环境安全性

      由于web登录环境一般很可能是公共环境,被他人盗取的风险值较大

    2. 输入便捷性

      在PC上使用键盘输入会比较便捷

    移动端生存周期长

    主要原因:

    1. 环境安全性

      移动端平台是个人用户极其私密的平台,它人接触的机会不大

    2. 输入便捷性

      在移动端上使用手指在小屏幕上触摸输入体验差,输入成本高

    4.3   access_token

    功能:服务端应用程序api接口访问和调用的凭证。

    使用步骤:

    1. 使用具有较长生命周期的会话token来换取此接口访问token。

    其曝光频率直接和接口调用频率有关,属于高频使用的凭证。 为了照顾到隐私性,尽量减少其生命周期,即使被截取了,也不至于产生严重的后果。

    注意:在客户端token之下还加上一个access_token, 主要是为了让具有不同生命周期的客户端token最后在调用api的时候, 能够具有统一的认证方式。

    4.4   pam_token

    功能:由已经登录和认证的PC端生成的二维码的原始串号(Pc Auth Mobile)。

    主要步骤如下:

    1. PC上用户已经完成认证,登录了系统
    2. PC端生成一组和此用户相关联的pam_token
    3. PC端将此pam_token的使用链接生成二维码
    4. 移动端扫码后,请求服务器,并和用户信息关联
    5. 移动端获取refresh_token(长时效的会话)
    6. 根据 refresh_token 获取 access_token
    7. 完成正常的接口调用工作

    备注:

    • 生存周期为2分钟,2分钟后过期删除
    • 没有被使用时,每1分钟变一次
    • 被使用后,立刻删除掉
    • 此种认证模式一般不会被使用到

    4.5   map_token

    功能:由已经登录的移动app来扫码认证PC端系统,并完成PC端系统的登录(Mobile Auth Pc)。

    主要步骤:

    1. 移动端完成用户身份的认证登录app
    2. 未登录的PC生成匿名的 map_token
    3. 移动端扫码后在db中生成 map_token 和用户关联(完成签名)
    4. db同时针对此用户生成 web_token
    5. PC端一直以 map_token 为参数查找此命名用户的 web_token
    6. PC端根据 web_token 去获取 access_token
    7. 后续正常的调用接口调用工作

    备注:

    • 生存周期为2分钟,2分钟后过期删除
    • 没有被使用时,每1分钟变一次
    • 被使用后,立刻删除掉

    5   小结与展望

    本文所设计的基于token的身份认证系统,主要解决了如下的问题:

    1. token的分类问题
    2. token的隐私性参数设置问题
    3. token的使用场景问题
    4. 不同生命周期的token分层转化关系

    本文中提到的设计方法,在 应用层 中可以适用于且不限于如下场景中:

      1. 用户登录
      2. 有时效的优惠券发放
      3. 有时效的邀请码发放
      4. 有时效的二维码授权
      5. 具有时效 手机/邮件 验证码
      6. 多个不同平台调用同一套API接口
      7. 多个平台使用同一个身份认证中心
    展开全文
  • webapi鉴权使用token令牌

    千次阅读 2018-07-08 22:51:14
    一为什么使用Token验证:在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认 证,那么这就需要用户提供一些信息,比如...

    一为什么使用Token验证:

    在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认
    证,那么这就需要用户提供一些信息,比如用户名密码等,但是为了安全起见让用户暴露的明文密码次数越少越好,我们一般在web项目中,大多数采用保
    存的session中,然后在存一份到cookie中,来保持用户的会话有效性,但是会在客户端关闭时丢失,还有过期问题。但是app更像一个离线客户端, 因为
    它的用户数据保存在本地,可以实现免登陆等,只在它拿数据的时候 提交认证信息就行了 。

    二什么场景使用Token验证:

    现在很多基于restful的api接口都有个登录的设计,也就是在发起正式的请求之前先通过一个登录的请求接口,申请一个叫做token的东西。申请成功后,后面其他的请求都要带上这个token,服务端通过这个token验证请求的合法性。这个token通常都有一个有效期,一般就是几个小时。


    三Token验证有什么特点
    1.无状态、可扩展
    2.支持移动设备
    3.跨程序调用

    4.安全


    四Token验证的原理
    基于Token的身份验证是无状态的,我们不将用户信息存在服务器或Session中。用户登录后向服务器提供用户认证信息(如账户和密码),服务器认证完后给客户端返回一个Token令牌,用户再次获取信息时,带上此令牌,如果令牌正取,则返回数据。对于获取Token信息后,访问用户相关接口,客户端请求的url需要带上如下参数:
       时间戳:timestamp
       Token令牌:token

    然后将所有用户请求的参数按照字母排序(包括timestamp,token),然后更具MD5加密(可以加点盐),全部大写,生成sign签名,这就是所说的url签名算法。然后登陆后每次调用用户信息时,带上sign,timestamp,token参数。


    五Token如何生成

    token实例

    /**
     * Token 的 Model 类,可以增加字段提高安全性,例如时间戳、url 签名
     * @author ScienJus
     * @date 2015/7/31.
     */
    public class TokenModel {
    
        // 用户 id
        private long userId;
    
        // 随机生成的 uuid
        private String token;
    
        public TokenModel (long userId, String token) {
            this.userId = userId;
            this.token = token;
        }
    
        public long getUserId () {
            return userId;
        }
    
        public void setUserId (long userId) {
            this.userId = userId;
        }
    
        public String getToken () {
            return token;
        }
    
        public void setToken (String token) {
            this.token = token;
        }
    }


    /**
     * 对 token 进行操作的接口
     * @author ScienJus
     * @date 2015/7/31.
     */
    public interface TokenManager {
    
        /**
         * 创建一个 token 关联上指定用户
         * @param userId 指定用户的 id
         * @return 生成的 token
         */
        public TokenModel createToken (long userId);
    
        /**
         * 检查 token 是否有效
         * @param model token
         * @return 是否有效
         */
        public boolean checkToken (TokenModel model);
    
        /**
         * 从字符串中解析 token
         * @param authentication 加密后的字符串
         * @return
         */
        public TokenModel getToken (String authentication);
    
        /**
         * 清除 token
         * @param userId 登录用户的 id
         */
        public void deleteToken (long userId);
    
    }
    
    /**
     * 通过 Redis 存储和验证 token 的实现类
     * @author ScienJus
     * @date 2015/7/31.
     */
    @Component
    public class RedisTokenManager implements TokenManager {
    
        private RedisTemplate redis;
    
        @Autowired
        public void setRedis (RedisTemplate redis) {
            this.redis = redis;
            // 泛型设置成 Long 后必须更改对应的序列化方案
            redis.setKeySerializer (new JdkSerializationRedisSerializer ());
        }
    
        public TokenModel createToken (long userId) {
            // 使用 uuid 作为源 token
            String token = UUID.randomUUID ().toString ().replace ("-", "");
            TokenModel model = new TokenModel (userId, token);
            // 存储到 redis 并设置过期时间
            redis.boundValueOps (userId).set (token, Constants.TOKEN_EXPIRES_HOUR, TimeUnit.HOURS);
            return model;
        }
    
        public TokenModel getToken (String authentication) {
            if (authentication == null || authentication.length () == 0) {
                return null;
            }
            String [] param = authentication.split ("_");
            if (param.length != 2) {
                return null;
            }
            // 使用 userId 和源 token 简单拼接成的 token,可以增加加密措施
            long userId = Long.parseLong (param [0]);
            String token = param [1];
            return new TokenModel (userId, token);
        }
    
        public boolean checkToken (TokenModel model) {
            if (model == null) {
                return false;
            }
            String token = redis.boundValueOps (model.getUserId ()).get ();
            if (token == null || !token.equals (model.getToken ())) {
                return false;
            }
            // 如果验证成功,说明此用户进行了一次有效操作,延长 token 的过期时间
            redis.boundValueOps (model.getUserId ()).expire (Constants.TOKEN_EXPIRES_HOUR, TimeUnit.HOURS);
            return true;
        }
    
        public void deleteToken (long userId) {
            redis.delete (userId);
        }
    }



    展开全文
  • 我是小白,今天写这篇文章主要是给新手学习看的,大佬就...在web项目中,实现认证比较轻松,那么前后端分离的项目中,我们要怎么实现认证,今天这篇文章就以 API token 认证机制,使用Token可以解决laravel API的无状态
  • 前后端分离调用api接口加密方式

    万次阅读 2018-07-13 18:08:28
    服务端配置一对RSA密钥对,公钥pubkey_server,私钥prikey_server,并将pubkey_server写到web端js中2.web端打开登录页,生成一对RSA密钥对,公钥pubkey_client,私钥prikey_client3.登陆操作: a.web端用pubkey_server加密...
  • App开放接口api安全性—Token签名sign的设计与实现

    万次阅读 多人点赞 2015-09-28 14:56:55
    在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证,那么这就需要用户提供一些信息,比如用户名密码等,但是为了安全...
  • RESTful API使用JWT做无状态的身份认证

    千次阅读 2020-06-29 18:36:38
    JWT设计RESTful架构的前后端,天然要求API是无状态的,JWT(JSON Web Token)简单易用,适合在分布式系统中做API无状态的身份认证。jwt由Header、Payload、Signature三部分组成,使用 . 分割开,一个JWT形式:Header....
  • WebApi_基于Token的身份验证——JWT(z)

    千次阅读 2017-08-03 22:22:52
    基于Token的身份验证——JWT JWT是啥? JWT就是一个字符串,经过加密处理与校验处理的字符串,形式为: A.B.C A由JWT头部信息header加密得到B由JWT用到的身份验证信息json数据加密得到C...
  • JWT token心得与使用实例

    万次阅读 多人点赞 2017-06-20 11:47:44
    token串的生成流程。 token在客户端与服务器端的交互流程 Token的优点和思考 参考代码:核心代码使用参考,不是全部代码JWT token的组成头部(Header),格式如下: { “typ”: “JWT”, “alg”: “HS256” ...
  • 这个是自动生成网页,我们就可以摆脱excel。 一.首先是使用node安装apiDoc npm install apidoc -g 二.在需要生成接口的添加注释 /** * @api {post} /v1/login 用户登录 * @apiDescription 用户登录 * @...
  • 前后端分离:WebAPI+Vue开发——远程数据请求axios 前后端分离:WebAPI+Vue开发——跨域设置 前后端分离:WebAPI+Vue开发——身份认证 存储用户身份可以用Cache内存或者Redis,本文实现用的是Redis。 1、在登录...
  • token

    千次阅读 2018-07-03 14:59:52
    为什么要使用token? 因为HTTP协议是开放的,可以任人调用。所以,如果接口不希望被随意调用,就需要做访问权限的控制,认证是好的用户,才允许调用API。 目前主流的访问权限控制/认证模式 Bearer Token...
  • .Net WebAPI JWT身份验证

    万次阅读 2018-11-07 17:32:11
    一、开发环境 ...1、使用VS2017 创建.netframework项目,选择WebApi 2、从Nuget包中搜索并安装JWT 3、在Models中创建AuthInfo.cs、LoginRequest.cs、TokenInfo.cs三个类 using System; u...
  • token验证技术的原理和简单实现

    万次阅读 2018-12-14 09:37:38
    在大多数使用Web API的互联网公司中,token是多用户下处理认证的最佳方式。  以下几点特性会让你在程序中使用基于Token的身份验证  1.无状态、可扩展  2.支持移动设备  3.跨程序调用  4.安全 那些使用基于...
  • 用 nodejs express 搭建 restful api

    万次阅读 2015-05-11 15:56:41
    最终代码地址简介搭建一个restful风格的api,数据库使用mongodb,使用 token 来认证客户端。基本流程 创建受保护和不受保护的路由。 客户端通过post用户名和密码进行验证,服务端返回一个token的json字符串。 客户端...
  • Web API数据传输加密

    万次阅读 2015-08-18 12:03:12
    1、Web API的接口访问分类 Web API接口的访问方式,大概可以分为几类: 1)一个是使用用户令牌,通过Web API接口进行数据访问。这种方式,可以有效识别用户的身份,为用户接口返回用户相关的数据,如包括用户...
  • (二)前后端分离之token验证

    千次阅读 2018-08-02 11:45:28
    简单理解:服务端生成token接口和校验token返回token给前端,前端定义拦截器每次请求携带认证token。  简略摘抄: HTTP Basic Auth HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和pa...
  • WebApi中的Session与Token间的处理对接

    千次阅读 2017-05-24 10:38:26
     session 从字面上讲,就是会话。这个就类似于你和一个人交谈,你怎么知道当前和你交谈的是张三而不是李四呢?对方肯定有某种特征(长相等)表明他就是张三。session 也是类似的道理,服务器要知道当前发请求给...
  • PHP 生成token 示例

    千次阅读 2017-07-05 13:26:48
    接口特点汇总: 1、因为是非开放性的,所以所有的接口都是封闭的,只对公司内部的产品有效; 2、因为是非开放性的,所以OAuth那套协议是行不通的,因为没有中间用户的授权过程;...第一个token是针对接口的(ap
1 2 3 4 5 ... 20
收藏数 18,127
精华内容 7,250
热门标签
关键字:

webapi生成token传 密码