HTML5手机APP开发入(5)
HTML5手机APP开发入(5)
回顾一下
HTML5手机APP开发入(4)
如何自定义Component,directive
HTML5手机APP开发入(3) 如何实现MVC的代码重构,自定义一个Provider Service,Injectable 依赖注入
HTML5手机APP开发入门(2)
利用ionic2 向导生成一个项目并开发一个简单的通讯录的APP
HTML5手机APP开发入门(1) ionic2+angular2 开发环境的配置
内容
完成一个登录验证的功能
这里我要向大家介绍一个第三方提供登录验证的云解决方案的,非常专业。并且支持Angular 2
Auth0是一家"身份验证即服务"提供商,旨在为开发人员提供简单易用的身份管理服务。为了保持灵活性和可扩展性,Auth0身份管理平台允许开发人员在身份验证和授权管道中增加自定义代码。而在一个多租户环境中,为了保证不同用户的自定义代码可以互不影响,就需要一种技术提供必要的数据隔离和资源利用保障。

步骤
注册一个auth0账号
新建一个application,这里需要做一些简单的配置

Allowed Callback URLs 设定你测试的客户端域名的url
配置auth0 客户端
Auth0提供了不同环境的Quick Start,我这边的环境就是ionic 2 + Angular 2

基本上一步一步照着做不会有问题。
1. Add the Auth0 Scripts and Install angular2-jwt
Install angular2-jwt with npm.

Add Lock in your index.html file and set the viewport.

添加javascript引用
2.修改app.ts
这里需要把用到类库angular2-jwt引用到项目中。同时还需要把Http也要加进来

注意:
providers:[DataService,
provide(AuthHttp, {
useFactory: (http) => {
return new AuthHttp(new AuthConfig({noJwtError: true}), http);
},
deps: [Http]
}),
AuthService],
3.新建一个authService用来实现登录验证
添加这些基础代码Quick Start都有提供照抄就可以了


Auth0提供很多自定开发功能,等有时间了慢慢研究,这里我们先简单的实现吧登录成功后把用户信息保存到本地,这样下次就可以不用在登录了
import {Storage, LocalStorage} from 'ionic-angular';
import {HTTP_PROVIDERS, Http} from 'angular2/http';
import {Type} from 'angular2/core';
import {AuthHttp, JwtHelper, tokenNotExpired,AuthConfig} from 'angular2-jwt';
import {Injectable} from 'angular2/core';
import {Observable} from 'rxjs/Rx';
// Avoid name not found warnings
declare var Auth0Lock;
@Injectable()
export class AuthService {
jwtHelper: JwtHelper = new JwtHelper();
lock = new Auth0Lock('05VEtQMpSej5rgSgKor4XsaMaCJm8hLa', 'app1001.auth0.com');
local: Storage = new Storage(LocalStorage);
refreshSubscription: any;
user: Object;
constructor(private authHttp: AuthHttp) {
// If there is a profile saved in local storage
this.local.get('profile').then((profile)=>{
if (profile) {
this.user = JSON.parse(profile);
}
});
//let profile = this.local.get('profile').map();
// if (profile) {
// this.user = JSON.parse(profile);
// }
}
public authenticated() {
// Check if there's an unexpired JWT
return tokenNotExpired();
}
public login() {
// Show the Auth0 Lock widget
this.lock.show({
closable: false,
authParams: {
scope: 'openid offline_access',
device: 'Mobile device'
}
}, (err, profile, token, accessToken, state, refreshToken) => {
if (err) {
alert(err);
}
// If authentication is successful, save the items
// in local storage
this.local.set('profile', JSON.stringify(profile));
this.local.set('id_token', token);
this.local.set('refresh_token', refreshToken);
this.user = profile;
// Schedule a token refresh
this.scheduleRefresh();
});
}
public logout() {
this.local.remove('profile');
this.local.remove('id_token');
this.local.remove('refresh_token');
this.user = null;
// Unschedule the token refresh
this.unscheduleRefresh();
}
public scheduleRefresh() {
this.authHttp.tokenStream
// .flatMap(token=>{
// let jwtIat = this.jwtHelper.decodeToken(token).iat;
// let jwtExp = this.jwtHelper.decodeToken(token).exp;
// let iat = new Date(0);
// let exp = new Date(0);
//
// let delay = (exp.setUTCSeconds(jwtExp) - iat.setUTCSeconds(jwtIat));
// return Observable.interval(delay);
// })
.subscribe(
data => {
console.log(data)
this.getNewJwt();
},
err => console.log(err),
() => console.log('Complete')
);
// If the user is authenticated, use the token stream
// provided by angular2-jwt and flatMap the token
// let source = this.authHttp.tokenStream.flatMap(
// token => {
// // The delay to generate in this case is the difference
// // between the expiry time and the issued at time
// let jwtIat = this.jwtHelper.decodeToken(token).iat;
// let jwtExp = this.jwtHelper.decodeToken(token).exp;
// let iat = new Date(0);
// let exp = new Date(0);
//
// let delay = (exp.setUTCSeconds(jwtExp) - iat.setUTCSeconds(jwtIat));
//
// return Observable.interval(delay);
// });
//
// this.refreshSubscription = source.subscribe(() => {
// this.getNewJwt();
// });
}
public startupTokenRefresh() {
// If the user is authenticated, use the token stream
// provided by angular2-jwt and flatMap the token
// if (this.authenticated()) {
// let source = this.authHttp.tokenStream.flatMap(
// token => {
// // Get the expiry time to generate
// // a delay in milliseconds
// let now: number = new Date().valueOf();
// let jwtExp: number = this.jwtHelper.decodeToken(token).exp;
// let exp: Date = new Date(0);
// exp.setUTCSeconds(jwtExp);
// let delay: number = exp.valueOf() - now;
//
// // Use the delay in a timer to
// // run the refresh at the proper time
// return Observable.timer(delay);
// });
//
// // Once the delay time from above is
// // reached, get a new JWT and schedule
// // additional refreshes
// source.subscribe(() => {
// this.getNewJwt();
// this.scheduleRefresh();
// });
// }
}
public unscheduleRefresh() {
// Unsubscribe fromt the refresh
if (this.refreshSubscription) {
this.refreshSubscription.unsubscribe();
}
}
public getNewJwt() {
this.local.get('refresh_token').then(token=>{
this.lock.getClient().refreshToken(token,(err, delegationRequest) => {
if (err) {
alert(err);
}
console.log(delegationRequest);
this.local.set('id_token', delegationRequest.id_token);
});
});
// Get a new JWT from Auth0 using the refresh token saved
// in local storage
// let refreshToken = this.local.get('refresh_token')._result;
// this.lock.getClient().refreshToken(refreshToken, (err, delegationRequest) => {
// if (err) {
// alert(err);
// }
// this.local.set('id_token', delegationRequest.id_token);
// });
}
}
4.修改app.ts 实现登录后才能访问

