我爱JWT.合作真的很有趣.我的问题是:如果我得到JWT并且我可以解码有效载荷,那么它是如何安全的?我不能只是从标题中获取令牌,解码并更改有效负载中的用户信息,并使用相同的正确编码密码将其发回?
我知道他们必须是安全的,但我真的很想了解这些技术.我错过了什么?谢谢!
我正在开发几个Web服务和一些客户端(Web应用程序,移动设备等),它们将通过HTTP与所述服务进行交互.我目前的工作项目是为产品设计身份验证和授权解决方案.我已决定利用外部身份提供商(如Facebook,Google,Microsoft,Twitter等)进行身份验证.
我正试图解决这个问题,"当我的服务器发出请求时,我怎么知道用户是谁以及我怎么能确定?".下面还有更多问题......
系统应使用基于令牌的身份验证(而不是cookie或基本身份验证).
我相信这是扩展多个客户端和服务器同时提供松散耦合的正确选择.
根据我对基于令牌的身份验证的阅读和理解,以下是我想象的工作流程.现在让我们在Facebook浏览器上关注Facebook.我的假设是其他外部身份提供者应该具有类似的能力,尽管我还没有确认.
请注意,截至撰写时,我的基础是Facebook登录版2.2
我想象对于后续的服务器请求会重复步骤5-9(当用户的访问令牌有效时 - 未过期,从FB端撤销,应用权限更改等)
这是一个帮助您完成这些步骤的图表.请理解这个系统不是单页面应用程序(SPA).提到的Web服务是基本上为客户端提供JSON数据的API端点; 它们不提供HTML/JS/CSS(Web客户端服务器除外).

