NodeJS应用+OAuth2+OpenAM
0 182

本主题所说明的是如何在NodeJS服务器程序中通过连接到OpenAM服务器实现OAuth2/OpenID Connect认证。

  • Node.js 0.10.22~
  • Express 4.0~
  • passport 0.2.1~
  • express-generator

在OpenAM服务器上为NodeJS服务器应用创建一个客户。

  • clientID(name) : localhost
  • clientSecret(password):test
  • callbackURL:http://localhost:3000/oauth2callback

创建方法请参照OpenAM单点登录系统搭建(OAuth2认证篇)

准备

创建一个express应用程序框架

express openam-connect
cd openam-connect

在package.json加入以下库

    "passport": "*",
    "passport-openidconnect": "*",
    "express-session": "*"

安装所需要的库

npm install

修改app.js

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var routes = require('./routes/index');
var users = require('./routes/users');
var app = express();
var passport = require('passport');
var session = require('express-session');
var OpenidConnectStrategy = require('passport-openidconnect').Strategy;
app.use(passport.initialize());
app.use(passport.session());
passport.use(new OpenidConnectStrategy({
    authorizationURL: "http://passport.utilhub.dt.hudaokeji.com/openam/oauth2/authorize",
    tokenURL: "http://passport.utilhub.dt.hudaokeji.com/openam/oauth2/access_token",
    userInfoURL: "http://passport.utilhub.dt.hudaokeji.com/openam/oauth2/userinfo",
    clientID: "localhost",
    clientSecret: "test",
    callbackURL: "http://localhost:3000/oauth2callback",
    scope: ["openid"]
}, function(accessToken, refreshToken, profile, done) {
    console.log('accessToken: ', accessToken);
    console.log('refreshToken: ', refreshToken);
    console.log('profile: ', profile);
    return done(null, profile);
}));
app.get('/auth/passport-utilhub-dt', passport.authenticate('openidconnect'));
app.get('/oauth2callback', passport.authenticate('openidconnect', {
    failureRedirect: '/login'
}), function(req, res) {
    // Successful authentication, redirect home.
    res.redirect('/');
});
passport.serializeUser(function(user, done){
    done(null, user);
});
passport.deserializeUser(function(obj, done){
    done(null, obj);
});
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
// uncomment after placing your favicon in /public
//app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', routes);
app.use('/users', users);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});
// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: {}
  });
});
module.exports = app;

修改./views/index.jade

extends layout
block content
  h1= title
  p Welcome to #{title}
  a(href="/auth/passport-utilhub-dt") Sign In with OpenAM

启动NodeJS应用

  • Windows下
    node ./bin/www
  • Linux下
    ./bin/www

浏览器访问

http://localhost:3000

0 182
() 全部评论
所有回复 (0)