如果没有登录就显示登录页面,而这登录页面auth0 都有模板不需要另外开发
import {App, Platform,Storage, SqlStorage} from 'ionic-angular';
import {StatusBar} from 'ionic-native';
import {ListPage} from './pages/home/list';
import {DataService} from './pages/services/dataService';
import {tokenNotExpired, JwtHelper,AuthHttp, AuthConfig} from 'angular2-jwt';
import {provide} from 'angular2/core';
import {HTTP_PROVIDERS, Http} from 'angular2/http';
import {Type} from 'angular2/core';
import {AuthService} from './pages/services/auth';
declare var Auth0Lock;
@App({
template: '<ion-nav [root]="rootPage"></ion-nav>',
providers:[DataService,
provide(AuthHttp, {
useFactory: (http) => {
return new AuthHttp(new AuthConfig({noJwtError: true}), http);
},
deps: [Http]
}),
AuthService],
config: {} // http://ionicframework.com/docs/v2/api/config/Config/
})
export class MyApp {
rootPage: any = ListPage;
//lock = new Auth0Lock('T1wdQrDposGW5BisaKViC0Cu9CuxtR0c', 'towfeek.eu.auth0.com');
//jwtHelper: JwtHelper = new JwtHelper();
//location: Location;
constructor(platform: Platform,private authService:AuthService) {
//var self = this;
platform.ready().then(() => {
// Okay, so the platform is ready and our plugins are available.
// Here you can do any higher level native things you might need.
StatusBar.styleDefault();
if(authService.authenticated()){
this.authService.login();
}
// this.lock.show((err: string, profile: string, id_token: string) => {
// if (err) {
// throw new Error(err);
// }
//
// localStorage.setItem('profile', JSON.stringify(profile));
// localStorage.setItem('id_token', id_token);
//
// console.log(
// this.jwtHelper.decodeToken(id_token),
// this.jwtHelper.getTokenExpirationDate(id_token),
// this.jwtHelper.isTokenExpired(id_token)
// );
//});
});
}
}
5.RUN Test

