Websocket推送中心(二)-基于Stomp的推送中心设计
Spring Websocket Stomp介绍
第二篇
:
基于Websocket Stomp的推送中心实现
第三篇
:
推送中心单机支持百万级连接的晋级之路
第四篇
:
推送中心的集群架构方案设计落地
文章
业务系统使用推送中心初始化公钥,推送中心维护项目和公钥的集合。
客户端正常登陆业务系统,业务系统使用私钥生成jwt颁布给客户端。
客户端鉴权时传入projectId和jwt,推送中心根据projectId获取公钥,然后通过公钥校验,通过连接建立成功,不通过,连接建立失败。
官网
在Token Authenication中说到,由于WebSocket协议并没有规定在WebSocket握手期间对客户端进行身份认证,而且SockJS JavaScript客户端不提供建立连接时自定义请求头,但是允许传入请求参数,所以我们可以把token放到请求参数当中。
Spring Websocket STOMP官网没有选择把token在ws握手时传入,推荐在创建STOMP协议时带入token到服务端认证,通过创建
ChannelInterceptor
实现,可以参见
推送中心完整项目地址
客户端在STOMP建立时传入JWT
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
stompClient = Stomp.over(socket); stompClient.connect({ token: token, projectId: projectId }, connectCallback, errorCallback);
function errorCallback(res) { if(res属于鉴权失败) { } if(res属于服务端不存在或者网络错误) { } } }
|
服务端配置STOMP认证管道校验JWT,Spring Boot官方为配置一个
Inbound
的拦截器,拦截
Connect
请求,这其实是属于STOMP的第一次握手时鉴权。但是只配置
Inbound
只能设置鉴权用户和设置用户,并不能把
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
@Configuration @EnableWebSocketMessageBroker public class MyConfig implements WebSocketMessageBrokerConfigurer {
@Override public void configureClientInboundChannel(ChannelRegistration registration) { registration.interceptors(new ChannelInterceptor() { @Override public Message<?> preSend(Message<?> message, MessageChannel channel) { StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class); if (StompCommand.CONNECT.equals(accessor.getCommand())) { Map<String, LinkedList> headers = (Map) message.getHeaders() .get(SimpMessageHeaderAccessor.NATIVE_HEADERS); Principal user = authenticate(headers); accessor.setUser(user); } return message; } }); } }
|
该篇文章
。
推送中心完整代码
。
到现在为止,单体的推送中心设计已经结束,后续会分享单体推送中心服务器调优达到百万级长连接,以及推送中心的集群方案设计。