gpt4 book ai didi

angular - WebSocket 握手认证

转载 作者:行者123 更新时间:2023-12-04 15:56:03 25 4
gpt4 key购买 nike

我有一个 angular 6 应用程序和 python(django 2.0.6) 后端。Angular 6 应用程序是使用 AWS S3 和 CloudFront 部署的。

Angular 6 应用程序使用 websocket 功能。一切都在本地运行良好,但是当部署 Angular 6 应用程序时,无法通过 websocket 握手请求传递 cookie。 (仅针对websoket连接通过cookie授权。有原因,不相关。)

Websocket 服务器位于子域:`api.site.com``

我尝试了多种方法在 Angular 6 应用程序中设置 cookie,例如:

let domain = 'api.site.com'

document.cookie = `Token=${token}; domain=${domain}; path=/`;
document.cookie = `Token=${token}; path=/`;
document.cookie = `Token=${token};
document.cookie = `Token=${token}, domain=${domain}, path=/`;

使用ngx-cookie-service:

this.cookieService.set('Token', token, undefined, '/', 'api.site.com');
this.cookieService.set('Token', token, undefined, '/');
this.cookieService.set('Token', token);

token 是 JWT token 。

对于上述所有情况,在部署应用程序时,Token cookie 不会随 websocket 握手传递。使用 wss 协议(protocol)。angular 6 应用程序在域 site.com 下运行(=> api 是一个子域)

Cloudfront 行为设置为传递所有 cookie。

请告知可能是什么原因。

最佳答案

解决方法:

在我的例子中,我无法设置 cookie,但基于以下主题制定了一个解决方案:HTTP headers in Websockets client API

关于如何使用 jwt token 对 WebSocket 客户端 API 进行身份验证,有很多零散的信息。这是对 django 2.0.6channels 2.1.1angular 6 堆栈有效的完整解决方案:

django 中间件:

class TokenAuthMiddleware:

def __init__(self, inner):
self.inner = inner

def __call__(self, scope):
auth_header = None
if 'subprotocols' in scope:
try:
auth_header = scope['subprotocols'][1]
except:
pass

if auth_header:
try:
user_jwt = jwt.decode(
auth_header,
settings.SECRET_KEY,
)
scope['user'] = MyUser.objects.get(
id=user_jwt['user_id']
)
close_old_connections()
except (InvalidSignatureError, KeyError, ExpiredSignatureError, DecodeError):
scope['auth_error'] = 'KeyError'
pass
except Exception as e: # NoQA
scope['auth_error'] = 'Unknown'

return self.inner(scope)


TokenAuthMiddlewareStack = lambda inner: TokenAuthMiddleware(AuthMiddlewareStack(inner))

ws 消费者:

class WsConsumer(JsonWebsocketConsumer):
def connect(self):
self.accept('auth_token')
if self._is_authenticated():
***do things***
else:
logger.error("ws client auth error")
self.close(code=4003)

def _is_authenticated(self):
if hasattr(self.scope['headers'], 'auth_error'):
return False
if type(self.scope['user']) is AnonymousUser or not self.scope['user']:
return False
return True

WebSocket 客户端 API(js cli):

  this.socket = new WebSocket('ws://host.com/ws/`, ['auth_token', token]);

关于angular - WebSocket 握手认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51584642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com