用于前端授权

对外接口有

函数 参数 返回值
configureConnector

{ connectorUrl, frameId, mockMode, mockToken }

Promise用于加载的

getFreshToken promise返回token
isTokenExpired

token, offsetSeconds

bool值,token是否过期
decodeToken

token

解码token

configureConnector函数参数为对象,支持的参数有{connectorUrl, frameId, mockMode, mockToken}。根据connectorUrl和frameId在dom中创建iframe,同时创建loading的Promise。

export function configureConnector({ connectorUrl, frameId, mockMode, mockToken }) {if (mockMode) {mock = truetoken = mockToken} else if (iframe) {console.warn('tc-accounts connector can only be configured once, this request has been ignored.')} else {iframe = createFrame(frameId, connectorUrl)url = connectorUrlloading = new Promise((resolve) => {iframe.onload = function () {loading = nullresolve()}})}
}

getFreshToken在mock模式下,如果token不为空,则直接解析token,否则抛出异常connector运行在mock模式下,没有指定token.

在非mock模式下,执行代理调用,会检查是不是在mock模式下以及iframe是否已经设置。如果正在加载,则在加载完后再执行request,否则执行request。request是读取cookie中的v3jwt,如果token在超时时间后的65s内,可以直接使用该token,否则使用iframe刷新token.

