小编som*_*ne1的帖子

GitHub的甘特图

我们一直在使用GitHub 6个月,并且在如何投入任务,里程碑等方面有更多/更少的"最佳实践".但是,从管理的角度来看,有一些功能,缺乏.例如,在RedMine等解决方案中可以找到甘特图功能,甚至覆盖在日历任务/里程碑标记,路线图等之上.

是否有某种"添加"或第三方网站可以挂钩到GitHub并为我生成这些?由于我们已经在GitHub中集成了这么多,我想继续使用它,但如果使用我们需要的功能可以迁移到另一个系统,我可能愿意转移.

任何建议/帮助将不胜感激!

github gantt-chart

33
推荐指数
1
解决办法
1万
查看次数

如何使用Cordova保护SPA和移动应用程序的REST API

我已经对围绕这个的"最佳实践"进行了大量的研究,并在博客文章之后阅读了博客文章,在SO问题之后阅读了SO问题,在OWASP文章之后阅读了OWASP文章.我已经得到了一些明确的答案,但有些未知数.

首先,"做":

  1. 使用JWT在我的REST API上授权用户[1] [2]
  2. 将JWT存储在HTTPOnly/Secure cookie中并构建CSRF保护.不要存储在HTML5本地存储[3] [4] [5]中(实际上,这一点值得商榷,是否更容易防范XSS或CSRF?[6])
  3. 验证JWT的签名方法[7]

现在我开始假设拥有一个SPA(使用Angular构建)并使用HTML5 sessionStorage对于短期令牌来说足够安全,但有一点需要说明XSS攻击可能来自一个源自"坏角色"的"坏角色"从CDN加载的许多库之一.

对于我的特定用例,我不计划使用长期令牌 - 在不使用10分钟后过期但我仍然想知道我是否要通过会话跟踪到期或使用刷新令牌 - StormPath推荐前者(不再是无国籍?)但我相信使用JWT的大玩家使用刷新令牌(谷歌使用它们但声明你需要将它们存储在安全的长期存储中,这意味着HTML5 localStorage再次出现问题).

我想这样做,这样我的用户如果刷新页面就不必重新登录(因此需要在客户端存储令牌).我还希望在Cordova的帮助下将我的SPA用作"移动应用程序".这里显而易见的缺陷是,如果我使用cookie,Cordova没有带烘焙的cookie支持/存储,我应该转而使用HTML5本地存储.因为在移动设备上我并不需要担心刷新页面,所以我可以让我的令牌存在于内存中并使用我所确定的策略到期.

如果我采用这种方法,桌面上基于cookie的JWT,移动设备上的"Bearer"标头,我现在需要一个认证端点,它将以两种不同的方式给予令牌,当我在REST API端授权时,我需要支持基于cookie的JWT(带有CSRF)和基于头的JWT验证.这种复杂情况令我担心,因为我不知道我是否能准确预见到这里的安全隐患.

总结一下上面的一系列想法:

  • 创建一个身份验证处理程序,通过HttpOnly/Secure cookie将令牌分发到桌面,并通过移动有效负载分发.
  • 在我的REST API上,支持两种验证方法 - 基于头和基于cookie - 包括基于cookie的方法的CSRF保护.

我有什么理由不想采取这种方法吗?我假设如果我在我的SPA上使用XSS是一个严重的风险,那么我需要一个经典的登录页面进行身份验证以设置正确的cookie,因为如果我通过SPA进行身份验证,那么任何XSS攻击都可能会拦截它(两者都有)在手机和桌面上)!但是,在移动设备上,我需要将JWT注入到SPA中,可能通过一些自定义DOM元素(元标记?),但此时我可以让SPA执行登录,而不是将XSS视为移动设备上的威胁.Cordova将所有资产打包到安装包中,这样有点好,但为什么不在桌面版上采用相同的方法呢?

我的应用程序只需很少的用户输入,它主要是一个仪表板/报告工具.将有一个"消息中心",但它的内容应始终由用户创建(仅由该用户创建)并进行消毒.在我的用例中,是否可以偏离"最佳实践"并依赖localStorage不计算XSS作为我的SPA的严重风险?这将简化整个过程(按原计划使用HTML5 sessionStorage)并降低复杂性,这将减少潜在安全性失误的攻击面.我只想确保在继续前进之前了解风险.

除了通过构建移动本机应用程序而不使用Cordova将我的SPA转换为移动应用程序之外,还有其他安全方法可以使其安全吗?我讨厌这种情况,但它可能很好.

