首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在springboot的OAuth2框架中区分来自不同客户端的请求

在springboot的OAuth2框架中区分来自不同客户端的请求
EN

Stack Overflow用户
提问于 2020-04-05 14:18:39
回答 1查看 28关注 0票数 0

我有3个不同的客户端,分别是移动、网络、物联网。我正在使用grant_type = password并获取accessToken。我收到来自所有客户端的请求GET /access/resource。我想根据它们的客户端ID对它们进行不同的处理。我知道使用client_id的/oauth/check_token响应,但如何在资源服务器中提取它

EN

回答 1

Stack Overflow用户

发布于 2020-04-06 01:43:39

使用JWT,当授权服务器创建token时,默认的AccessTokenConverter实现DefaultAccessTokenConverterconvertAccessToken方法做:令牌的"response.put(this.clientIdAttribute, clientToken.getClientId());"也包括客户端id。上面提到的response只是一个哈希图,它将被转换成JWT。

当您的资源服务器在GET /access/resource上被访问时

代码语言:javascript
复制
@RequestMapping("/access/resource")
public @ResponseBody Map<String,Object> getRes() throws IOException {
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();

    ObjectMapper objMapper = new ObjectMapper();
    Map<String,Object> map = objMapper.convertValue(auth.getDetails(),Map.class);
    Jwt jwt = JwtHelper.decode((String) map.get("tokenValue"));
    Map<String,Object> claims = objMapper.readValue(jwt.getClaims(),Map.class);

    // This is what you want
    String clnt_id = (String) claims.get("client_id"); <<------- here

    // your logic here based on clnt_id
    // ex: if(clnt_id.equals("Specific client"){}
     ...

    return Collections.emptyMap();;
}

OAuth2Request还包括已解析的客户端id:

代码语言:javascript
复制
Authentication auth = 
SecurityContextHolder.getContext().getAuthentication();
String cliend_id = ((OAuth2Authentication) auth).getOAuth2Request().getClientId()

即使没有使用JWT,这个选项也可以应用,因为Oauth2request总是存在的。

看这里可以更好地理解:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61038764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档