首先,根据我的前言和要求,所描述的方法是否有任何明显的差距/陷阱?
是否正在向Facebook执行出站请求,以根据所需/推荐的客户端请求验证访问令牌(上面的步骤6-8)?
我至少知道,我必须验证来自客户端请求的访问令牌.但是,我不知道在第一次验证后进行后续验证的推荐方法.如果有典型的模式,我很想听听它们.据我所知,根据我的要求,他们可能依赖于应用程序; 但是,我只是不知道该寻找什么.一旦我有了基本想法,我就会进行尽职调查.
例如,可能的想法:
在第一次验证完成后散列访问令牌+ userId对,并将其存储在分布式缓存中(可由所有Web服务器访问),其到期时间等于访问令牌.根据客户端的后续请求,对访问令牌+ userId对进行散列并检查其是否存在于缓存中.如果存在,则请求被授权.否则,请访问Facebook图形API以确认访问令牌.我假设如果我使用HTTPS(我会这样),这个策略可能是可行的.但是,性能如何比较?
此StackOverflow问题中接受的答案建议在Facebook用户令牌的第一次验证完成后创建自定义访问令牌.然后,自定义令牌将被发送到客户端以用于后续请求.不过,我想知道这是否比上述解决方案更复杂.这需要实现我自己的身份提供者(我想避免的事情,因为我想首先使用外部身份提供者......).这个建议有什么好处吗?
是signedRequest字段存在于在上述(步骤提到#3的响应此处),相当于签名的请求参数这里在"游戏画布登录"流?
它们似乎被暗示为等同,因为前者在文档中与后者相关联.但是,我很惊讶在Web文档的"手动构建登录流程" 页面中没有提到游戏页面上提到的验证策略.
如果#3的答案为"是",那么解码签名的相同身份确认策略是否可以与服务器端预期使用的策略进行比较?
我不知道是否这可以利用,而不是把所述debug_token图形API的出站呼叫(步骤#6的上方),以确认访问令牌的建议这里:

当然,为了在服务器端进行比较,需要将签名的请求部分与请求一起发送到服务器(上面的步骤#5).除了在不牺牲安全性的情况下的可行性之外,我想知道性能与进行出站呼叫相比如何.
虽然我正处于这种状态,但在什么情况/出于何种目的,您是否会将用户的访问令牌持久存储到数据库中?我没有看到我需要这样做的场景,但是,我可能会忽视某些事情.我很好奇是一些常见的场景可能会引发一些想法.
谢谢!
security authentication facebook facebook-authentication facebook-access-token
我正在尝试设计REST API以支持各种移动客户端(iOS和Android应用程序).这些应用程序将允许用户使用Facebook登录以及我们自己的电子邮件身份验 您可以参考下图来了解我的设计

授权分为两级:
第一个是使用OAuth2的"客户端(或应用程序)授权".因此,当用户在移动设备上安装我们的应用程序并启动应用程序时,首先,应用程序进行"客户端(应用程序)授权",如上图所示(第1张图像).并且服务器向access_token客户端发回长期存储以用于所有后续调用.我的问题是:
Q1)可以看到客户端发送client_key和client_secret,我将它们存储在client_info表中.这个秘密应该是纯文本还是应该是可解密的格式?如果我加密它,我仍然需要在我的系统中的某处保留加密密钥.那它将如何使其安全?同样在每次通话中,解密都是一种开销.
Q2)是否可以access_token在redis中以纯文本格式缓存客户端并首先使用该缓存?
Q3)为了更安全,我要求客户发送appsecret_proof以确保access_token,他们发送的只属于此客户端.它使用与Facebook相同的概念https://developers.facebook.com/docs/graph-api/securing-requests#appsecret_proof.它是hash_hmac('sha256', access_token, client_secret)
Q4)我们将只拥有自己的2个移动应用程序(每个用于iOS和Android),并且不提供第三方使用我们的API来开发其他应用程序.这意味着,client_info对于每种类型的应用,我们的表只有两行一个.所以可以,在应用程序代码中,我们保留client_key并client_secret硬编码?如果是,那么将来当我们必须使新秘密失效并使用新秘密时,我们将如何取代这些信息呢?
Q5)因为它是我们自己的应用程序几年,所以会有多个access_token将被创建针对相同client_key和client_secret.为了保存所有这些,在redis中存储client_key键和array of all access_tokens值是一个好主意.将来,当我们将API打开给第三方时,这个redis存储设计仍然可以扩展吗?
=================
稍后,用户决定对我的应用程序执行某些操作,因为我们需要用户登录他的帐户.对于该用户,请单击"facebook login".我的应用程序facebook access_token从Facebook 获取和fb用户的id并将这些信息传递给API服务器(如第二张图所示).API服务器获取该令牌并调用facebook API来验证它access_token.一旦令牌被验证,服务器使用该用户相关的一些元数据与FB访问令牌一起产生我们自己user_access_token,让我们说utoken.并将其传递utoken回客户端,以便在每个后续用户特定的API调用中传回.我的问题是:
Q1)可以将其保存utoken在数据库,user_token表中.这utoken应该是纯文本还是应该是可解密的格式?如果我加密它,我仍然需要在我的系统中的某处保留加密密钥.那它将如何使其安全?同样在每次通话中,解密都是一种开销.
Q2)在每个用户特定的API调用中,我是否应该每次调用facebook进行检查facebook access_token仍然有效?我相信我不应该,因为这对我没有任何意义.请注意,Facebook仅用于"facebook登录".
Q3)我应该加密生成utoken什么信息?我想有一个散列或用户的关联数组email,user id,role …
我正在开发一个应用程序,我必须使用facebook登录从我的后端服务器访问数据.我搜索了这个并得到了:
我已成功将我的应用程序与Facebook连接,即现在用户可以从我的应用程序登录到Facebook.但我现在不知道如何获取用户的访问令牌以及如何在服务器上验证此访问令牌.
你能为我提供一些示例代码吗?请帮助我,我很长时间陷入其中.
我有一个Android应用程序,可为用户提供其Facebook帐户使用它的功能。为此,我集成了Facebook登录。但是,我对Facebook的用户注册感到困惑。
用户登录后,Facebook将提供userId,电子邮件和访问令牌。我可以使用它们在后端为用户创建一个帐户。让我们演示一下场景:
用户至上
1- User logged-in by Facebook.
2- The email is checked by server and returns no such user
3- An account is created by the information from Facebook
4- The user keeps using the app with this account.
Run Code Online (Sandbox Code Playgroud)
用户再次来
1- User logged-in by Facebook.
2- The email is checked by the server and returns that there exists a user.
Run Code Online (Sandbox Code Playgroud)
在这里,这里是问题:
1-服务器如何信任真正来自Facebook的请求,以便服务器可以响应应用程序“他可以登录”?可以肯定,我是否也应该通过在服务器端连接到Facebook来验证访问令牌?
2-如果没有,如何以一种非常安全的方式使用Facebook登录名来注册用户?
我正在从头开始构建我的第一个REST API,并试图了解处理API令牌的最佳方法.我不是在谈论"用户身份验证"(我会使用OAuth).我正在谈论应用程序用来标识自身的公共/私有令牌,以便我的API可以决定是否允许应用程序首先使用API.
某些API资源可供具有有效令牌的任何人使用,有些则需要OAuth身份验证.我将通过HTTPS与API进行通信,但我仍然希望确保遵循某种来回传递令牌的标准.
我知道这个问题并不是什么新鲜事,可能已经在互联网上进行了讨论.
我是新手,但经过一些研究,我同意这是安全的,因为匿名可以嗅到令牌,但无法在其上附加任何内容.我打算将JWT存储在HTML5Storage中,并对有效负载进行解码以获取一些敏感信息:DisplayName,email_address和role_info等.
这是我的问题,匿名嗅闻我的JWT令牌并代表我行事?如果可能,我该如何避免?