- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前正在为 iOS/Android 开发一个 Ionic (3.4) 应用程序。我不熟悉身份验证过程或应用程序。
在提供者中使用 HTTP 请求后,我得到了我的对象,即用户。但我完全不知道如何存储或处理它。什么是好的做法:
最后,应用程序在重新加载/重新启动时将如何 react :如何避免人们一次又一次地填写表单?
这是我的服务:
@Injectable()
export class UserProvider {
data = {};
username: string;
password: string;
constructor(private _http: Http) {
console.log('Hello UserProvider Provider');
}
getUser(username:string, password:string){
let urlSearchParams = new URLSearchParams();
urlSearchParams.append('username', username);
urlSearchParams.append('password', password);
let params = urlSearchParams.toString()
var headers = new Headers();
headers.append('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
return this._http
.post("http://api.minesdedouai.fr/user/login", params, {headers:headers} )
.map(response => response.json())
}
}
我知道登录请求应该使用一些 token ,但正如我所说,这是一个小学生的 API,我们不是专业人士,但它正在工作。
这是在组件(页面)某处使用服务的方法。
onLogin(form: NgForm) {
if (form.valid) {
this._userProvider.getUser(this.login.username, this.login.password)
.subscribe((response) => {
this.user = response;
console.log("Authentification Success");
this.navCtrl.push(TabsPage, {user: this.user});
},
(error) => {
if (error.status===403){
console.log("Wrong User")
}
else{
console.log(error);
}
});
}
}
非常感谢
最佳答案
我将向您展示我如何在我的 ionic 应用程序上处理身份验证。
第一步是创建您要存储的数据的表示。我曾经存储一些用户信息和用于身份验证的 jwt token 。
用户.ts
:
export class AuthenticatedUser {
private _username: string;
private _id: number;
private _token: string;
public static GetNewInstance(): AuthenticatedUser {
return new AuthenticatedUser(null, null, null)
}
public static ParseFromObject(object): AuthenticatedUser {
const model = AuthenticatedUser.GetNewInstance();
if (object) {
model.username = object.username;
model.id = object.id;
model.token = object.token;
}
return model;
}
constructor(username: string, id: number, token: string) {
this._username = username;
this._id = id;
this._token = token;
}
get username(): string {
return this._username;
}
set username(value: string) {
this._username = value;
}
get id(): number {
return this._id;
}
set id(value: number) {
this._id = value;
}
get token(): string {
return this._token;
}
set token(value: string) {
this._token = value;
}
}
GetNewInstance
方法用于返回实例化的 AuthenticatedUser
变量。ParseFromObject
方法用于从对象返回一个AuthenticatedUser
。将 api 响应 object
转换为模型非常有用。之后我创建了一些服务。第一个是用户服务。我用它来访问本地存储中的 AuthenticatedUser
。在本地存储中,数据是永久性的,不会在您关闭应用程序时被删除。
user.service.ts
:
export class UsersService {
private _user: Subject<AuthenticatedUser> = new Subject<AuthenticatedUser>();
constructor(private storage: Storage) {}
/* ---------------------------------------------------------------------------------------------------------------- */
/* Observable use object */
public subscribeToUserService(callback) {
return this._user.subscribe(callback);
}
public updateUserService(user: AuthenticatedUser) {
this._user.next(user);
}
/* ---------------------------------------------------------------------------------------------------------------- */
/* User storage management */
/**
* Write user properties in the local storage.
*
* @param user
* @returns {Promise<AuthenticatedUser>}
*/
createOnStorage(user: AuthenticatedUser): Promise<AuthenticatedUser> {
return new Promise((resolve) => {
this.getOnStorage().then((res) => {
if (res) {
this.deleteOnStorage().then(() => {
});
}
}).then(() => {
this.updateUserService(user);
this.storage.set('user', JSON.stringify(user));
resolve();
});
});
}
/**
* Get user properties from local storage.
*
* @returns {Promise<AuthenticatedUser>}
*/
getOnStorage(): Promise<AuthenticatedUser> {
return new Promise((resolve) => {
this.updateUserService(JSON.parse(this.storage.get('user')));
resolve(this.storage.get('user'));
});
}
/**
* Get user properties from local storage.
*
* @returns {Promise<AuthenticatedUser>}
*/
getOnStorageSync() {
this.updateUserService(JSON.parse(this.storage.get('user')));
return this.storage.get('user');
}
/**
* Update user properties from local storage.
*
* @param user
* @returns {Promise<AuthenticatedUser>}
*/
updateOnStorage(user: AuthenticatedUser): Promise<AuthenticatedUser> {
return new Promise((resolve) => {
resolve(this.storage.get('user'));
});
}
/**
* Delete user properties from local storage.
*
* @returns {Promise<AuthenticatedUser>}
*/
deleteOnStorage(): Promise<AuthenticatedUser> {
return new Promise((resolve) => {
this.storage.clear();
resolve();
});
}
}
第二个服务是ApiService
。此服务用于发送不同的 HTTP
方法和处理的答案。在此服务中,我们将格式化 header 并访问经过身份验证的用户的 token 。
@Injectable()
export class ApiService {
private baseUrl = "https://my.api.co";
private user: AuthenticatedUser;
/* ---------------------------------------------------------------------------------------------------------------- */
constructor(private userService: UserService, private http: Http) {
getAuthUser()
}
private getAuthUser() {
this.userService.getOnStorage.then(
(user) => {
this.user = user;
});
}
/**
* Get the Json Web Token from the local storage.
*
* @returns {RequestOptions}
*/
private formatHeader(): RequestOptions {
const headers: Headers = new Headers();
if (this.user.token) {
headers.append('Authorization', 'Bearer ' + this.user.token);
}
return new RequestOptions({headers});
}
/**
* Get the body of an HTTP response.
*
* @param res
* @returns {any|{}}
*/
private handleBody(res: Response) {
return res.json() || {};
}
/**
* Format the error message of an HTTP response.
*
* @param error
* @returns {any}
*/
private handleError(error: Response | any) {
let errorModel: any = {};
if (error instanceof Response) {
const body = error.json() || '';
const err = body.error || JSON.stringify(body);
errorModel = { status: error.status, message: `${error.status} - ${err.cause} ` };
} else {
errorModel = { status: error.status, message: error.toString()};
}
return Observable.throw(errorModel);
}
/* ---------------------------------------------------------------------------------------------------------------- */
/**
* Perform a PUT request.
*
* @param url
* @param auth
* @param body
* @returns {Observable<>}
*/
putRequest(url: string, body: Object, auth: boolean = true): Observable<Object> {
let header = null;
if (auth) {
header = ApiService.formatHeader();
}
return this.http.put(this.BASE_URL + url, body, header)
.map(ApiService.handleBody)
.catch(ApiService.handleError);
}
/**
* Perform a POST request.
*
* @param url
* @param auth
* @param body
* @returns {Observable<>}
*/
postRequest(url: string, body: Object, auth: boolean = true): Observable<Object> {
let header = null;
if (auth) {
header = ApiService.formatHeader();
}
return this.http.post(this.BASE_URL + url, body, header)
.map(ApiService.handleBody)
.catch(ApiService.handleError);
}
/**
* Perform a HEAD request.
*
* @param url
* @param auth
* @returns {Observable<>}
*/
headRequest(url: string, auth: boolean = true): Observable<Object> {
let header = null;
if (auth) {
header = ApiService.formatHeader();
}
return this.http.head(this.BASE_URL + url, header)
.map(ApiService.handleBody)
.catch(ApiService.handleError);
}
/**
* Perform a GET request.
*
* @param url
* @param auth
* @returns {Promise<>}
*/
getRequest(url: string, auth: boolean = true): Observable<Object> {
let header = null
if(auth) {
header = ApiService.formatHeader();
}
return this.http.get(this.BASE_URL + url, header)
.map(ApiService.handleBody)
.catch(ApiService.handleError);
}
/**
* Perform a DELETE request.
*
* @param url
* @param auth
* @returns {Observable<>}
*/
deleteRequest(url: string, auth: boolean = true): Observable<Object> {
let header = null;
if (auth) {
header = ApiService.formatHeader();
}
return this.http.delete(this.BASE_URL + url, header)
.map(ApiService.handleBody)
.catch(ApiService.handleError);
}
最后一个服务是AuthService
。此服务将发送登录/注销请求。
auth.service.ts
:
@Injectable()
export class AuthService {
private user: AuthenticatedUser;
/* ---------------------------------------------------------------------------------------------------------------- */
constructor(private userService: userService, private apiService: ApiService) {
this.getAuthUser();
}
getAuthUser() {
this.userService.getOnStorage().then(
(user) => {
this.user = user;
}
);
}
/* ---------------------------------------------------------------------------------------------------------------- */
/**
* Request an authentication access.
*
* @param email the email of the user
* @param password the password of the user
* @returns {Promise<any>}
*/
login(email: string, password: string): Promise<AuthentificatedUser> {
return new Promise((resolve, reject) => {
this.apiService.postRequest('/auth', {email: email, password: password})
.subscribe(
res => resolve(AuthentificatedUser.ParseFromObject(res)),
error => reject(<any>error));
});
}
/**
* Logout a user from the authentication process.
*
* @returns {Promise<any>}
*/
logout(): Promise<any> {
return new Promise((resolve) => {
this.userService.deleteOnStorage().then(() => {
resolve();
});
});
}
/**
* Check whether a user is already logged in.
*
* @returns {boolean}
*/
isLoggedIn() {
if (this.user.token) {
return true;
} else {
return false;
}
}
/* ---------------------------------------------------------------------------------------------------------------- */
}
在您的登录页面:
this.authService.login('login', 'password').then(
(user) => {
this.userSerivce.createOnStorage(user);
this.navCtrl.push(HomePage);
}).catch(
(err) => {
//show the error
}
);
您必须做的最后一件事是检查用户是否已连接或将用户重定向到登录屏幕。
export HomePage() {
private user: AuthenticatedUser;
constructor(private userService: UserService) {
this.getAuthUser();
}
private getAuthUser() {
this.userService.getOnStorage().then(
(user) => {
this.user = user;
if (!this.user.token) {
this.navCtrl.push(LoginPage)
}
}
);
}
}
关于angular - 如何在 Ionic 3 中高效地存储和使用 Authentication,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44936354/
我在服务器端实现了 oauth token ,但在无效 token 或 token 过期时,我收到 200 http 状态代码,但在响应正文中我有{"code":"4XX", "data":{"som
我正在尝试将 sinatra-authentication gem 添加到 Sinatra 应用程序中,虽然它在那里并完成了它的一部分工作,但由于某种原因,路由似乎没有被添加。代码基础: requir
我有一个健身移动应用程序的想法,我一直在为 iPhone(基于 Obj-C)、Android(基于 Java)、WebOS(基于 html5)和诺基亚 Qt 开发基于这个想法的应用程序。 我现在需要向
我见过有人使用 UUID 生成身份验证 token 。然而,在 RFC 4122据说 Do not assume that UUIDs are hard to guess; they should n
上下文如下。 pouchdb-authentication API没有为此提供明确的方法。我考虑过使用db.getUser(username [, opts][, callback]) 。然而,该方法
Edge 浏览器中的“基本身份验证”没有保存密码的选项。当浏览器关闭并重新打开时,用户必须重新输入密码。 有没有人解决这个问题? 最佳答案 它仍然存在并且仍在工作,他们只是从那些对话框窗口中删除了复选
嗨,我需要知道如何在 iPhone 上使用 oAuth for twitter 自动登录帐户。该应用程序应登录并向用户显示该帐户的提要。 最佳答案 OAuthentication 需要几个阶段,您可以
Edge 浏览器中的“基本身份验证”没有保存密码的选项。当浏览器关闭并重新打开时,用户必须重新输入密码。 有没有人解决这个问题? 最佳答案 它仍然存在并且仍在工作,他们只是从那些对话框窗口中删除了复选
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
在尝试运行一些 OpenVAS CLI 命令时,我收到 Failed Authentication 错误消息。 OpenVAS 安装在 CentOS 机器上。我尝试使用用户帐户凭据,但仍然收到相同的错
我正在设计一个 web api。我需要让用户对自己进行身份验证。我有点犹豫让用户以明文形式传递他们的用户名/密码.. 类似于:api.mysite.com/auth.php?user=x&pass=y
我尝试通过 oAuth 在 Spring Security 应用程序中验证用户。我已经收到 token 和用户数据。 如何在没有密码和经典登录表单的情况下手动验证用户? 谢谢你。 最佳答案 像这样的东
我正在 Symfony 4 中创建一个简单的登录身份验证系统并使用安全组件 Guard。我的 FormLoginAuthenticator 如下: router = $router;
我正在开发一个具有多个角色的网络应用程序。我想到了一种方法,可以使用 React Router 通过 onEnter 触发器来限制对某些路由的访问。 现在我想知道这是否是防止访问未经授权的页面的可靠方
我已通读 RFC 2617如果支持多种方案,则无法在那里或其他任何地方找到分隔符。例如,假设支持 Basic 和 Digest。我知道它可能会以这种方式出现: HTTP/1.1 401 Unautho
我在 OWIN Cookie 身份验证方面遇到了一些问题。我有一个 .Net 站点,它有一些 MVC 页面,这些页面使用 cookie 身份验证和受不记名 token 保护的 WebAPI 资源。 当
我正在使用 Telnet 向 Mikrotik 路由器发送命令。 telnet 192.168.100.100 -l admin Password: pass1234 [admin@ZYMMA] >
我管理着一个庞大而活跃的论坛,但我们正被一个非常严重的问题所困扰。我们允许用户嵌入远程图像,就像 stackoverflow 处理图像 (imgur) 的方式一样,但是我们没有一组特定的主机,可以使用
这个真的让我抓狂。 我在 JBoss AS 中有一个 Guvnor(稍后会详细介绍)。我编辑了 components.xml 以启用身份验证(使用 JAAS,我已经很好地设置了用户和密码)和基于角色的
我们有一个管理站点,需要身份验证才能访问。站点上的页面包裹在 Coldfusion 自定义标签中,其中包括所有样式和 JS,以及一些其他信息。 我最近制作了一份自定义标签包装器的副本。我将副本放在与原
我是一名优秀的程序员,十分优秀!