推荐总结

  • OpenAM 168 0 1 发布
    安装OS

    OpenAM是一个纯JAVA的WEB应用程序产品,可以运行在Windows,Linux,MacOS等各种操作系统上面。

    示范安装我们选择Windows。

    安装JDK

    OpenAM需要运行在JDK6之上。

    示范安装我们选择jdk7。

    安装Tomcat

    OpenAM可以运行在任意JavaEE服务器上

    示范安装我们选择Tomcat8。 OpenAM运行需要1GB的Heap领域和256MB的permanent领域。如下修改bin/catalina.bat文件。

    set CATALINA_OPTS=“-server -Xmx1024m -Xms512m -Xss512k -XX:MaxPermSize=256m”

    OpenAM应用的安装

    OpenAM是以WEB应用(WAR文件)的形式发布的,下载该WAR文件发布到服务器上即可。

    示范安装我们选择OpenAM-12.0.0.war. 2015年6月15日时间点,最新版本的13.0里存在程序BUG,导致Openid Connect不能正常动作。

    设置浏览器页面语言

    OpenAM根据浏览器设定的网页语言优先顺序自动切换语言。所以我们必须更改浏览器的设定才能得到我们所希望的语言显示。 下面是Chrome浏览器的网页显示语言设置。

    初期设定

    选择配置选项

    从客户端浏览器访问http://xxxxx/openam,将出现以下画面,选择【创建新设定】


    步骤1:一般 (设定管理员用户密码)



    步骤2:服务器设定 (设置服务器URL,Cookie域名等。)



    步骤3:设定数据存储 (选择OpenAM。)


    步骤4:设定用户数据存储 (选择OpenAM。)


    步骤5:设定站点  (选择No)


    步骤6:设定缺省的Policy用户 输入缺省的Policy用户用户密码

    完成  点击设定创建按钮。

    系统开始创建设定,并显示进度画面

    这个过程将持续较长时间,完成以后将显示以下画面。


    点击登陆按钮,即进入登录画面



    与Apache集成

    因为Cookie域名的关系,OpenAM与mod_proxy_http不能很好的协同工作 可以使用mod_proxy_ajp,openam 12.0 的ajp端口缺省是8009。

    下面是Apache里映射设定的一个范例

    <VirtualHost *:80> ServerAdmin postmaster@dummy-host2.localhost ServerName xxxx.com ServerAlias xxxx.com ProxyRequests Off <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass / ajp://localhost:8009/ <Location /> Order allow,deny Allow from all </Location> ErrorLog "logs/xxxx-error.log" CustomLog "logs/xxxx-access.log" combined  </VirtualHost>
  • OpenAM 262 0 1 发布

    本文说明的是如何以PolicyAgent方式搭建基于OpenAM的单点登录系统。

    基本机制

    Policy Agent方法通过在运行应用程序的服务器上安装Policy Agent,监视HTTP通信来实现。

    (体系结构)


    (处理流程)

    The web client requests access to a protected resource.The web server runs the request through the policy agent that protects the resource according to OpenAM policy. The policy agent acts to enforce policy, whereas the policy configuration and decisions are handled by OpenAM.The policy agent communicates with OpenAM to get the policy decision to enforce.For a resource to which OpenAM approves access, the policy agent allows access.The web server returns the requested access to the web client创建和设置Agent

    以管理员身份登录OpenAM

    (选择Realm)

    点击Access Control

    选择已有或创建新的Realm,这里选择缺省存在的Top Level Realm

    (创建Agent)

    选择Agent页

    在Web页里点击New按钮,创建新的WebAgent

    属于Agent信息,包括名字,密码,OpenAM服务器的URL,应用程序的URL

    点击Save按钮,保存Agent

    (设置SSO Only Mode)

    (配置Cookie)

    (配置跨域认证)



    安装Web服务器端代理

    (安装Apache)

    选择XAMPP安装版 XAMPP for Windows 5.6.11 (Apache版本:2.4)

    127.0.0.1 apache-pa-test.local.com


    (安装OpenAM-Agent)

    下载OpenAM-Agent

    (Agent设定)






    动作确认







  • OpenAM 273 0 1 发布

    本文说明的是如何将OpenAM作为OAuth2认证服务器,包括如何配置OAuth2服务和如何创建OAuth2客户端。

    配置OAuth2服务

    以管理员身份登录OpenAM

    (创建服务器设置)

    点击【Config OAuth2/OpenID Connect】按钮

    适当延长Token的有效期限,点击【Create】按钮

    设置创建成功


    (动作确认)

    OpenAM的OAuth服务器の各Endpoint可通过访问以下的URL获得。

    {OpenAM的URL}/.well-known/openid-configuration

    { response_types_supported: [ token id_token ,code token ,code token id_token ,token ,code id_token ,code ,id_token ] ,registration_endpoint: http://passport.utilhub.dt.hudaokeji.com/openam/oauth2/connect/register (string) ,token_endpoint: http://passport.utilhub.dt.hudaokeji.com/openam/oauth2/access_token (string) ,end_session_endpoint: http://passport.utilhub.dt.hudaokeji.com/openam/oauth2/connect/endSession (string) ,version: 3.0 (string) ,userinfo_endpoint: http://passport.utilhub.dt.hudaokeji.com/openam/oauth2/userinfo (string) ,subject_types_supported: [ public ] ,issuer: http://passport.utilhub.dt.hudaokeji.com/openam (string) ,jwks_uri: http://passport.utilhub.dt.hudaokeji.com/openam/oauth2/connect/jwk_uri (string) ,id_token_signing_alg_values_supported: [ HS256 ,HS512 ,RS256 ,HS384 ] ,check_session_iframe: http://passport.utilhub.dt.hudaokeji.com/openam/oauth2/connect/checkSession (string) ,claims_supported: [ phone ,email ,address ,openid ,profile ] ,authorization_endpoint: http://passport.utilhub.dt.hudaokeji.com/openam/oauth2/authorize (string)  } 创建OAuth2客户端

    以管理员身份登陆openAM

    (新建OAuth2客户端)

    进入【Access Control】→ 【(Top Level Realm)】 → 【Agent】 → 【OAuth 2.0/OpenID Connect Client】,点击【Agent–>New】

    输入Name和Password(这里的Name和Password分别等同于Client ID 和 Client Secret),点击【Create】

    创建成功

    点击创建好的OAuth2/OpenID Connect客户端,进入OAuth2客户端详细设置画面。

    (配置OAuth2客户端)

    输入回调URL


    指定Scope

    指定显示名和描述,这些信息将作为提示信息在用户登录的时候被显示

    指定Default Scope

    (其他)

    第三方用户需要为自己的应用服务登录OAUth2客户端时,可使用以下URL。

    {OpenAM的URL}/oauth2/registerClient.jsp

热门总结

  • HTML5 17072 0 1 发布

    本目录收录的是电子邮件相关的应用软件。


    定义

    电子邮件(Email)又称电子邮箱,简称电邮,是指一种由一寄件人将数字信息发送给一个人或多个人的信息交换方式,目的是达成发信人和收信人之间的信息交互。

    电子邮件系统是以存储与转发的模型为基础,邮件服务器接受、转发、提交及存储邮件。寄信人、收信人及他们的电脑都不用同时在线。寄信人和收信人只需在寄信或收信时简短的连接到邮件服务器即可。

    范围

    本目录收录的软件仅限于以电子邮件为主要功能(或之一)的应用软件。

    列表

    本目录收录了以下软件:

     RainLoop

    简单的、 现代的 & 快速、 基于 WEB 的电子邮件客户端。

    以下是 RainLoop 各相关链接及授权信息的介绍:

    官网(HP)
    https://www.rainloop.net/源代码(Source)
    https://github.com/RainLoop/rainloop-webmail授权(License)
    AGPL 3.0范例(Example)
    https://mail.rainloop.net/#/mailbox/INBOX

  • HTML5 16665 0 1 发布

    本目录收录的是即时通信相关的应用软件。

     定义

    即时通信(Instant Messaging,IM)是一种通过网络进行实时通信的系统,允许两人或多人使用网络即时的传递文字消息、文件、语音与视频交流。

    即时通信不同于电子邮件在于它的交谈是即时(实时)的。大部分的即时通信服务提供了状态信息的特性──显示联系人名单,联系人是否在在线与能否与联系人交谈等等。

    范围

    本目录收录的软件仅限于以即时通信为主要功能(或之一)的应用软件。

    列表

    本目录收录了以下软件:

    CandyConverse.jsKaiwaRocket.Chat

    Candy

    Candy是一个支持XMPP协议的多用户即时聊天客户端软件。

    以下是 Candy 各相关链接及授权信息的介绍:

    官网(HP)
    http://candy-chat.github.io/candy源代码(Source)
    https://github.com/candy-chat/candy授权(License)
    MIT范例(Example)

    Converse.js

    Converse.js是一个支持XMPP/JABB的多用户即时聊天客户端软件。

    以下是 Converse.js各相关链接及授权信息的介绍:

    官网(HP)
    http://conversejs.org源代码(Source)
    https://github.com/jcbrand/converse.js授权(License)
    MPL范例(Example)
    https://conversejs.org/demo/anonymous.html

    Kaiwa

    Kaiwa 是一个支持XMPP的即时聊天客户端软件。

    以下是 Kaiwa 各相关链接及授权信息的介绍:

    官网(HP)
    http://getkaiwa.com源代码(Source)
    https://github.com/digicoop/kaiwa授权(License)
    MPL范例(Example)

    Rocket.Chat

    WebChat平台。

    以下是 Rocket.Chat 各相关链接及授权信息的介绍:

    官网(HP)
    https://rocket.chat/源代码(Source)
    https://github.com/RocketChat/Rocket.Chat授权(License)
    MIT范例(Example)
    https://demo.rocket.chat/home

  • HTML5 16299 0 1 发布

    本目录收录的是流程图相关的应用软件。


    定义

    流程图(Flowchart Diagram)是表示算法、工作流或流程的一种框图表示,它以不同类型的框代表不同种类的步骤,每两个步骤之间则以箭头连接。

    流程图大致可以分为以下四种类型:

    文件流程图数据流程图系统流程图程序流程图范围

    本目录收录的软件仅限于以流程图实现为主要功能(或之一)的应用软件。

    列表

    本目录收录了以下软件:

    Diagramo

    Diagramo是一个流程图模型编辑工具

    以下是Diagramo各相关链接及授权信息的介绍:

    官网(HP)
    http://diagramo.com源代码(Source)
    https://github.com/ssshow16/diagramo授权(License)
    GPL范例(Example)
    http://diagramo.com/editor/editor.php

  • HTML5 13458 0 1 发布

    ERD

    本目录收录的是ERD模型相关的应用软件。

    定义

    ERD(Entity-relationship Diagram,实体关系图)是概念数据模型的高层描述所使用的数据模型或模式图。

    ERD由实体和实体之间的关系定义而成,实体(Entity)表示一个离散对象,可以被(粗略地)认为是名词,如人、交易等。关系(Relationship)描述了两个或更多实体相互如何关联,联系可以被(粗略地)认为是动词。

    范围

    本目录收录的软件仅限于以ERD模型实现为主要功能(或之一)的应用软件。

    列表

    本目录收录了以下软件:

    WWWSqlDesigner

    WWWSqlDesigner是一个ER图形工具,允许用户创建数据库设计,可以保存/加载并导出到SQL脚本。 支持各种数据库和语言,能够导入现有的数据库设计。

    以下是WWWSqlDesigner各相关链接及授权信息的介绍:

    官网(HP)
    https://github.com/ondras/wwwsqldesigner源代码(Source)
    https://github.com/ondras/wwwsqldesigner授权(License)
    BSD范例(Example)
    http://ondras.zarovi.cz/sql/demo/?keyword=default

  • PHP 9470 0 1 发布

    Bootstrap3是一个高度可定制的基于Bootstrap的DokuWiki模板,具有响应性,适用于所有设备(移动设备,平板电脑,台式机等)。

    功能和特点HTML5和CSS3基于Bootstrap 3.xGlyphicons 和 FontAwesome图标AnchorJS支持可高度定制丰富的HTML和DokuWiki钩子侧边栏支持(左侧和右侧)主题切换器插件统合Bootstrap Wrapper PluginDiagram PluginDiscussion PluginEdittable PluginExplain PluginInlinetoc PluginLinkback PluginMove PluginOverlay PluginPublish PluginRack PluginTagging PluginTags PluginTranslation PluginUser Home-Page PluginWrap Plugin - TabsTplInc Plugin设定主题项目名项目说明值类型缺省值可选值bootstrapThemeBootstrap主题multichoicedefaultdefault
    optional
    custom
    bootswatchbootswatchTheme从Bootswatch.com选择主题multichoiceyeticerulean
    cosmo
    cyborg
    darkly
    flatly
    journal
    lumen
    paper
    readable
    sandstone
    simplex
    solar
    slate
    spacelab
    superhero
    united
    yeticustomTheme插入自定义主题的URLstringnullshowThemeSwitcher在导航栏中显示Bootswatch.com主题切换器onoff0hideInThemeSwitcher在主题切换器中隐藏主题multicheckboxnullcerulean
    cosmo
    cyborg
    darkly
    flatly
    journal
    lumen
    paper
    readable
    sandstone
    simplex
    solar
    slate
    spacelab
    superhero
    united
    yetithemeByNamespace按名字空间指定主题onoff0侧边栏项目名项目说明值类型缺省值sidebarPositionDokuWiki Sidebar position (left or right)multichoiceleftleft
    rightrightSidebarThe Right Sidebar page name, empty field disables the right sidebar.
    The Right Sidebar is displayed only when the default DokuWiki sidebar is enabled and is on the left position (see the sidebarPosition configuration). If do you want only the DokuWiki sidebar on right position, set the sidebarPosition configuration with right valuestringrightsidebarleftSidebarGridLeft sidebar grid classes col-{xs,sm,md,lg}-x (see Bootstrap Grids documentation)stringcol-sm-3 col-md-2rightSidebarGridRight sidebar grid classes col-{xs,sm,md,lg}-x (see Bootstrap Grids documentation)stringcol-sm-3 col-md-2sidebarOnNavbarDisplay the sidebar contents inside the navbar (useful on mobile/tablet devices)onoff0sidebarShowPageTitleDisplay Sidebar page titleonoff1导航栏项目名项目说明值类型缺省值inverseNavbarInverse navbaronoff0fixedTopNavbarFix navbar to toponoff0showTranslationDisplay translation toolbar (require Translation Plugin)onoff0showToolsDisplay Tools in navbarmultichoicealwaysnever
    logged
    alwaysshowHomePageLinkDisplay Home-Page link in navbaronoff0homePageURLUse custom URL for home-page linksstringnullshowUserHomeLinkDisplay User Home-Page link in navbaronoff1hideLoginLinkHide the login button in navbar. This option is useful in “read-only” DokuWiki installations (eg. blog, personal website)onoff0showEditBtnDisplay edit button in navbarmultichoicenevernever
    logged
    alwaysindividualToolsSplit the Tools in individual menu in navbaronoff0showIndividualToolEnable/Disable individual tool in navbarmulticheckboxsite,pageuser
    site
    pageshowSearchFormDisplay Search form in navbarmultichoicealwaysnever
    logged
    alwaysshowAdminMenuDisplay Administration menuonoff0useLegacyNavbarUse legacy and deprecated navbar.html hook (consider in the future to use the :navbar hook)onoff0showNavbarDisplay navbar hookmultichoicealwayslogged
    alwaysnavbarLabelsShow/Hide individual labelmulticheckboxlogin,registerlogin
    register
    admin
    tools
    user
    site
    page
    themes
    expand
    profileshowAddNewPageEnable the Add New Page plugin in navbar (require Add New Page Plugin)multichoicenevernever
    logged
    alwaysnotifyExtensionsUpdateNotify extensions update (for Admin users)onoff0Semantic项目名项目说明值类型缺省值semanticEnable semantic dataonoff1schemaOrgTypeSchema.org type (Article, NewsArticle, TechArticle, BlogPosting, Recipe)multichoiceArticleArticle
    NewsArticle
    TechArticle
    BlogPosting
    RecipeshowSemanticPopupDisplay a popup with an extract of the page when the user hover on wikilink (require Semantic Plugin)onoff0布局项目名项目说明值类型Default ValuefluidContainerEnable the fluid container (full-width of page)onoff0fluidContainerBtnDisplay a button in navbar to expand containeronoff0pageOnPanelEnable the panel around the pageonoff1tableFullWidthEnable 100% full table width (Bootstrap default)onoff1tableStyleTable stylemulticheckboxstriped,condensed,responsivestriped
    bordered
    hover
    condensed
    responsiveshowLandingPageEnable the landing page (without a sidebar and the panel around the page)onoff0landingPagesLanding page name (insert a regex)regex(intro)showPageToolsEnable the DokuWiki-style Page Toolsmultichoicealwaysnever
    logged
    alwaysshowPageIdDisplay the DokuWiki page name (pageId) on toponoff1showBadgesShow badge buttons (DokuWiki, Donate, etc)onoff1showLoginOnFooterDisplay a “little” login link on footer. This option is useful when hideLoginLink is ononoff0showWikiInfoDisplay DokuWiki name, logo and tagline on footeronoff1文章目录 项目名项目说明值类型缺省值tocAffixAffix the TOC during page scrollingonoff1tocCollapseSubSectionsCollapse all sub-sections in TOC to save spaceonoff1tocCollapseOnScrollCollapse TOC during page scrollingonoff1tocCollapsedCollapse TOC on every pagesonoff0tocLayoutTOC layoutmultichoicedefaultdefault
    navbarg钩子HTML钩子

    所有文件必须位于模板目录(lib / tpl / bootstrap3 /)或conf /目录中。

    文件名插入到页面HTML中的位置meta.html <head>和</head>之间topheader.html紧接着<body>标签之后header.htmlAbove the upper blue bar, below the pagename and wiki titlenavbar.htmlDEPRECATED (see the note below) - Inside the navbar, use this to add additional links (e.g. <li><a href=“/foo”>Foo</a></li>)pageheader.htmlbreadcrumbs下面,页面实际内容的上方pagefooter.htmlAbove the lower blue bar, below the last changed Datefooter.html在页面的最后,位于</ body>标记之前sidebarheader.html边侧栏上方sidebarfooter.html边侧栏下方social.htmlBelow the header.html, use this to add a social buttons (eg. Google+, Twitter, LinkedIn, etc)rightsidebarheader.html右边侧栏上方rightsidebarfooter.html
    右边侧栏下方
    Dokuwiki钩子

    可以通过创建简单的DokuWiki“钩子”页面来自定义页面的各个部分。 bootstrap3模板会将这些钩子页面内容插入到页面的总体布局中。

    钩子页面名说明名字空间单位:sidebarThe sidebarYES:rightsidebarThe right-sidebarYES:navbarNavbar with sub-menusYES:pageheaderHeader of the Wiki articleYES:pagefooterFooter of the Wiki articleYES:footerFooter of the pageYES:cookie:bannerCookie-Law bannerNO:cookie:policyCookie-Law policyNO:helpHelp page for “Help Page Icon”YES:headerHeader of page below the navbarYES:topheaderTop Header of page (on top of navbar if fixedTopNavbar is off)YES

  • PHP 1236 0 1 发布
    CSS文件

    DokuWiki本体的CSS文件位于lib / styles目录中,不过DokuWiki本体仅定义了一些最基础的CSS,更多的CSS存在于模板和各个插件里面。
    所有CSS文件都是通过lib/exe /css.php程序获取的。该程序还处理缓存,模式替换,LESS预处理和优化,由tpl_metaheaders()函数调用。

    加载CSS的顺序如下: 在CSS中,如果为同一属性指定了不同的值,并且样式冲突,则稍后加载的样式将优先,并且属性值将被覆盖,因此首选样式是从后面开始。

    基本样式:lib /styles/*.css插件样式:lib / plugins / <插件名称> / *。css模板样式:在lib / tpl / <模板名称> /style.ini中定义用户样式:conf / user * .css

    如果要通过自定义CSS添加样式,则基本上应将其添加到用户样式(conf / user * .css)中。

    媒体类型

    样式表支持五种媒体类型:

    screen:用于显示器print:用于打印all:用于所有的媒体设备rtl:feed:外部链接Dokuwiki官方说明

  • HTML5 801 0 1 发布

    本目录收录的是电子表格相关的应用软件。

     定义

    电子表格(Spreadsheet),指的是类似于Micfosoft Excel的办公文档。它会显示由一系列行与列构成的网格,称为单元格,单元格之间可以合并成一个跨多行多列的大单元格。

    单元格内可以存放数值、计算式、或文本,单元格的边框和文本颜色字体通常可以个别设置。

    范围

    本目录收录的软件仅限于以电子表格为主要功能(或之一)的应用软件。

    列表

    本目录收录了以下软件:

    EtherCalc

    EtherCalc是一个实时多人协作的电子表格处理器,后台需NodeJS服务器

    以下是 EtherCalc各相关链接及授权信息的介绍:

    官网(HP)
    https://ethercalc.net/源代码(Source)
    https://github.com/audreyt/ethercalc授权(License)
    Apache 2范例(Example)

    https://ethercalc.net/

    截图

  • HTML5 418 0 1 发布

    本目录收录的是PDF相关的应用软件。

     定义

    PDF(Portable Document Format:便携式文档格式)是一种用独立于应用程序、硬件、操作系统的方式呈现文档的文件格式。

    每个PDF文件包含固定布局的平面文档的完整描述,包括文本、字形、图形及其他需要显示的信息,通常在任何设备和环境下都能获得同样的展现。

    范围

    本目录收录的软件仅限于以PDF为主要功能(或之一)的应用软件。

    列表

    本目录收录了以下软件:

    laddu-reader

    Laddu 是一个PDF阅读器,基于Mozilla的pdf.js。

    以下是 laddu-reader 各相关链接及授权信息的介绍:

    官网(HP)
    源代码(Source)
    https://github.com/iraycd/laddu-reader授权(License)
    MIT范例(Example)
    截图