当你运行app的时候系统就第一时间弹出登录页面,同时还有注册功能。是不是省了不少工作量
下次准备内容
打算在通讯录里调用一些手机的功能如何利用cordova-plugin-camera 调用拍照功能,利用cordova-plugin-geolocation实现定位.
HTML5手机APP开发入(5)的更多相关文章
- HTML5手机APP开发入(4)
HTML5手机APP开发入(4) 课程内容 完成一个自定义的Component用来展现通讯录用户的明细信息如下图 http://bootsnipp.com/snippets/featured/prof ...
- HTML5手机APP开发入(3)
HTML5手机APP开发入(3) 课程内容: 按照AngularJs MVC框架进行代码重构,新建一个DataService服务类使用SQLite插件实现储存对通讯录的本地存储. 涉及的知识点: An ...
- HTML5手机APP开发入门(2)
HTML5手机APP开发入门(2) 课程内容 使用IonicFramework v2 + angular 2 完成一个简单的联系人列表的操作,有三个页面: ListPage,DetailPage,Ad ...
- HTML5手机APP开发入门(1)
HTML5手机APP开发入门(1) 开发框架 Ionicframework V2 + Angular 2 具体内容可以参考一下网站 http://ionicframework.net/ http:// ...
- [转帖]H5 手机 App 开发入门:技术篇
H5 手机 App 开发入门:技术篇 http://www.ruanyifeng.com/blog/2019/12/mobile-app-technology-stack.html 阮一峰老师的文 ...
- 【转帖】H5 手机 App 开发入门:概念篇
H5 手机 App 开发入门:概念篇 http://www.ruanyifeng.com/blog/2019/12/hybrid-app-concepts.html 作者: 阮一峰 日期: 2019年 ...
- 手机app开发:浅谈APP登录方式的优劣
手机app开发公司亿合科技要是给你一个机会设计一款APP,你会用什么方式做这个APP的登录模块?根据APP的业务模型的不同会有不同的设计方法.如果是偏内容型的APP,需要优先展示内容给用户,当用户需要 ...
- 未来一年的13大手机APP开发趋势
无论是欢呼出租车,保存票据,订购披萨还是在线购物,您可以立即联系到什么设备?你的智能手机 这是您需要的朋友,在如何查找信息和简化日常任务方面发挥着不可或缺的作用. 移动技术以光速增长; 我们不能否认手 ...
- 示例浅谈PHP与手机APP开发,即API接口开发
示例浅谈PHP与手机APP开发,即API接口开发 API(Application Programming Interface,应用程序接口)架构,已经成为目前互联网产品开发中常见的软件架构模式,并且诞 ...
随机推荐
- POJ 2983 Is the Information Reliable? 差分约束
裸差分约束. //#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #i ...
- [python] 线程锁
参考:http://blog.csdn.net/kobeyan/article/details/44039831 1. 锁的概念 在python中,存在GIL,也就是全局解释器锁,能够保证同一时刻只有 ...
- 按enter执行click或者搜索问题
最近需要将按按钮搜索的功能,改为支持按enter回车键,搜索. 实现按enter,执行click事件还是比较简单的. //按回车搜索用户 $(window).keydown(function (eve ...
- Oracle primary,unique,foreign 区别,Hibernate 关联映射
Oracle primary,unique,foreign 区别 转:http://www.cnblogs.com/henw/archive/2012/08/15/2639510.html NOT N ...
- 使用jquery的trigger方法优化页面代码
我们做页面级联的时候经常会用到ajax处理数据,会为下拉菜单编写change事件. //城市和区域联动 $("#City").change(function () { var ci ...
- discuz数据库表
http://faq.comsenz.com/library/database/x3/x3_index.htm discuz数据库表字典 Discuz X3各数据库表用途 pre_common_ ...
- Gerrit的使用
为什么要使用Gerrit? 最先接触Gerrit时是Android开发过程中,提交代码给负责人审核时,用到的一款软件.它就是一款代码审核的工具.(向Git代码库推送push代码时,必须要经过Gerri ...
- onSaveInstanceState & onRestoreInstanceState
一.onSaveInstanceState Called to retrieve per-instance state from an activity before being killed so ...
- CLR内存管理
CLR管理内存的区域,主要有三块,分别为: 1.线程的堆栈:(在程序应该编译过程为值类型实例分配好内存) 用于分配值类型实例.堆栈主要由操作系统管理,而不受垃圾收集器的控制,当值类型实例所在方法结束时 ...
- Android的项目不能直接引用可移植类库的项目解决方法
深圳_exception() 10:25:51 Android的项目不能直接引用可移植类库的项目,但是可以引用可移植类库生成的dll,这就意味着无法直接断电调试可移植类库上海-黄药师() 10:26: ...