token的传参方式

1 篇文章 0 订阅
1 篇文章 0 订阅

token的传递方式分为参数传递和请求头(header)中传递两种
客户端发送请求(带有token),后台GateWay担任Security_OAuth2的资源服务器,对请求进行拦截,如下
springSecurityFilterChain 是springSecurity的filter

@Bean
SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
  //认证处理器
  ReactiveAuthenticationManager customAuthenticationManager = new CustomAuthenticationManager(tokenStore);
  JsonAuthenticationEntryPoint entryPoint = new JsonAuthenticationEntryPoint();
  //token转换器
  todo token的可能在参数accessToken中,也可能在head的Authorization#bearer中
  ServerBearerTokenAuthenticationConverter tokenAuthenticationConverter = new ServerBearerTokenAuthenticationConverter();
  tokenAuthenticationConverter.setAllowUriQueryParameter(true);
  //oauth2认证过滤器
  AuthenticationWebFilter oauth2Filter = new AuthenticationWebFilter(customAuthenticationManager);
  oauth2Filter.setServerAuthenticationConverter(tokenAuthenticationConverter);
  ...

#8行 调用了token转化器,这个converter就是处理不同方式传递来的token,进行解析
ServerBearerTokenAuthenticationConverter

private String token(ServerHttpRequest request) {
    String authorizationHeaderToken = resolveFromAuthorizationHeader(request.getHeaders());
    String parameterToken = (String)request.getQueryParams().getFirst("access_token");
    if (authorizationHeaderToken != null) {
      if (parameterToken != null) {
        BearerTokenError error = BearerTokenErrors.invalidRequest("Found multiple bearer tokens in the request");
        throw new OAuth2AuthenticationException(error);
      } else {
        return authorizationHeaderToken;
      }
    } else {
      return parameterToken != null && this.isParameterTokenSupportedForRequest(request) ? parameterToken : null;
    }
}

#3行 从参数中获取access_token,进行判断(在第12行)
#2行 是调用方法从Header里解析Authorizatio#bearer属性
resolveFromAuthorizationHeader

private static String resolveFromAuthorizationHeader(HttpHeaders headers) {
        String authorization = headers.getFirst("Authorization");
        if (StringUtils.startsWithIgnoreCase(authorization, "bearer")) {
            Matcher matcher = authorizationPattern.matcher(authorization);
            if (!matcher.matches()) {
                BearerTokenError error = invalidTokenError();
                throw new OAuth2AuthenticationException(error);
            } else {
                return matcher.group("token");
            }
        } else {
            return null;
        }
    }

#3行 startsWithIgnoreCase忽略大小写,我们有时候在请求里写的就是BEARER,也是能识别的

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
API传参方式的具体实现取决于你使用的编程语言和框架。以下以常用的Python语言为例,介绍各种传参方式的实现方法: 1. 查询字符串: 使用requests库发送GET请求时,可以通过params参数来传递查询字符串参数,例如: ```python import requests url = 'http://example.com/api' params = {'param1': 'value1', 'param2': 'value2'} response = requests.get(url, params=params) ``` 2. 路径参数: 使用Flask框架时,可以通过在路由中使用“<variable_type:variable_name>”的方式来定义路径参数,例如: ```python from flask import Flask app = Flask(__name__) @app.route('/api/resource/<int:id>') def get_resource(id): # do something with id ... ``` 3. 请求体: 使用requests库发送POST请求时,可以通过data或json参数来传递请求体参数,例如: ```python import requests url = 'http://example.com/api' data = {'key1': 'value1', 'key2': 'value2'} response = requests.post(url, data=data) # 或者 import requests import json url = 'http://example.com/api' json_data = json.dumps({'key1': 'value1', 'key2': 'value2'}) response = requests.post(url, json=json_data) ``` 4. 请求头: 使用requests库发送请求时,可以通过headers参数来设置请求头信息,例如: ```python import requests url = 'http://example.com/api' headers = {'Authorization': 'Bearer {token}'} response = requests.get(url, headers=headers) ``` 以上是Python语言中API传参方式的简单实现方法,其他编程语言和框架也有类似的实现方式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值