如何在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.txtcookies.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
相关产品推荐
相关产品推荐

