Angular 6 个具有凭据的 httpClient Post
Angular 6 httpClient Post with credentials
我有一些代码可以发布一些数据来创建数据记录。
它在服务中:
代码如下:
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
const httpOptions = {
headers: new HttpHeaders({ 'Content-Type': 'application/json' })
};
@Injectable({
providedIn: 'root'
})
export class ApiService {
constructor(private http: HttpClient) { }
create() {
const postedData = { userid: 1, title: 'title here', body: 'body text' };
return this.http.post('https://jsonplaceholder.typicode.com/posts', postedData, httpOptions).subscribe(result => {
console.log(result);
}, error => console.log('There was an error: '));
}
}
我的问题是...我该怎么做 url 要求用户登录...我如何传递凭据?
好吧,为了保护您的端点,您必须首先选择有关如何签署您的呼叫并确保它们安全的策略。一种常见的方法是使用 JWT 令牌。 (还有其他选择,我提供给你一个我最熟悉的)。
这将要求用户使用他们的凭据联系您后端的端点,不安全。您需要配置您的后端,它将检查凭据,如果它们是正确的,后端会给您一个令牌,您将使用它来签署您的安全调用(使用 JWT,您将此令牌放在您的 header,如果您的后端配置正确,它将在受保护的 APIs).
上检查此令牌
由于我们不知道您使用什么后端,我只能向您推荐 angular 中的 JWT 令牌库作为您的前端。 https://github.com/auth0/angular-jwt
该库将为您提供一个 http 客户端,如果您在本地存储了一个令牌,它会自动使用令牌对您的请求进行签名。它还允许您在前端 url 上设置保护措施,例如,它还会自动检查存储的令牌是否未过期。
工作流程如下:
1) 用户将凭据发送到后端
2) 后端确认凭据并发回令牌
3) 您将令牌存储在前端的本地存储中,并配置库以使用它。
4) 在安全的 URL 上设置守卫,作为 pre-check 无论您是否有未过期的令牌。
5) 最后使用图书馆的 HTTP 客户端,它将使用您存储在本地存储中的令牌签署您的请求,使用您的安全 API.
编辑:
我有一个在 Angular 中使用 JWT 令牌的基本模板。你可以在这里找到它 https://github.com/BusschaertTanguy/angular2_template/.
在 auth 模块中查找配置、登录和注册组件、用于安全 http 客户端的 http 客户端、用于令牌处理和路由保护的 auth 和 auth-guard 服务。
模板中的一些快速片段可以帮助您解决问题:
//Library Configuration
export function authHttpServiceFactory(
http: Http,
options: RequestOptions
) {
return new AuthHttp(
new AuthConfig({
tokenName: 'token',
tokenGetter: (() => localStorage.getItem('token')),
globalHeaders: [{ 'Content-Type': 'application/json' }]
}),
http,
options
);
}
@NgModule({
providers: [{
provide: AuthHttp,
useFactory: authHttpServiceFactory,
deps: [Http, RequestOptions]
}]
})
export class AuthModule { }
//HttpService
get(url: string): Observable<any> {
return this.http.get(endpoint).map(data => data.json());
}
//LoginComponent
login() {
this.httpService.get(urlToLogin).subscribe(
data => {
localStorage.setItem('token', data.access_token);
}
);
}
那些是寻找你的前端配置的地方,你也可以按照图书馆页面上的教程,因为这是我实现它的方式,只是我在这里和那里添加了一些抽象,只是为了给你一个想法从哪里开始。
为了使用 cookie 请求,您需要在请求中添加 withCredentials。请参阅以下代码
const httpOptions = {
headers: new HttpHeaders({
'Authorization': fooBarToken
}),
withCredentials: true
};
以下代码也有效:
return this.http.get<{}>('YOU API URL', {
withCredentials: true
})
我有一些代码可以发布一些数据来创建数据记录。
它在服务中:
代码如下:
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
const httpOptions = {
headers: new HttpHeaders({ 'Content-Type': 'application/json' })
};
@Injectable({
providedIn: 'root'
})
export class ApiService {
constructor(private http: HttpClient) { }
create() {
const postedData = { userid: 1, title: 'title here', body: 'body text' };
return this.http.post('https://jsonplaceholder.typicode.com/posts', postedData, httpOptions).subscribe(result => {
console.log(result);
}, error => console.log('There was an error: '));
}
}
我的问题是...我该怎么做 url 要求用户登录...我如何传递凭据?
好吧,为了保护您的端点,您必须首先选择有关如何签署您的呼叫并确保它们安全的策略。一种常见的方法是使用 JWT 令牌。 (还有其他选择,我提供给你一个我最熟悉的)。
这将要求用户使用他们的凭据联系您后端的端点,不安全。您需要配置您的后端,它将检查凭据,如果它们是正确的,后端会给您一个令牌,您将使用它来签署您的安全调用(使用 JWT,您将此令牌放在您的 header,如果您的后端配置正确,它将在受保护的 APIs).
上检查此令牌由于我们不知道您使用什么后端,我只能向您推荐 angular 中的 JWT 令牌库作为您的前端。 https://github.com/auth0/angular-jwt
该库将为您提供一个 http 客户端,如果您在本地存储了一个令牌,它会自动使用令牌对您的请求进行签名。它还允许您在前端 url 上设置保护措施,例如,它还会自动检查存储的令牌是否未过期。
工作流程如下:
1) 用户将凭据发送到后端
2) 后端确认凭据并发回令牌
3) 您将令牌存储在前端的本地存储中,并配置库以使用它。
4) 在安全的 URL 上设置守卫,作为 pre-check 无论您是否有未过期的令牌。
5) 最后使用图书馆的 HTTP 客户端,它将使用您存储在本地存储中的令牌签署您的请求,使用您的安全 API.
编辑:
我有一个在 Angular 中使用 JWT 令牌的基本模板。你可以在这里找到它 https://github.com/BusschaertTanguy/angular2_template/.
在 auth 模块中查找配置、登录和注册组件、用于安全 http 客户端的 http 客户端、用于令牌处理和路由保护的 auth 和 auth-guard 服务。
模板中的一些快速片段可以帮助您解决问题:
//Library Configuration
export function authHttpServiceFactory(
http: Http,
options: RequestOptions
) {
return new AuthHttp(
new AuthConfig({
tokenName: 'token',
tokenGetter: (() => localStorage.getItem('token')),
globalHeaders: [{ 'Content-Type': 'application/json' }]
}),
http,
options
);
}
@NgModule({
providers: [{
provide: AuthHttp,
useFactory: authHttpServiceFactory,
deps: [Http, RequestOptions]
}]
})
export class AuthModule { }
//HttpService
get(url: string): Observable<any> {
return this.http.get(endpoint).map(data => data.json());
}
//LoginComponent
login() {
this.httpService.get(urlToLogin).subscribe(
data => {
localStorage.setItem('token', data.access_token);
}
);
}
那些是寻找你的前端配置的地方,你也可以按照图书馆页面上的教程,因为这是我实现它的方式,只是我在这里和那里添加了一些抽象,只是为了给你一个想法从哪里开始。
为了使用 cookie 请求,您需要在请求中添加 withCredentials。请参阅以下代码
const httpOptions = {
headers: new HttpHeaders({
'Authorization': fooBarToken
}),
withCredentials: true
};
以下代码也有效:
return this.http.get<{}>('YOU API URL', {
withCredentials: true
})