基于choerodon开发中遇到gateway获取jwt为empty

  • Choerodon平台版本:0.6.0

  • 运行环境(如localhost或k8s):localhost

  • 遇到问题时的前置条件:

  • 问题描述:

image

按照开发手册启动了该3个项目,但是api-gateway项目输出日志获取的token是empty的,我没发现oauth-server项目有写过token呢,怎样才能获取到这个token?拿到token后怎样让我挂上choerodon的项目拿到当前用户信息?我的最终目的是挂在choerodon上的项目能拿到当前用户信息,看了CustomUserDetails userDetails = DetailsHelper.getUserDetails();这个方法可以获取,但是要做什么操作才能调用这个方法成功获取用户信息?

你好,请问下你使用的平台0.6.0 是指api-gateway等服务的0.6.0.RELEASE版本吗?你是要用这个版本进行开发吗?

新建主题的时候漏删了0.6.0这一句了,下载下来的版本各有不同,都是GitHub上最新的代码,eureka的parent版本是0.8.0.RELEASE的版本,gateway是0.11.0.RELEASE版本,oauth-server是0.11.0.RELEASE版本,启动了3个项目后,登录进去是跳转到默认的url的,而且gateway项目的日志打印的是
INFO 7280 — [ XNIO-2 task-28] i.c.g.filter.route.HeaderWrapperFilter : Request get empty jwt , request uri: /oauth/login method: GET

这个/oauth/login 是登录接口 本身是public接口 不会获取到jwt信息,如果你开发的也是public接口(@Permission注解为public), 也不会获取到jwt信息,这个是正常的。所以你现在要做什么?遇到了什么问题?

我在开发一个基于choerodon的项目,其中项目中有些功能点需要获取choerodon当前登录人相关信息,例如username等。我看devops-service项目里面有这么一个方法获取用户信息的:CustomUserDetails userDetails = DetailsHelper.getUserDetails();但是我发现根据官网的开发文档步骤,我把这些项目都启动起来后,登录成功后会重定向到http://localhost:8080/manager/swagger-ui.html。这时候利用上述函数是获取不到userDetail的,请问我现在应该怎么操作我开发的项目中才能获取到userDetails呢?

你是使用choerodon的前端UI进行开发的吗?choerodon的前端UI是做了统一封装的,会把oauth2认证的access_token自动给请求加上,带上access_token去访问后端,就能通过DetailsHelper.getUserDetails()获取到用户信息。

我是做后端的,你指的同一封装自动加上access_token是前端不管发什么请求都会带上吗?我想验证测试下我项目功能到底能不能拿到用户信息应该怎么做?需要拉取哪几个前端项目呢?

单从前端角度来看,框架提供了获取token的办法,Choerodon.getCookie(),可以使用类似下面的函数使自己的请求带上token

headers: {
   Authorization: `bearer ${getCookie('access_token')}`,
},

所以,这种请求获取,带上token是一种非常常见的形式或者说模式,为了更方便开发,我们从框架内提供了axios实例,

// 0.17.0以后的版本,之前的版本的话请另外留言询问
import { axios } from '@choerodon/boot';

使用时只需

axios.get('your url here')

会自动加上一些前置处理,比如增加token,修改一些过期时长等,强烈建议使用这种方式。

还有拿到用户信息这个,如果是前端拿,可以通过

@inject('AppState') //注入AppState

// 代码内部
this.props.AppState.getUserInfo;
// 注意不是方法,直接这样就可以获取都当前登录用户的信息,可以在控制台输出

如果你问的是后端,那就在下面再留言询问吧:grinning:

有哪位大佬能解答我后端获取choerodon当前用户信息的这个问题么?

你得发起个请求到后端 后端才能获取到当前用户信息。
要么写个前端界面,发请求去测试;要么用swagger发请求去测试。
如果要开启swagger,在api-gateway修改下 skip-paths,把swagger的路径跳过。如下:

choerodon:
  gateway:
    permission:
          skip-paths: /**/skip/**, /oauth/**,/prometheus,/health,/env,/metrics,/favicon.ico,/manager/swagger-ui.html,/manager/webjars/**,/manager/swagger-resources/**

然后启动manager-service,可以通过本地 api-gateway或manager-service的/manager/swagger-ui.html路径访问swagger

你好,我通过前端getCookie(‘access_token’)这种方式获取出来报错image ,而用Choerodon.getCookie(‘access_token’)这种方式拿到的结果是Choerodon是undefined,这是什么原因,需要配置什么才能通过你说的getCookie(‘access_token’)拿到值呢?