精华内容
下载资源
问答
  • 之前几篇对oauth2的使用仅限于授权服务和资源服务在同一服务中,实际用的时候肯定是分开的,授权服务作为一个单独的服务,当访问资源服务器中的受保护时资源时,需要先去获取token,然后携带token去访问资源,例如...

    写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!

       之前几篇对oauth2的使用仅限于授权服务和资源服务在同一服务中,实际用的时候肯定是分开的,授权服务作为一个单独的服务,当访问资源服务器中的受保护时资源时,需要先去获取token,然后携带token去访问资源,例如:在resource-server服务(一会新建)中有一个资源,路径为http://localhost:9002/test,访问的时候怎么判断携带的token是否准确呢,不能随便带一个token就可以访问啊,那就没意义了。接下来就记录一下资源资源服务器怎么校验token的问题。

    新建一个项目resource-server,他是一个单纯的资源服务,只需要配置ResourceServerConfigurerAdapter即可,并将所有的资源都保护起来。代码如下:

    @Configuration
    @EnableResourceServer
    public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
    
        private static final String SOURCE_ID = "resource-server";
        
        @Override
        public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
            resources.resourceId(SOURCE_ID).stateless(true);
        }
        
        @Override
        public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .requestMatchers(EndpointRequest.toAnyEndpoint()).permitAll()
                .anyRequest().authenticated()
        }
    
    }

    新建测试类并添加一个测试方法:

        @RequestMapping(value = "/test")
        public String test(){
            return "user";
        }

    前面提到:使用@EnableAuthorizationServer注解后,应用启动后将自动生成几个Endpoint:
    /oauth/authorize:验证
    /oauth/token:获取token
    /oauth/confirm_access:用户授权
    /oauth/error:认证失败
    /oauth/check_token:资源服务器用来校验token
    /oauth/token_key:如果jwt模式则可以用此来从认证服务器获取公钥

    可以通过配置/oauth/check_token去授权服务器校验token,配置如下:

    security:
      oauth2:
        client:
          client-id: resource-client
          client-secret: secret
        resource:
          token-info-uri: http://localhost:9001/oauth/check_token

      好了,使用postman测试下,配置好授权信息以后使用postman获取token,然后访问resource-server中受保护的资源/test,发现可以正常访问返回user字符串。

      在第一章资源服务器配置中提到resourceId,如果存在,授权服务器会进行验证,测试一下是否真的会验证,验证过程很简单,资源服务器不用改,在授权服务数据库中添加一个和资源服务器中配置的resourceId不一样的resourceId,如resource-server1,再次访问,结果如下:

    发现不能访问了,测试发现,数据库中没有配置resource_ids或这配置的跟资源服务器中一致时,时可以访问的,配置的不一致(如上)就会拒绝访问。另外配置资源id可以在资源服务配置类中直接配置,如上面用的的private static final String SOURCE_ID = "resource-server";当然也可以在配置文件中配置,如下:在resource下配置以下id即可,用到的时候从配置文件中读取出来,

    security:
      oauth2:
        client:
          client-id: resource-client
          client-secret: secret
        resource:
          id:resource-server
          token-info-uri: http://localhost:9001/oauth/check_token

    总结一下:如果授权服务器中对应的客户端配置了resource_ids ,那么在访问资源的时候,授权服务就会验证resource_ids,不配置默认为null,配置了以后resource_ids的值与项目中配置的SOURCE_ID必须一致,项目中的SOURCE_ID一般为为项目注册到eureka的服务名。

    补充一下资源服务校验token的其它方式:

    除了通过端点/oauth/check_token去校验token外,授权服务器还可以通过暴露RemoteTokenServices接口的方式进行验证,如果其他资源服务需要验证token,则需要远程调用授权服务暴露的验证token的api接口,如在授权服务中暴露一个接口,如下:

        @GetMapping("/principal")
        public Principal user(Principal principal) {
            System.out.println(principal.getName());
            return principal;
        }

    并指定用户信息在授权服务的地址,资源服务器中的配置改为:

    security:
      oauth2:
        client:
          client-id: resource-client
          client-secret: secret
        resource:
          user-info-uri: http://localhost:9001/principal

    我们使用postman测试一下:

    如上获取token后访问资源服务的/test资源,发现可以正常访问,查看授权服务控制台发现也打印了resource-client,说明确实也调用了授权服务暴露的校验token的接口/principal,我把token改为一个错的,再访问/test资源,发现访问不了了,授权服务控制台打印了:Failed to find access token for token 1f5ac2127-b9b5-4443-9b69-e2dd526d70f7

    除了上述方式之外还有一种写法,不用在yml文件中配置校验,直接通过代码的方式调用远程接口进行校验,直接贴代码:

        @Bean
        public ResourceServerTokenServices remoteTokenServices(){
            // 使用远程服务请求授权服务器校验token
            RemoteTokenServices services = new RemoteTokenServices();
            services.setCheckTokenEndpointUrl("http://localhost:9001/oauth/check_token");
            services.setClientId("resource-client");
            services.setClientSecret("secret");
            return services;
        }
    
        @Override
        public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
            resources.resourceId(SOURCE_ID).stateless(true);
            resources.tokenServices(remoteTokenServices());
        }

     

    展开全文
  • jsp里的源码: String token = Weixin.TOKEN;...系统算出的签名和微信返回的签名是一致的,然后就一直token验证失败。求各位大神们看看哪里出了问题。 是不是我echstr原样返回的不对。该怎么返回才正确。
  • 神,请教一下。Ajax中怎么将cookie的token值发送给服务器?完成身份验证(在登录页面已完成登录,服务器返回一个token,在调用查询时,cookie的token怎么发送给服务器完成身份验证?)有代码更好
  • 你的服务器没有正确响应Token验证,请阅读消息接口使用指南。这错误我想很多微信开放平台的新手遇到,怎么解决呢? 1、检查您的php文件是否是utf-8无BOM格式 2、检查您的php文件是否有空行,比如这样就不行 $x=1 ...

    你的服务器没有正确响应Token验证,请阅读消息接口使用指南。这错误我想很多微信开放平台的新手遇到,怎么解决呢?

    1、检查您的php文件是否是utf-8无BOM格式

    2、检查您的php文件是否有空行,比如这样就不行

    <?php
    $x=1
    
    echo $x
    ?>


    
    这样也不行
    

    <?php
    $x=1
    echo $x
    ?>

    这样也不行

    <?php
    $x=1
    echo $x
    ?>
    特别是代码开始前(<?php 这个之前)空一行和代码结束后(?>这个结束之后)空一行。

    在代码体中间如果有空行可以使用函数ob_clean();解决,比如

    <?php
    ob_clean();
    $x=1
    
    echo $x
    ?>

    PS

    群名称是微信公众平台交流群
     27959149

    微信交流公众平台:YCYC0662

    二维码:


    展开全文
  • 先扫个盲,微信验证的目的就是你来证明你的服务器地址的有效性,所以带着这个目的我们来看看下面这些问题: URL地址怎么写 纯PHP的代码怎么写 Laravel的代码怎么写 常见的坑是什么 URL地址怎么
  • LAMP环境,系统与微信后台接口整合的时候报Token验证失败错误,是80端口,服务器上ping微信服务器ip地址也是通的,不知道可能是哪边会出问题,请哪位大神分析下。
  • 一、首先得知道服务器配置是什么,有什么用 ...它的验证无非是想让微信知道你的接口通不通(个人理解),那怎么做呢?请看下面java实现 /** * @Desc配置到微信后台的地址 * 这个是微信服务器配置ur...

     

    一、公众号开发信息

    这里主要是给开发者提供AppId和AppSecret这个请妥善保存,因为生成之后,无法在公众号后台查看,只能重置),

    这两个东西是与微信进行接口请求时用到的,然后ip白名单是配置你服务器的ip地址,多个ip地址之间则用逗号隔开,

    若不配置白名单,你向微信发起请求时,微信会拦截你的请求。

     

    二、服务器配置

    首先得知道服务器配置是什么,有什么用

    其实这里的配置是用于接收用户在公众号中的操作产生的事件,比如用户取关了,或者用户关注了,微信服务器会向我们

    配置的url发送请求,告诉我们当前用户的操作,对于这些操作需要开发者自行去处理

     

    三、如何让这个服务器配置生效(这里看文档时,微信只提供了php的验证方式,并没有java的。。。)

    它的验证无非是想让微信知道你的接口通不通(个人理解),那怎么做呢?请看下面java实现

    /**
     * @Desc配置到微信后台的地址
     * 这个是微信服务器配置url需验证token的接口
     * 如果你们项目有拦截器,需要把这个接口给放开
     * @Author LRH
     * @Date 2020/7/15 11:18
     */
    @RequestMapping("/callback")
    @ResponseBody
    public String config ( HttpServletRequest request ) throws Exception {
       //获取微信请求参数
       String signature = request.getParameter ("signature");
       String timestamp = request.getParameter ("timestamp");
       String nonce = request.getParameter ("nonce");
       String echostr = request.getParameter ("echostr");
       logger.info("接收微信公众号事件触发回调请求:\n signature:{}\ntimestamp:{}\nnonce:{}\nechostr:{}",signature,timestamp,nonce,echostr);
       //参数排序。 token 就要换成自己实际写的 token
       String [] params = new String [] {timestamp,nonce,"token"} ;
       Arrays.sort (params) ;
       //拼接
       String paramstr = params[0] + params[1] + params[2] ;
       logger.info("重新参数拼接,paramstr:{}",paramstr);
    
       //加密
       //获取 shal 算法封装类
       MessageDigest Sha1Dtgest = MessageDigest.getInstance("SHA-1") ;
       //进行加密
       byte [] digestResult = Sha1Dtgest.digest(paramstr.getBytes ("UTF-8"));
       //拿到加密结果
       String mysignature = WebUtils.byte2HexStr(digestResult);//这里需要将字节数组转16进制(我是用了工具类)
       logger.info("微信加密,signature:{}\n本地加密结果,mysignature:{}",signature,mysignature);
       //是否正确
       boolean signsuccess = mysignature.equals(signature);
       if (!signsuccess) {
          logger.info("验证失败,signature check fail");
          return "signature check fail" ;//不正确就直接返回失败提示.
       }
       //判断 echostr 不为空,表示这是配置时的请求。
       if ( !StringUtils.isEmpty(echostr)) {
          logger.info("验证成功,echostr:"+echostr);
          return echostr ;
          //正确,返回传入的随机字符串。
       }
       return null ;
    }
    
    //下面是二进制转16进制的方法,可以写进你们的工具类
    
    public static String byte2HexStr(byte[] b) {
        String stmp="";
        StringBuilder sb = new StringBuilder("");
        for (int n=0;n<b.length;n++) {
            stmp = Integer.toHexString(b[n] & 0xFF);
            sb.append((stmp.length()==1)? "0"+stmp : stmp);
        }
        return sb.toString().trim();
    }
    
    到此时应该可以大功告成了,把项目部署到公网上去,然后在微信公众平台配置服务器url,点击提交,你们的项目就会接收到请求,如下:

    这样微信公众号的服务器url配置就算完成了(百度了很多文章,发现没什么java的教程,有些还要收费,真是服了)
    希望能为你们填坑

     

     

     

     

     

     

    展开全文
  • 今天困扰我好长时间的问题终于得到了解决,那就是微信众众号平台配置Token一直提示token验证失败的,接下来我就说说我是怎么解决的(还能咋解决,查资料,copy别人的例子一个一个试呗) 问题 微信公众号配置token...

    今天困扰我好长时间的问题终于得到了解决,那就是微信众众号平台配置Token一直提示token验证失败的,接下来我就说说我是怎么解决的(还能咋解决,查资料,copy别人的例子一个一个试呗)

    问题

    在这里插入图片描述

    解决方法

    一定是你搞错了呗,还能咋,查看下面代码,修改自己设置的token,然后复制文件到服务器更目录即可。

    <?php
    //define your token
    define("TOKEN", "lifangping1224645904");    //一定要替换自己的token
    $wechatObj = new wechatCallbackapiTest();//将7行的class类实例化
    $wechatObj->valid();//使用-》访问类中valid方法,用来验证开发模式
    class wechatCallbackapiTest
    {
        public function valid()//验证接口的方法
        {
            $echoStr = $_GET["echostr"];//从微信用户端获取一个随机字符赋予变量echostr
     
            //valid signature , option访问地61行的checkSignature签名验证方法,如果签名一致,输出变量echostr,完整验证配置接口的操作
            if($this->checkSignature()){
                echo $echoStr;
                exit;
            }
        }
        //签名验证程序    ,checkSignature被18行调用。官方加密、校验流程:将token,timestamp,nonce这三个参数进行字典序排序,然后将这三个参数字符串拼接成一个字符串惊喜shal加密,开发者获得加密后的字符串可以与signature对比,表示该请求来源于微信。
        private function checkSignature()
        {
            $signature = $_GET["signature"];//从用户端获取签名赋予变量signature
            $timestamp = $_GET["timestamp"];//从用户端获取时间戳赋予变量timestamp
            $nonce = $_GET["nonce"];  //从用户端获取随机数赋予变量nonce
                     
            $token = TOKEN;//将常量token赋予变量token
            $tmpArr = array($token, $timestamp, $nonce);//简历数组变量tmpArr
            sort($tmpArr, SORT_STRING);//新建排序
            $tmpStr = implode( $tmpArr );//字典排序
            $tmpStr = sha1( $tmpStr );//shal加密
            //tmpStr与signature值相同,返回真,否则返回假
            if( $tmpStr == $signature ){
                return true;
            }else{
                return false;
            }
        }
    }
    

    将代码中的token替换成自己的,复制,放到网站根目录。够简单了吧,还闹不了,那我只能说:兄弟,你不合适(开个玩笑,解决不了私聊我,我跟你一起进坑)

    看看我微信上的配置

    在这里插入图片描述

    结论

    其实按这个步骤操作起来还是挺简单的,我是没找到微信的文档,找的一个小伙子的资料才解决的

    如果您对这个文章有任何异议,那么请在文章评论处写上你的评论。
    愿大家都能在编程这条路,越走越远。

    别人的女朋友都会生气了,而你的女朋友还在充气。

    展开全文
  • 一、关于微信公众号接入网址 这是从开发者文档上面弄下来的,下图就是接入的地方,在开发者中心-服务器的配置,看一下微信开发者文档是怎么说的 URL:就是你的服务器的URL(要能响应TOKEN验证,还要能在外网访问到...
  • 什么是tokentoken怎么生成的

    千次阅读 2020-08-11 11:30:37
     Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。...
  • token验证也加进去。但是之前重来也没有搞过这个东西,只是听说过,不知道怎么下手。所以这一块着实饶了一些弯子,好在有广大的网友帮忙,最终欧冠也是解决了。所以这次就来说说我对它的用法。 传统基于服务器的...
  • 首先,django 第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 csrftoken,并把这个 csrftoken 放在 cookie 里。然后每次 POST 请求都会带上这个 csrftoken。(这个csrftoken的有效期非常长(52周)) ...
  • 昨天在接入微信公众号服务器配置时 不管怎么写都是token验证失败 从网上找了诸多文档 终于从中找到的正确的解决防范 是在一个帖子下面有人留言中得知的 事先声明 我用的框架是tp5.1的 public function index(){...
  • 今天学习微信开发,再验证token时测试成功,但是使用tp框架后,一直是验证失败,我就无语了,看过日志,用get测试过路由,结果是正确的,但是微信token就是验证不通过。 百度了很多,原因大多都是bom头信息没请除,...
  • 1.django是怎么验证csrfmiddlewaretoken合法性的? 2.每次刷新页面的时候中的csrf的value都会更新,每次重复登录的时候cookie的csrf令牌都会刷新,那么这两个csrf-token有什么区别 CSRF简称跨站请求伪造 django第一次...
  • 我先获取token,然后携带token去访问资源服务器的接口,问题出现在: 我的认证服务器引入了spring-cloud-starter-alibaba-sentinel,就会报错invalid_token 但是我去掉spring-cloud-starter-alibaba-sentinel的依赖...
  • 主要的作用就是为了安全,用户登录时,服务器会返回一个有时效性的token,用户的每一次请求都需要携带上token,服务器验证token的有效性。 用户在浏览页面的时候,突然token到期了,应该怎么处理? 我的
  • 在中心服务器模式下的客户端认证 又发现了一项之前在工行工作期间缺失的技术,到了互联网企业工作后,技术栈大大不同。http协议是无状态的,但是网站登录要求前后几次请求能被标志为同一个人发起,工行是在服务器端...
  • php文件同一个,放在两个不同的网站服务器里面,用公众号A验证TOKEN,分别写两个不同的url均可通过,然而,公众号B只能验证通其中的一个TOKEN,另一个怎么也验证失败。屡试不爽,就是这么奇葩。 ...
  •  上线后提交申请微信提示"您的服务器没有正确响应token验证。。。",我查看日志发现根本就没有接收到来自微信的参数。 后来我又记录了微信请求方式和请求的字符串,想看看微信服务器到底有没有给我的服务器响应...
  • 最近开始折腾一下微信公众号开发,踩的一些莫名其妙的坑,给大家分享一下:首当其冲,当然是基础步骤中的开发者配置了。其实呢,只要认真读文档也就木有问题,...​ ​注意注意,你都没有和微信服务器验证怎么...
  • 如图所示,开发者可填写自己服务器验证token的接口地址,以及自定义的token(博主申请的测试号,使用natapp来进行内网穿透) 目的:帮助微信服务器和开发者服务器互相识别,以防恶意攻击 流程图如下(不知道博客园...
  • 大家好,最近在学习用java开发微信公众平台,第一次写的代码token验证通过了,用的是阿里云的服务器换系统(server2008->2003)后就怎么也通过不过验证。直接输入域名www.zhenggufang.com/aip/longin网页显示404....
  • 微信公众号对于每个人来说都不陌生,但是许多人都不清楚是怎么开发的。身为技术小白的我,在闲暇之余研究了一下基于java的微信公众号开发。下面就是我的实现步骤,写的略显粗糙,希望大家多多提议! 一、申请服务器...
  • ①:token和cookie一样都是首次登陆时,由服务器下发,都是当交互时进行验证的功能,作用都是为无状态的HTTP提供的持久机制。 ②:token存在哪儿都行,localstorage或者cookie。 ③:token和cookie举例,token就是说...
  • 服务器如何判断当前用户是否登录?...http:短连接使用token 机制来验证用户安全性 // token 值: 登录令牌! 用来判断当前用户的登录状态! // token 值特点: 是一个字符串/大整数,只需要保证唯一...
  • Token令牌 Redis 案例

    2020-05-19 13:33:58
    一般通过ajax发送请求,服务器接收请求去验证用户名和密码,然后返回给客户端一串字符串(token),客户端接收这个token把它存在Cookie 或者Local Storage中 客户端每次请求资源的时候需要携带这个token,服务.
  • 一篇文章弄懂cookie、session和token

    千次阅读 2018-11-05 19:33:13
    概念 cookie ...session和token算是一类的,他们是两种不同的服务器验证方式。 通俗来说,cookie会存一个value在客户端本地,然后将value附到HTTP上发给服务器,那么服务器怎么通过这个value...
  • websocket怎么实现登录验证

    万次阅读 2018-11-22 17:28:44
    2.客户端拿着返回的token, 通过websocket来连接服务器:wss://127.0.0.1/websocket?token=token 3.如果连接成功,服务器生成websocket session,   以上是我个人想法,不知道对不对,欢迎大神...
  • 业务要求:需要服务器验证,如果没有填写必须的属性值,返回到添加页面并且显示错误消息 add.jsp代码: [code="java"] <img src="img/n_01.jpg"></img> ...

空空如也

空空如也

1 2 3 4 5
收藏数 97
精华内容 38
关键字:

服务器怎么验证token