我的应用程序有一个表单,供用户输入一串内容和一个密钥,该密钥会发布到服务器并加密。向用户返回加密值。该应用程序允许他们使用密钥将加密的值发送回服务器,服务器将解密数据并将其发送回响应。
我可以成功发布数据以进行加密并获取我的回复。我遇到的问题是,当用户发回加密数据时,加密数据包含需要进行URL编码的字符。
这是请求加密的Angular 4服务功能。
encrypt(data: CryptoData): Promise<Result> {
let urlParameters = new URLSearchParams();
urlParameters.append('content', data.content);
urlParameters.append('key', data.key);
let body = urlParameters.toString();
return this.http
.post('/api/encrypt', body, this.options)
.toPromise()
.then(response =>
{
return response.json();
});
}
这会取回加密结果。使用Content
和Key
值:
内容:Foo Bar
键:测试键
结果:AAAAABAAAACUdwXxU1tfClnbpOaKEqNVPuZSxL + cawqTxH + ZAFmDlBAAAAD6o / EFwKE9aDIU1WLOCDtBbY7ERTiKgsXr4pnsvkm + Et + qpJwLORrvPn9QzmJ1uFI =
结果有一个Base64字符串,它包含我需要在用户发回数据时进行URL编码的字符,例如+
。
处理此问题的角度方法是什么?后端服务器是ASP.Net Core,我可以改变我的实现方式,以处理Angular端的任何更改。目前,我使用此功能发布数据,这会导致+
个字符替换为空格。
export class EncryptService implements OnInit {
private options: RequestOptions;
constructor(private http: Http) {
this.options = new RequestOptions({
headers: new Headers({ 'Content-Type': 'application/x-www-form-urlencoded' })
})
}
decrypt(data: CryptoData) {
let urlParameters = new URLSearchParams();
urlParameters.append('content', data.content);
urlParameters.append('key', data.key);
let body = urlParameters.toString();
return this.http
.post('/api/decrypt', body, this.options)
.toPromise()
.then(response =>
{
return response.json();
});
}
}
传入的接口如下所示:
export interface CryptoData {
content: string;
key: string;
}
我的ASP.Net Core API端点如下所示:
[HttpPost("~/api/Decrypt")]
public IActionResult Decrypt([FromForm] CryptoRequest request)
{
string content = request.Content;
string key = request.Key;
// .....
return base.Ok();
}
答案 0 :(得分:1)
在base64上使用base64URL。
对于Angular,请使用base64URL。
运行npm install base64url
在导入下方的服务或组件中,添加以下内容:
const base64url = require('base64url');
像这样使用..
const b64URLresult = base64url(result);
有另一种方法可以使用Typings和Definitely Typed添加javascript包。首先在这个包中尝试使用,所以给出了上述解决方案。