我在域 var StoredResults = [NSManagedObject]()
func fetchRequest(docID : String ){
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext
let request = NSFetchRequest(entityName: "EntityContainingDocID")
let predicate = NSPredicate(format:"docID == %@", docID)
request.predicate = predicate
do {
let results =
try managedContext.executeFetchRequest(request)
StoredResults = results as! [NSManagedObject]
} catch let error as NSError {
print(" error executing fetchrequest ", error)
}
}
上有一个客户端应用程序,在域client-domain.com
上有一个服务器端应用程序。服务器端有一个API。客户端应用程序将AJAX请求发送到服务器端应用程序。我使用基于令牌的身份验证,因此客户端应用程序在每个AJAX请求的头文件中发送令牌,例如:“授权:承载{某些令牌}”。当我需要获取或发布一些数据时,它可以很好地处理AJAX请求。
但是服务器端的API也会保留文件。例如图像。文件是私有的,只有经过身份验证的用户才能获取它们。我需要在server-domain.com
标记的客户端显示此图像。我无法使用<img>
获取它们,因为在这种情况下,浏览器不会向服务器端发送授权标头。
采用的解决方案是什么?客户端应用程序如何从服务器端API加载图像?
答案 0 :(得分:3)
有三种解决方法,最好的解决方法是使用签名的网址
<img src="http://server-domain.com/path/to/image?guid=f6fc84c9f21c24907d6bee6eec38cabab5fa9a7be8c4a7827fe9e56f2">
服务器收到请求后,如果尚未达到到期时间,则必须验证guid,当然,请检查guid是否为有效签名。
一些文件/文档服务器使用了这种方法,例如:保管箱,s3,cdn提供程序等。
在某些公司中查看该技术。
第二种方法是通过带有图像URL的查询字符串传递令牌。
<img src="http://server-domain.com/path/to/image?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c">
服务器收到请求后,您必须通过查询字符串验证令牌并使用内容进行响应。
第三个方法是创建经过身份验证的cookie,以验证图像的访问。
服务器收到请求后,您需要验证验证cookie是否有效。
答案 1 :(得分:1)
基于下面的杰夫逊·特诺里奥(Jeferson Tenorio)的答案(选项1),我对基本上相同的问题的解决方案是使用图像和用户的JWT令牌(例如, path/to/image?token=xxxx
。在laravel中,使用encrypt($your_object)
和decrypt($token)
(https://laravel.com/docs/5.7/encryption)可以轻松完成此操作,然后我使用提取的令牌来验证用户是否可以访问相关文件。但是可能还有许多其他库可以处理此问题。
如果存在任何安全问题,我会很好奇,但是从我的角度来看,JWT从未通过纯文本公开,并且加密依赖于恶意行为者不应该访问的秘密密钥,因此似乎应该相当安全。我唯一真正的抱怨是,使用此方法的令牌很长,无法生成可呈现的URL。