export function getFreshToken() {if (mock) {if (token) {return Promise.resolve(token)} else {return Promise.reject('connector is running in mock mode, but no token has been specified.')}}return proxyCall().then(data => data.token)
}const proxyCall = function () {if (mock) {throw new Error('connector is running in mock mode. This method (proxyCall) should not be invoked.')}if (!iframe) {throw new Error('connector has not yet been configured.')}function request() {const token = getToken('v3jwt')// 65 is offset in seconds, before expiryif (token && !isTokenExpired(token, 65)) {return new Promise((resolve, reject) => {token ? resolve({ token: token }) : reject("v3jwt cookie not found")})} else {return new Promise((resolve, reject) => {function receiveMessage(e) {const safeFormat = e.data.type === "SUCCESS" || e.data.type === "FAILURE"if (safeFormat) {window.removeEventListener('message', receiveMessage)if (e.data.type === "SUCCESS") {getToken('v3jwt') ? resolve({ token: getToken('v3jwt') }) : reject("v3jwt cookie not found")} else {reject("unable to get refesh token")}}}window.addEventListener('message', receiveMessage)const payload = { type: "REFRESH_TOKEN" }iframe.contentWindow.postMessage(payload, url)})}}if (loading) {return loading = loading.then(request)} else {return request()}
}

isTokenExpired判断token是否过期。参数为token, offsetSeconds

判断token的超时时间是否大于当前时间+offsetSeconds

export function isTokenExpired(token, offsetSeconds = 0) {const d = getTokenExpirationDate(token)if (d === null) {return false}// Token expired?return !(d.valueOf() > (new Date().valueOf() + (offsetSeconds * 1000)))
}
decodeToken解析token,得到jwt中的body.
export function decodeToken(token) {const parts = token.split('.')if (parts.length !== 3) {throw new Error('The token is invalid')}const decoded = urlBase64Decode(parts[1])if (!decoded) {throw new Error('Cannot decode the token')}// covert base64 token in JSON objectlet t = JSON.parse(decoded)// tweaking for custom claim for RS256t.userId = _.parseInt(_.find(t, (value, key) => {return (key.indexOf('userId') !== -1)}))t.handle = _.find(t, (value, key) => {return (key.indexOf('handle') !== -1)})t.roles = _.find(t, (value, key) => {return (key.indexOf('roles') !== -1)})return t
}

参考资料:

https://www.npmjs.com/package/@topcoder-platform/tc-auth-lib

tc-auth-lib学习笔记相关推荐

  1. 学习笔记:带你十天轻松完成 Go 微服务系列(二)- 服务拆分

    学习笔记:带你十天轻松搞定 Go 微服务系列(二) 1.学习课程 2.服务拆分 2.1 按业务服务拆分 2.2 按调用方式拆分 3.创建项目目录 3.1 在 code 中新建项目 3.2 创建 mal ...

  2. Lib库使用学习笔记

    Lib库使用学习笔记 转自:http://blog.csdn.net/macky0668/article/details/6044867 技术前沿 2008-03-31 14:21:10 阅读177  ...

  3. Linux 从零开始学习笔记

    从零开始学习Linux,记录笔记,担心自己以后会忘,也供大家茶余饭后,闲来无事看看,自己的理解只能到这,能力有限.也希望大家可以指出我的错误,让我可以有一点点进步,以后会一直更新,同时也希望大家可以收 ...

  4. Liferay Portal学习笔记-coldTear

    [原创]Liferay Portal学习笔记(一):安装 一. 简单安装 1)下载并安装 JDK1.5 1.  下载并安装 Windows Platform J2SE(TM) Development ...

  5. redhat6.x_linux学习笔记

    ULE 学习笔记 ls -l install.log -:rw-r--r--: 1 :root: root :39410 :2012-12-03 :install.log 文件类型 : 权限位 : 硬 ...

  6. Python3 爬虫学习笔记 C18【爬虫框架 pyspider — 深入理解】

    Python3 爬虫学习笔记第十八章 -- [爬虫框架 pyspider - 深入理解] 文章目录 [18.1]启动参数 [18.2]运行单个组件 [18.2.1]运行 Scheduler [18.2 ...

  7. pycharm 运行celery_Celery全面学习笔记

    来源 介绍 Celery 是 Distributed Task Queue,分布式任务队列.分布式决定了可以有多个 worker 的存在,队列表示其是异步操作. Celery 核心模块 Celery有 ...

  8. Linux学习笔记12——配置ftp、squid、Tomcat、Samba、MySQL主从

    Linux学习笔记12 Linux学习笔记12 配置FTP服务 配置pure-ftpd 开机启动 上传下载文件 配置vsftpd CentOS 70安装配置Vsftp服务器 搭好vsftp之后出现55 ...

  9. FreeBSD6.1学习笔记[转]

    FreeBSD6.1学习笔记December 22nd, 2006 作者: Jeffrey 出处:http://blog.zhangjianfeng.com/?p=512 安装没有什么说的,照提示即可 ...

  10. docker学习笔记(四)使用docker搭建环境

    参考:汤小洋老师的教学视频 docker学习笔记(一)[docker 介绍.卸载.安装.配置加速] docker学习笔记(二)docker常用命令 docker学习笔记(三)镜像 docker学习笔记 ...

最新文章

  1. nodejs 改变全局前缀
  2. java pdf添加图片_java实现在pdf模板的指定位置插入图片
  3. rust实战入门到进阶(1)
  4. N Queen(代码、分析、汇编)
  5. 05精益敏捷项目管理——超越Scrum
  6. java8 入门脚本之家_Java 8中的Lambda表达式
  7. 苹果笔记本单独安装win10
  8. 对多个有规律表进行更新剔重复操作的存储过程(up8000)
  9. 【动态规划笔记】01背包问题及优化
  10. 1177: 按要求排序(指针专题)_排序算法之快速排序
  11. Js中的window.parent ,window.top,window.self 代表的对象
  12. php.ini 中开启短标签 ?=$?
  13. Golang 入门系列(十三)用Beego开发web应用
  14. (转)一些方便查找学习资料的网站,希望可以帮到需要的小伙伴
  15. GPS导航电文编码与校验
  16. 计算机操作系统主要特征,计算机操作系统的最基本特征是什么
  17. 读取assets目录下的文件详细介绍
  18. 计算机网络体系结构-虚拟专用网
  19. 对静态页面的一些理解
  20. 关于创建电子邮件链接时如何发送邮件内容

热门文章

  1. 网络攻防-20169213-刘晶-第六周作业
  2. PHP的函数-----生成随机数、日期时间函数
  3. 验证码识别--type7
  4. jdbc mysql - Column count doesn't match value count at row 1.
  5. ibaits与spring整合的心得
  6. 面向对象编程的乐趣(TextBox.Text=)
  7. python自学网站 知乎-知乎千赞回答 | 为什么自学python看不进去?
  8. python编写一个软件-软件代做:利用Python编写一个行业专用的小计算器
  9. python利器怎么编程-bluepy 一款python封装的BLE利器简单介绍
  10. mac中python怎么打开中文txt文件-mac在matplotlib中显示中文的操作方法