You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Liferay中生成认证令牌并传递至需鉴权的Service Builder服务?

搞定Liferay认证令牌:调用需授权的Service Builder服务指南

我来帮你梳理下Liferay里调用需要认证的Service Builder服务的正确姿势,解决你之前请求失败的问题~

一、先搞到认证令牌:两种常用方法

1. OAuth2令牌(推荐,Liferay 7.x+适用)

这是Liferay官方推荐的现代认证方式,步骤很清晰:

  • 先去控制面板 > 配置 > 系统设置 > 安全 > OAuth2管理里创建一个OAuth2应用,记下生成的client_id和client_secret。
  • 用curl或者Postman发个POST请求到令牌端点拿token:
    curl -X POST \
      http://localhost:8080/oauth2/token \
      -H 'Content-Type: application/x-www-form-urlencoded' \
      -d 'grant_type=password&username=你的账号&password=你的密码&client_id=刚才的ID&client_secret=刚才的密钥'
    
    成功后会返回带access_token的JSON,这个就是咱们要的认证令牌。

2. 会话式令牌(适合Liferay 6.x或习惯传统会话的场景)

这种方式是通过登录获取JSESSIONID:

  • 发POST请求到登录接口,顺便保存Cookie:
    curl -X POST \
      http://localhost:8080/c/portal/login \
      -H 'Content-Type: application/x-www-form-urlencoded' \
      -d 'login=你的账号&password=你的密码' \
      -c cookies.txt
    
    执行完后,cookies.txt里就存着JSESSIONID了,后续请求带上这个Cookie就行。

二、把令牌传给服务:两种传递方式

1. 请求头传递(最安全,推荐)

用OAuth2令牌的情况:

调用服务时,给请求加个Authorization头,格式是Bearer 你的access_token。比如你的getMyNames服务,请求可以这么写:

curl -X GET \
  "http://localhost:8080/PortletName-portlet/api/jsonws/nameservice/get-my-names?userid=1" \
  -H 'Authorization: Bearer 拿到的access_token'

这里提一句:Liferay会把com.service.NameServiceUtil.getMyNames自动映射成友好路径nameservice/get-my-names,你可以直接访问http://localhost:8080/PortletName-portlet/api/jsonws看所有可用服务的正确路径,比拼serviceClassName靠谱多了。

用会话令牌的情况:

直接带上刚才保存的Cookie文件就行:

curl -X GET \
  "http://localhost:8080/PortletName-portlet/api/jsonws/nameservice/get-my-names?userid=1" \
  -b cookies.txt

2. URL参数传递(不推荐,安全性差)

如果非得用URL传,可以用p_auth参数——这是Liferay的CSRF令牌。你登录后访问http://localhost:8080/api/jsonws,页面里能找到这个值,然后拼到URL里:

http://localhost:8080/PortletName-portlet/api/jsonws/nameservice/get-my-names?userid=1&p_auth=拿到的p_auth值

三、你之前请求失败的原因

你试的那种username@host.com:password@是HTTP Basic认证,但Liferay默认没开这个,而且你的URL参数也有问题:

  • serviceParameters=[userid]完全多余,直接传userid=1就够了;
  • 用serviceClassName和serviceMethodName的老格式容易出错,换成友好路径更稳。

四、最后检查下服务配置

你说已经加了配置行,再确认下这些点:

  • 在service.properties里确保开了JSON Web Service:
    json.web.service.enabled=true
    
  • 如果服务需要权限,在service.xml的<service>标签里加权限校验逻辑,比如:
    <service>
      <authorize>
        <![CDATA[
          return permissionChecker.hasPermission(..., "VIEW");
        ]]>
      </authorize>
    </service>
    

内容的提问来源于stack exchange,提问作者Ghassan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:13:54