我们正在构建一个 PWA(渐进式网络应用程序)。主要组件是应用程序外壳 (SPA) 和 API。REST API 将提供应用程序所需的数据,而 SPA 将处理其余的(根据 Google 的建议)。
最终用户的身份验证似乎有问题,因为需要考虑 Web 浏览器。我们希望用户登录通过关闭浏览器来保持。我们已经研究了可能的实现方式,但是我们想确保我们不会走错方向。
基于会话的身份验证- 用户将用户名和密码发送到 /accounts/auth 并接收带有会话 ID 的仅 HTTP cookie。会话需要存储在数据库或 Redis 中。此选项的问题在于 cookie 是由浏览器自动发送的,因此我们需要适当的 CSRF 保护。使用同步器令牌模式,每次发出状态更改请求(例如 POST)时都会生成一个新令牌。这意味着应用程序需要为每个请求提供一个 CSRF 令牌,以便 PWA 可以通过 AJAX 发送它。我们认为这并不理想,因为用户可以快速连续发送多个 post 请求,导致其中一些失败并导致糟糕的用户体验。
我们也可以在没有 CSRF 的情况下使用这种方法,方法是将 CORS 策略限制在同一个域并添加一个从技术上讲应该停止所有 CSRF 的标头要求,但是我们不确定它的安全性。
基于 JWT 令牌的身份验证- 用户将用户名和密码发送到 /accounts/auth 并颁发新的 JWT 令牌。然后需要将 JWT 存储在localstorage或cookie 中。使用 localstorage 意味着 JWT易受 XSS 攻击,如果令牌被盗,攻击者可以完全冒充用户。使用 cookie,我们仍然需要解决 …
authentication session api-design progressive-web-apps jwt-auth
如果你可以向Cocoa添加任何东西,它会是什么?是否有任何功能,主要或次要,你会说在Cocoa中缺少.也许有一个轮子你不得不反复发明因为框架中的遗漏?
我有一个正常的,基本的REST api,如:
/
    GET - list
    POST - create
/<id>
    GET - detail
    PUT - replace
    PATCH - patch
    DELETE - delete
当POST进来时/,我通常创建一个对象并创建一个新的id.某些(一个)字段必须是唯一的.因此,具有此类重复数据的POST可能会导致:
PUT/ PATCH来/<id>和更新现有记录4XX1似乎是:请求要么糟糕,要么我可以处理它.处理这种情况的正确方法是什么?
最终目标是使用tweepy api搜索专注于主题(即docker)和EXCLUDE转发.我已经看过提及不包括转推的其他主题,但它们完全适用.我试图将我学到的知识融入到下面的代码中,但我相信"如果不是"代码片段在错误的地方.任何帮助是极大的赞赏.
#!/usr/bin/python
import tweepy
import csv #Import csv
import os
# Consumer keys and access tokens, used for OAuth
consumer_key = 'MINE'
consumer_secret = 'MINE'
access_token = 'MINE'
access_token_secret = 'MINE'
# OAuth process, using the keys and tokens
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)
# Open/Create a file to append data
csvFile = open('docker1.csv', 'a')
#Use csv Writer
csvWriter = csv.writer(csvFile)
ids = set()
for tweet in tweepy.Cursor(api.search, 
                    q="docker", 
                    Since="2016-08-09", 
                    #until="2014-02-15", 
                    lang="en").items(5000000):
if not tweet['retweeted'] …我们有一个随机需要花费大量content download时间在Chrome上的API ,它在firefox中运行良好并且只需要少量ms.响应大小为20kb未压缩和4kb压缩.使用curl,同样的请求也可以正常工作.
我们尝试过的事情:
If-None-Match标头以禁用浏览器的缓存响应.相同的请求有时在chrome上工作正常但随机返回非常高的内容下载时间.
我们无法理解此问题的根本原因.我们可以尝试最小化这个时间的其他事情是什么?
我在这里提出了三个请求,第三个请求占用了最多(在最后一个峰值之前).CPU似乎没有在更长的时间内达到最大化.大部分时间都是空闲时间.
此外,使用Replay XHR菜单重播呼叫时,内容下载时间从2秒降至200毫秒.
我正在研究分页,我有一些问题。
我认为基于光标的要复杂得多,这使得基于偏移量的分页更加可取。只有以实时数据为中心的系统才需要基于游标的分页。
(注意:这个问题严格关于API 的设计,而不是关于如何实现它;即我只关心我的API的客户端在这里看到了什么,而不是我必须做些什么才能使它工作.)
简单来说:我想知道已建立的模式 - 如果有的话 - 用于Python中的显式期货(也就是承诺,也就是延期,又称任务 - 名称因框架而异).以下是更详细的描述.
考虑一个像这样的简单Python API:
def read_line():
   ...