我很感激所有关于此事的想法!

cookies rest jwt angularjs cordova

18
推荐指数
1
解决办法
1449
查看次数

可靠的方式执行数以千计的独立交易?

我的应用程序遇到了瓶颈,并且很难找到解决方案.一点背景:

  • 我的应用程序ping一个API来收集数十万个项目的信息并将它们存储到数据存储区
  • 我们需要对这些项目的各个维度执行简单的聚合,我们在存储项目期间尝试计算这些项目

目前的实施:

  • 我们根据需要手动下载这些项目,这将在专用于下载这些项目的后端创建任务.每个任务将启动更多任务,具体取决于分页所需的API调用次数并获取每个项目.
  • 每个任务都将下载,解析和批量存储项目,同时通过使用字典保留我们想要的内存聚合.
  • 在每个任务执行结束时,我们将聚合字典写入拉取队列.
  • 一旦我们检测到我们即将结束API调用,我们就会将聚合任务启动到第二个后端配置
  • 这个"聚合任务"从拉取队列(每次20个)拉出,并在尝试存储每个聚合之前合并在每个任务中找到的字典(进一步做内存聚合).此任务还将启动其他任务以执行拉取队列中剩余任务的聚合(数百个)
  • 我们使用分片计数器方法来帮助缓解存储到数据存储区时的任何争用
  • 每个聚合任务都可以尝试并存储500-1500个聚合,这些聚合应该彼此独立

还有其他检查,以确保正确处理所有拉队列任务并下载所有项目.

问题:

我们希望尽快下载并存储所有项目和聚合.我为所描述的每个后端配置启用了20个实例(我将它们称为"聚合器"后端和"下载器"后端).下载器后端似乎相当快地通过API调用.我大量使用NDB库和异步URL Fetches/Datastore调用来获得它.我还启用了threadsafe:true,这样在开始下一个任务之前,任何实例都不会等待RPC调用完成(所有任务都可以独立运行并且是幂等的).

聚合器后端是大时间接收器发挥作用的地方.通过事务异步存储500-1500个这些聚合需要40秒或更长时间(我甚至不认为所有事务都已正确提交).我将此后端保留为线程安全:假,因为我使用了300秒的拉队列到期截止日期,但如果我允许在单个实例上执行多个任务,则它们可能会级联并在300秒内完成一些任务标记,从而允许另一个任务第二次拉同一个任务,并可能重复计算.

日志显示BadRequestError: Nested transactions are not supported.先前的错误(在堆栈跟踪中)TransactionFailedError: too much contention on these datastore entities. please try again..我经常看到的另一个错误是BadRequestError(The referenced transaction has expired or is no longer valid.)

根据我的理解,有时这些错误意味着仍然可以在没有进一步交互的情况下提交事务.我如何知道这是否已正确提交?我是以逻辑/有效的方式做到这一点还是有更多的并发空间而没有搞乱一切的风险?

相关守则:

class GeneralShardConfig(ndb.Model):
    """Tracks the number of shards for each named counter."""
    name = ndb.StringProperty(required=True)
    num_shards = ndb.IntegerProperty(default=4)

class GeneralAggregateShard(ndb.Model):
    """Shards for each named counter"""
    name = ndb.StringProperty(name='n', required=True)
    count …
Run Code Online (Sandbox Code Playgroud)

python google-app-engine python-2.7 google-cloud-datastore

13
推荐指数
2
解决办法
2238
查看次数

Android UDP通讯

我在这个网站上阅读了很多关于如何在Android中接收UDP数据包的帖子.但是,这对我来说都不起作用!

一些基础知识:

我正在测试运行在3G上的HTC Incredible(Android 2.2)(不是wifi或其他任何东西).这里不涉及模拟器.

我的代码很简单:

  1. 我的服务器(在我的PC上运行)正在侦听端口8752上的UDP流量.
  2. 我的Android应用程序在随机端口上打开一个DatagramSocket,并使用此端口将数据包发送到我的服务器.
  3. 然后我保存此信息(InetAddress形成接收的数据包和数据包中找到的端口).
  4. 我尝试从我的服务器(再次,在我的电脑上)发送UDP数据包到我的Android应用程序(在我的手机上运行),它不起作用.
//Server code to initialize the UDP socket (snippet)
public void init() {
    datagram_server_socket = new DatagramSocket(port,local_addr);
    datagram_server_socket.setSoTimeout(1000);
}
Run Code Online (Sandbox Code Playgroud)

