OIDC in Angular 6
参照 草根专栏- ASP.NET Core + Ng6 实战:https://v.qq.com/x/page/i07702h18nz.html
1、 OIDC-Client
https://github.com/IdentityModel/oidc-client-js
npm install oidc-client --save
2、建立 open-id-connect.service.ts
ng g s shared/oidc/openIdConnect
3、 environment,配置oidc客户端
export const environment = {
production: false ,
apiUrlBase: '/api',
openIdConnectSettings: {
authority: 'https://localhost:5001/',
client_id: 'blog-client',
redirect_uri: 'http://localhost:4200/signin-oidc',
scope: 'openid profile email restapi',
response_type: 'id_token token',
post_logout_redirect_uri: 'http://localhost:4200/',
automaticSilentRenew: true,
silent_redirect_uri: 'http://localhost:4200/redirect-silentrenew'
}
};
4、BlogIdp项目,config.cs 文件配置客户端访问:
// Angular client using implicit flow
new Client
{
ClientId = "blog-client",
ClientName = "Blog Client",
ClientUri = "http://localhost:4200", AllowedGrantTypes = GrantTypes.Implicit,
AllowAccessTokensViaBrowser = true,
RequireConsent = false,
AccessTokenLifetime = , RedirectUris =
{
"http://localhost:4200/signin-oidc",
"http://localhost:4200/redirect-silentrenew"
}, PostLogoutRedirectUris = { "http://localhost:4200/" },
AllowedCorsOrigins = { "http://localhost:4200" }, AllowedScopes = {
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
IdentityServerConstants.StandardScopes.Email,
"restapi" }
}
5、Blogidp项目配置跨域:
services.AddCors(options =>
{
options.AddPolicy("AngularDev", policy =>
{
policy.WithOrigins("http://localhost:4200")
.AllowAnyHeader()
.AllowAnyMethod();
});
});
public void Configure(IApplicationBuilder app)
{ app.UseCors(); }
6、open-id-connect.service.ts 添加登陆操作:
import { Injectable } from '@angular/core';
import { UserManager, User } from 'oidc-client';
import { environment } from '../../../environments/environment';
import { ReplaySubject } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class OpenIdConnectService {
private userManager: UserManager = new UserManager(environment.openIdConnectSettings);
private currentUser: User;
userLoaded$ = new ReplaySubject<boolean>();
get userAvailable(): boolean {
return this.currentUser != null;
}
get user(): User {
return this.currentUser;
}
constructor() {
this.userManager.clearStaleState();
this.userManager.events.addUserLoaded(user => {
if (!environment.production) {
console.log('User loaded.', user);
}
this.currentUser = user;
this.userLoaded$.next(true);
});
this.userManager.events.addUserUnloaded((e) => {
if (!environment.production) {
console.log('User unloaded');
}
this.currentUser = null;
this.userLoaded$.next(false);
});
}
triggerSignIn() {
this.userManager.signinRedirect().then(() => {
if (!environment.production) {
console.log('Redirection to signin triggered.');
}
});
}
handleCallback() {
this.userManager.signinRedirectCallback().then(user => {
if (!environment.production) {
console.log('Callback after signin handled.', user);
}
});
}
handleSilentCallback() {
this.userManager.signinSilentCallback().then(user => {
this.currentUser = user;
if (!environment.production) {
console.log('Callback after silent signin handled.', user);
}
});
}
triggerSignOut() {
this.userManager.signoutRedirect().then(resp => {
if (!environment.production) {
console.log('Redirection to sign out triggered.', resp);
}
});
}
}
7、添加 signin-oidc component
8、添加 redirect-silent-renew component
9、 ng g guard shared/oidc/RequireAuthenticatedUserRoute --spec false
触发登陆界面;
app.module Provided 添加 RequireAuthenticatedUserRouteGuard , OpenIdConnectService
10、blog-routing.module.ts 注册路由:
const routes: Routes = [
{
path: '', component: BlogAppComponent,
children : [
{path: 'post-list' , component: PostListComponent, canActivate: [RequireAuthenticatedUserRouteGuard] },
{path: '**' , redirectTo: 'post-list' }
]
}
11、配置登陆路由: app.module
const routers: Routes = [
{ path: 'blog', loadChildren: './blog/blog.module#BlogModule' },
{ path: 'signin-oidc', component: SigninOidcComponent },
{ path: 'redirect-silentrenew', component: RedirectSilentRenewComponent },
{ path: '**', redirectTo: 'blog' }
];
12、添加拦截器:authorization-header-interceptor.interceptor.ts ,在blog.module.ts 里面配置
providers: [
PostService,
{
provide: HTTP_INTERCEPTORS,
useClass: AuthorizationHeaderInterceptor,
multi: true
}
]
OIDC in Angular 6的更多相关文章
- [OIDC in Action] 2. 基于OIDC(OpenID Connect)的SSO(纯JS客户端)
在上一篇基于OIDC的SSO的中涉及到了4个Web站点: oidc-server.dev:利用oidc实现的统一认证和授权中心,SSO站点. oidc-client-hybrid.dev:oidc的一 ...
- angular 接入 IdentityServer4
angular 接入 IdentityServer4 Intro 最近把活动室预约的项目做了一个升级,预约活动室需要登录才能预约,并用 IdentityServer4 做了一个统一的登录注册中心,这样 ...
- Angular杂谈系列1-如何在Angular2中使用jQuery及其插件
jQuery,让我们对dom的操作更加便捷.由于其易用性和可扩展性,jQuer也迅速风靡全球,各种插件也是目不暇接. 我相信很多人并不能直接远离jQuery去做前端,因为它太好用了,我们以前做的东西大 ...
- Angular企业级开发(5)-项目框架搭建
1.AngularJS Seed项目目录结构 AngularJS官方网站提供了一个angular-phonecat项目,另外一个就是Angular-Seed项目.所以大多数团队会基于Angular-S ...
- TypeScript: Angular 2 的秘密武器(译)
本文整理自Dan Wahlin在ng-conf上的talk.原视频地址: https://www.youtube.com/watch?v=e3djIqAGqZo 开场白 开场白主要分为三部分: 感谢了 ...
- angular实现统一的消息服务
后台API返回的消息怎么显示更优雅,怎么处理才更简洁?看看这个效果怎么样? 自定义指令和服务实现 自定义指令和服务实现消息自动显示在页面的顶部,3秒之后消失 1. 显示消息 这种显示消息的方式是不是有 ...
- div实现自适应高度的textarea,实现angular双向绑定
相信不少同学模拟过腾讯的QQ做一个聊天应用,至少我是其中一个. 过程中我遇到的一个问题就是QQ输入框,自适应高度,最高高度为3row. 如果你也像我一样打算使用textarea,那么很抱歉,你一开始就 ...
- Angular企业级开发-AngularJS1.x学习路径
博客目录 有链接的表明已经完成了,其他的正在建设中. 1.AngularJS简介 2.搭建Angular开发环境 3.Angular MVC实现 4.[Angular项目目录结构] 5.[SPA介绍] ...
- Angular企业级开发(4)-ngResource和REST介绍
一.RESTful介绍 RESTful维基百科 REST(表征性状态传输,Representational State Transfer)是Roy Fielding博士在2000年他的博士论文中提出来 ...
随机推荐
- HDU 2897 邂逅明下 ( bash 博弈变形
HDU 2897 邂逅明下 ( bash 博弈变形 题目大意 有三个数字n,p,q,表示一堆硬币一共有n枚,从这个硬币堆里取硬币,一次最少取p枚,最多q枚,如果剩下少于p枚就要一次取完.两人轮流取,直 ...
- one or more listeners failed to start问题解决思路
今日搭建一个web应用的时候总是遇到tomcat报错:one or more listeners failed to start. Full detail balabale....而且还没有其他提示, ...
- 个人开源Git地址
开源Git地址 序号 Git地址 描述 1 https://github.com/winds-june 各种源码.直接调用的jar包 2
- 关于ORA-00257: archiver error. Connect internal only, until freed 错误的处理方法
转 关于ORA-00257: archiver error. Connect internal only, until freed 错误的处理方法 2016年03月31日 10:14:59 阅读数:1 ...
- CentOS7 yum命令
1.yum 清理缓存 [hado@localhost /]# yum clean all [hado@localhost /]# rm -rf /var/cache/yum/*
- AJAX 动态加载后台数据 绑定select
<select id="select"> <!--下拉框数据动态加载--> </select> js:(使用jquery) $(document ...
- 【Hadoop故障处理】高可用(HA)环境DataNode问题
[故障背景] NameNode和DataNode进程正常运行,但是网页找不到DataNode,DataNode为空.各个节点机器之间可以ping同主机名. [日志排查] 众多日志中找到如下关键点错误信 ...
- Oracle_11g桌面版 中解决被锁定的scott 教学数据库的方法
Oracle 11g中修改被锁定的用户:scott 在安装完Oracle10g和创建完oracle数据库之后,想用数据库自带的用户scott登录,看看连接是否成功. 在cmd命令中,用“sqlplus ...
- Hadoop-Hive学习笔记(2)
1.Hive基本操作 #创建数据库hive>create database name;#创建新表hive> create table students(id int,name string ...
- python3 练习题100例 (四)
题目四:输入某年某月某日,判断这一天是这一年的第几天? #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 题目四:输入 ...