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

https://auth0.com

Auth0是一家"身份验证即服务"提供商,旨在为开发人员提供简单易用的身份管理服务。为了保持灵活性和可扩展性,Auth0身份管理平台允许开发人员在身份验证和授权管道中增加自定义代码。而在一个多租户环境中,为了保证不同用户的自定义代码可以互不影响,就需要一种技术提供必要的数据隔离和资源利用保障。

步骤

注册一个auth0账号

登录https://manage.auth0.com/#/

新建一个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)的更多相关文章

  1. HTML5手机APP开发入(4)

    HTML5手机APP开发入(4) 课程内容 完成一个自定义的Component用来展现通讯录用户的明细信息如下图 http://bootsnipp.com/snippets/featured/prof ...

  2. HTML5手机APP开发入(3)

    HTML5手机APP开发入(3) 课程内容: 按照AngularJs MVC框架进行代码重构,新建一个DataService服务类使用SQLite插件实现储存对通讯录的本地存储. 涉及的知识点: An ...

  3. HTML5手机APP开发入门(2)

    HTML5手机APP开发入门(2) 课程内容 使用IonicFramework v2 + angular 2 完成一个简单的联系人列表的操作,有三个页面: ListPage,DetailPage,Ad ...

  4. HTML5手机APP开发入门(1)

    HTML5手机APP开发入门(1) 开发框架 Ionicframework V2 + Angular 2 具体内容可以参考一下网站 http://ionicframework.net/ http:// ...

  5. [转帖]H5 手机 App 开发入门:技术篇

    H5 手机 App 开发入门:技术篇   http://www.ruanyifeng.com/blog/2019/12/mobile-app-technology-stack.html 阮一峰老师的文 ...

  6. 【转帖】H5 手机 App 开发入门:概念篇

    H5 手机 App 开发入门:概念篇 http://www.ruanyifeng.com/blog/2019/12/hybrid-app-concepts.html 作者: 阮一峰 日期: 2019年 ...

  7. 手机app开发:浅谈APP登录方式的优劣

    手机app开发公司亿合科技要是给你一个机会设计一款APP,你会用什么方式做这个APP的登录模块?根据APP的业务模型的不同会有不同的设计方法.如果是偏内容型的APP,需要优先展示内容给用户,当用户需要 ...

  8. 未来一年的13大手机APP开发趋势

    无论是欢呼出租车,保存票据,订购披萨还是在线购物,您可以立即联系到什么设备?你的智能手机 这是您需要的朋友,在如何查找信息和简化日常任务方面发挥着不可或缺的作用. 移动技术以光速增长; 我们不能否认手 ...

  9. 示例浅谈PHP与手机APP开发,即API接口开发

    示例浅谈PHP与手机APP开发,即API接口开发 API(Application Programming Interface,应用程序接口)架构,已经成为目前互联网产品开发中常见的软件架构模式,并且诞 ...

随机推荐

  1. [转载]提高rails new时bundle install运行速度

    最近在新建rails项目时,rails new老是卡在bundle install那里,少则五分钟,多则几十分.这是因为rails new时自动会运行bundle install,而bundle in ...

  2. three.js 源码注释(四十四)Light/DirectionalLight.js

    /** * * DirectionalLight方法 根据设置灯光的颜属性color, 强度属性intensity创建平行光光源. * DirectionalLight 对象的功能函数采用定义构造的函 ...

  3. mui学习笔记

    一.页面刷新问题 1.父页面A跳转到子页面B,B页面修改数据后再跳回A页面,刷新A页面数据 (1).父页面A代码 window.addEventListener("pageflowrefre ...

  4. Mysql基础3

    一.客户管理系统CRUD二.大数据分页web页面1.MySQL:分页语句limitSELECT * FROM customer LIMIT m,n;m:代表开始记录的索引.从0开始n:一次取多少条 每 ...

  5. IOS-synthesize和dynamic的异同(转)

    一,retain, copy, assign区别 1. 假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b.此时a ...

  6. Linq to sql 语法方法示例

    联表查询,判断追加条件,对集合分页 ) { var data = from m in _db.AppArticleComment join o in _db.AppArticle on m.Artic ...

  7. 自己写ORM框架 SqlHelper_DG C#(java的写在链接里)

    ORM框架想必大家都比较熟知了,即对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同 ...

  8. C语言和Lua的交互

    //test.c #include <stdio.h> #include "lua.h" #include "lualib.h" #include ...

  9. Linux ubuntu 10.10安装OpenCv

    在windows系统下已经成功做出了一个打开摄像头并检测人脸的小程序了. 开始转战linux,因为最终目标是将程序移植到嵌入式开发板上面. 但是,问题接踵而至~ 首先linux上面要安装OpenCv, ...

  10. 6.5 为什么Android用Java不用c实现?

    C/C++过于底层,开发者要花很多的经历对C/C++的语言研究清楚,例如C/C++的内存机制,如果稍不注意,就会忘了开启或者释放.而Java的GC会自动处理这些,省去了很多的时间让开发者专注于自己的业 ...