s = read_line()
print(s)
这是一个同步版本 - 如果一条线路尚未可用,它将阻止.现在假设我想提供一个相应的异步(非阻塞)版本,它允许注册一个操作完成后调用的回调.例如,一个简单的版本可能如下所示:
def read_line_async(callback):
   ...
read_line_async(lambda s: print(s))
现在,在其他语言和框架中,通常存在针对此类API的强制或至少完善的模式.例如,在版本4之前的.NET中,通常会提供一对BeginReadLine/ EndReadLine方法,并使用stock IAsyncResult接口注册回调并传递结果值.在.NET 4+中,人们使用System.Threading.Tasks,以便启用所有任务组合运算符(WhenAll等),并连接到C#5.0 async功能.
再举一个例子,在JavaScript中,标准库中没有任何内容可以覆盖它,但是jQuery已经推广了现在单独指定的"延迟promise"接口.因此,如果我readLine在JS中编写异步,我会命名它readLineAsync,并对then返回的值实现方法.
如果有的话,Python领域的既定模式是什么?通过标准库,我看到几个提供异步API的模块,但它们之间没有一致的模式,没有像"任务"或"承诺"的标准化协议.也许有一些模式可以从流行的第三方库中获得?
我也看过(在这个上下文中经常提到)Twisted中的Deferred类,但它似乎是一个通用的promise API过度设计,而是适应了这个库的特定需求.它看起来不像我可以轻松地克隆接口(不依赖于它们),这样如果客户端在他的应用程序中同时使用两个库,我们的promise将很好地互操作.是否有任何其他流行的库或框架具有明确设计的API,我可以复制(并与之互操作)而不需要直接依赖?
在设计C++库时,我认为std::vector在公共接口中包含标准库容器是不好的做法(参见例如在dll导出函数中使用std :: vector的含义).
如果我想公开一个获取或返回对象列表的函数,该怎么办?我可以使用一个简单的数组,但后来我必须添加一个count参数,这使得界面更麻烦,更不安全.map例如,如果我想使用a ,它也无济于事.我想像Qt这样的库定义了自己的容器,这些容器可以安全地导出,但是我宁愿不把Qt作为依赖项添加,而且我不想滚动自己的容器.
在库接口中处理容器的最佳做法是什么?是否可能有一个小容器实现(最好只有一两个文件,我可以使用许可许可证),我可以用作"粘合剂"?或者甚至有一种方法可以使std::vector.DLL/.so边界和不同的编译器安全等等?
我希望能够对现有SignalR集线器上的方法签名,名称等进行更改.是否有针对SignalR集线器版本化的定义策略,以便旧的JS代码可以继续工作,而无需为新调用创建新的新命名集线器?
我正处于一个十字路口,决定标签应该是他们自己的资源还是笔记的嵌套属性.这个问题涉及RESTful设计和数据库存储.
上下文:我有一个笔记资源.用户可以有很多笔记.每个音符可以有很多标签.
功能目标: 
我需要创建路由来执行以下操作:
1)获取所有用户标记.类似于:GET /users/:id/tags
2)删除与笔记相关联的标签.
3)将标签添加到特定注释.
数据/性能目标
 
1)获取用户标签应该很快.这是为了"自动提示"/"自动完成".
2)防止重复(尽可能多).我希望尽可能多地重用标签,以便能够按标签查询数据.例如,我想减轻用户在标签"超级英雄"已经存在时键入标签(如"超级英雄")的情况.
话虽如此,我看到它的方式,有两种方法可以在注释资源上存储标签:
1)标签作为嵌套属性.例如:
type: 'notes',
attributes: {
  id: '123456789',
  body: '...',
  tags: ['batman', 'superhero'] 
}
2)标签作为自己的资源.例如:
type: 'notes',
data: {
  id: '123456789',
  body: '...',
  tags: [1,2,3] // <= Tag IDs instead of strings
}
上述任何一种方法都可以工作,但我正在寻找一种能够实现可扩展性和数据一致性的解决方案(想象一百万个笔记和一千万个标签).在这一点上,我倾向于选项#1,因为它更容易处理代码,但可能不一定是正确的选择.
我非常有兴趣听到关于不同方法的一些想法,特别是因为我找不到关于这个主题的类似问题.
更新 感谢您的回答.对我来说最重要的事情之一是确定为什么使用一个优于另一个是有利的.我希望答案包含一些赞成/反对清单.
api-design ×10
api ×2
python ×2
rest ×2
architecture ×1
asynchronous ×1
c# ×1
c++ ×1
cocoa ×1
cocoa-touch ×1
containers ×1
future ×1
http ×1
javascript ×1
jwt-auth ×1
nginx ×1
objective-c ×1
pagination ×1
promise ×1
python-2.7 ×1
session ×1
signalr ×1
tags ×1
tweepy ×1
twitter ×1
versioning ×1