// ANDROID APP上的代码片段,用于将数据包发送到服务器

public void connect() {
    Random r = new Random(System.currentTimeMillis());
    int udp_port = 0;
    while(true){
        try {
            udp_port = r.nextInt(1000)+8000;
            udp_port = 8000;
            comm_skt = new DatagramSocket(udp_port);
            Log.i("ServerWrapper", "UDP Listening on port: " + udp_port);
            break;
        } catch(SocketException e) {
            Log.e("ServerWrapper", "Could not bind to port " + udp_port);
        } …
Run Code Online (Sandbox Code Playgroud)

java android udp

7
推荐指数
1
解决办法
1万
查看次数

如何使用Cloud Storage JSON API检索大小超过64KB的文件?

我需要在Web应用程序中检索大小超过64KB的文件.目前,在JSON API的v1beta1中,Google仅允许通过其JSON API上传/下载64KB大小.我已经想出如何使用"可恢复"上传(不是通过其JSON API中提供的接口v1beta1,而是手动)上传大小超过64KB的文件.

我无法弄清楚是一个很好的下载方式.现在,我为要下载的对象公开ACL,下载文件,然后删除对象上的公共ACL.这不仅效率低,而且不是很干净.有没有更好的方法可以使用,或者我坚持到谷歌在未来的API版本中提供更好的方法?

背景信息 我正在撰写GAE应用程序,我知道google.appengine.api.files界面.不幸的是,在使用本地开发环境时,这不适用于实时存储桶,出于测试目的,我和我的团队需要一种在本地测试开发的方法(在其他限制/安全因素中部署到GAE过于繁琐).我们可以与除Cloud Storage之外的所有其他API进行交互,因此我正在编写一个类,在从云存储读取/写入/删除时将使用JSON API或AppEngine的文件界面.我有一个工作实现,但我对我检索文件的方式不满意.

下面的评论澄清:我们正在下载大量信息,对其进行按摩,并将其存储到云存储中以供消费用于BigQuery.我们需要使用dev环境中的实时存储桶,因为如果不这样做,BigQuery将无法使用我们想要测试的数据.无需提供这些文件,只需处理它们即可

来自已接受的评论的解决方案答案如下: 我能够httplib2从与JSON API交互的代码中重用我的经过身份验证的对象,以针对https://{bucket_name}.storage.googleapis.com/{object_name}URL端点执行经过身份验证的GET请求,仅添加Content-Length: 0x-goog-api-version: 2标头.

python google-app-engine google-cloud-storage google-api-python-client

5
推荐指数
1
解决办法
518
查看次数

在Go中从Python项目中加载数据存储区实体会导致嵌套的结构切片切片错误

出于性能原因,我正在Go的Google AppEngine项目中编写模块,但需要能够读取我在数据存储区中拥有的某些实体。我写了Go代码以能够读取我在Python中构建的实体,但出现以下错误:

datastore: flattening nested structs leads to a slice of slices: field "Messages"

Python中的模型定义:

class ModelB(ndb.Model):
    msg_id = ndb.StringProperty(indexed=False)
    cat_ids = ndb.StringProperty(repeated=True, indexed=False)
    list_ids = ndb.StringProperty(repeated=True, indexed=False)
    default_list_id_index = ndb.IntegerProperty(indexed=False)

class ModelA(ndb.Model):
    date_join = ndb.DateTimeProperty(auto_now_add=True)
    name = ndb.StringProperty()
    owner_salutation = ndb.StringProperty(indexed=False)
    owner_email_address = ndb.StringProperty()
    logo_url = ndb.StringProperty(indexed=False)
    ...
    messages = ndb.LocalStructuredProperty(ModelB, name='bm', repeated=True)
Run Code Online (Sandbox Code Playgroud)

在Go中:

type ModelB struct {
    MessageID          string   `datastore:"msg_id,noindex"`
    CategoryIDs        []string `datastore:"cat_ids,noindex"`
    ListIDs            []string `datastore:"list_ids,noindex"`
    DefaultListIDIndex int      `datastore:"default_list_id_index,noindex"`
}

type ModelA struct {
    DateJoin          time.Time `datastore:"date_join,"`
    Name …
Run Code Online (Sandbox Code Playgroud)

python google-app-engine go app-engine-ndb

4
推荐指数
1
解决办法
1390
查看次数