SAP 电商云 Spartacus UI userID 即邮件地址中的加号问题

SilentDev
• 阅读 558

如果用户登录名或密码包含符号 +,它将被替换为空格,因为 Content-Type 等于 application/x-www-form-urlencoded。

下面是一个例子:

SAP 电商云 Spartacus UI userID 即邮件地址中的加号问题

https://<host>:9002/occ/v2/electronics-spa/forgottenpasswordtokens?lang=en&curr=USD

我输入了包含 + 号的邮件地址后,点击 Submit,发送一个 HTTP POST 请求到后台,响应为 202:
SAP 电商云 Spartacus UI userID 即邮件地址中的加号问题

从 Form Data 区域,我们可以发现,这个 userId 显示为 a @sap.com, 邮箱地址里包含了空格符号:

SAP 电商云 Spartacus UI userID 即邮件地址中的加号问题

SAP 电商云 Spartacus UI userID 即邮件地址中的加号问题

找到 Reset Password Component 的 selector:cx-forgot-password

SAP 电商云 Spartacus UI userID 即邮件地址中的加号问题

Component 名称为:ForgotPasswordComponent

通过 Service 实现:
SAP 电商云 Spartacus UI userID 即邮件地址中的加号问题

依赖于 UserPasswordFacade:
SAP 电商云 Spartacus UI userID 即邮件地址中的加号问题

调用 userProfileConnector 完成:
SAP 电商云 Spartacus UI userID 即邮件地址中的加号问题

connector 调用 userProfileAdapter:

SAP 电商云 Spartacus UI userID 即邮件地址中的加号问题

这是一个 abstract class,我们调用 OCCUserProfileAdapter 实现:

SAP 电商云 Spartacus UI userID 即邮件地址中的加号问题

OccUserProfileAdapter 最终调用 HTTP Client 的 post 操作:

SAP 电商云 Spartacus UI userID 即邮件地址中的加号问题

我们在后台打印 Angular HTTP client 发送过来的请求,发现确实 + 号被转换成了空格:

SAP 电商云 Spartacus UI userID 即邮件地址中的加号问题

https://github.com/angular/an...

这个文件首先使用浏览器的 encodeURIComponent() 方法,但随后恢复了几个字符的编码,包括 + 号。

一种比较合理的设计是:

感谢@meeque 参与讨论这个话题。 Angular 确实不支持干净的编码/解码,这就是为什么我们没有为各种字符(@:$,;+=?/)获得正确的编码。 我浏览了与此主题相关的各种资源,但我不确定为什么会跳过这些字符。

  • 实现一个仅使用来自浏览器的 encodeURIComponent 和 decodeURIComponent 的 HttpParameterCodec
  • 在我们使用 HttpParameters 的任何地方都使用编码器,但至少在创建用户和密码方面
  • 允许通过 DI 或通过在配置模块中配置类来覆盖此行为

可以先在前台进行 encode:

const pass = encodeURIComponent(password.value);
this.auth.authorize(userId.value.toLowerCase(), pass);

然后在 Hybris 后台 decode:

if (credential instanceof String) {
    // if credential is a string use URLDecode class. 
    credential = URLDecoder.decode(String.valueOf(credential), StandardCharsets.UTF_8);
    if (!user.checkPassword((String) credential)) {
        throw new BadCredentialsException(this.messages.getMessage("CoreAuthenticationProvider.badCredentials", "Bad credentials"));
    }
} else {
    if (!(credential instanceof LoginToken)) {
        throw new BadCredentialsException(this.messages.getMessage("CoreAuthenticationProvider.badCredentials", "Bad credentials"));
    }
   if (!user.checkPassword((LoginToken) credential)) {
       throw new BadCredentialsException(this.messages.getMessage("CoreAuthenticationProvider.badCredentials", "Bad credentials"));
     }
}

后续修复进度,请跟踪这个 Github issue.

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
34.TCP取样器
阅读文本大概需要3分钟。1、TCP取样器的作用   TCP取样器作用就是通过TCP/IP协议来连接服务器,然后发送数据和接收数据。2、TCP取样器详解!(https://oscimg.oschina.net/oscnet/32a9b19ba1db00f321d22a0f33bcfb68a0d.png)TCPClien
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
SilentDev
SilentDev
Lv1
因为给不了你要的所以放开了手让你远走。
文章
5
粉丝
0
获赞
0