我已按照本文实现OAuth授权服务器.但是,当我使用post man获取令牌时,我在响应中收到错误:
"错误":"unsupported_grant_type"
我在某处读过Postman中的数据需要使用Content-type:application/x-www-form-urlencoded
.我在Postman中准备了所需的设置:
然而我的标题是这样的:
这是我的代码
public class CustomOAuthProvider : OAuthAuthorizationServerProvider
{
public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
context.Validated();
return Task.FromResult<object>(null);
}
public override Task MatchEndpoint(OAuthMatchEndpointContext context)
{
if (context.OwinContext.Request.Method == "OPTIONS" && context.IsTokenEndpoint)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Methods", new[] { "POST" });
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Headers", new[] { "accept", "authorization", "content-type" });
context.OwinContext.Response.StatusCode = 200;
context.RequestCompleted();
return Task.FromResult<object>(null);
}
return base.MatchEndpoint(context);
}
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
string allowedOrigin = "*";
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { allowedOrigin });
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Headers", new[] { …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个主要通过应用程序访问的网站,我想使用OAuth2进行用户注册和身份验证.由于它是Android应用程序,我将开始使用Google的OAuth2内容,因为它在Android上提供了不错的用户界面.
Google表示,"您可以选择使用Google的身份验证系统作为外包用户身份验证的方式.这可以消除创建,维护和保护用户名和密码存储的需要." 这就是我想要做的.然而,当我浏览他们的所有示例和诸如此类的东西时,我只能找到有关网站或应用程序根据Google服务对用户进行身份验证的内容.
事实上,当我使用Google的OAuth2注册我的应用程序("客户端")时,网站客户端和"已安装"客户端(即移动应用程序)可以选择,但不能同时选择两者.我可以创建两个单独的客户端,但我读了OAuth2草案,我认为会有一个问题,我现在将解释.
以下是我设想的工作方式:
AccountManager
类为Google的API请求访问令牌.AccountManager
使用手机上存储的凭据连接到Google的OAuth2服务器,并要求提供访问令牌.AccountManager
将访问令牌返回给MyApp.那我该怎么做呢?请不要说"使用OpenID"或"不要使用OAuth2"或其他类似无益的答案.哦,我真的想用漂亮的,以保持AccountManager
用户界面,而不是糟糕的弹出WebView
小号
来自Nikolay的临时答案(我会报告它是否有效!)它实际上应该有效,而Google的服务器并不关心访问令牌的来源.对我来说似乎有点不安全,但我会看看它是否有效!
我用Facebook而不是Google实现了这种模式,它完全有效.OAuth2服务器不关心访问令牌的来源.至少Facebook没有,所以我认为谷歌也没有.
鉴于此,存储访问令牌是一个非常糟糕的主意!但是我们也不想让Facebook/Google的服务器检查每个请求的身份验证,因为它会减慢一切.可能最好的办法是为您的站点添加一个额外的身份验证cookie,当您的访问令牌被验证时,您可以将其分发,但更简单的方法就是将访问令牌视为密码并存储其哈希值.你不需要加盐它,因为访问令牌真的很长.所以上面的步骤变成了:
9. MySite需要使用访问令牌验证用户.首先,它检查哈希有效访问令牌的缓存.如果在那里找到令牌的散列,则它知道用户已经过身份验证.否则,它会按照此处所述与Google进行核对- Google,"此令牌是否有效?".
10.如果Google说访问令牌无效,我们会告诉用户GTFO.否则谷歌说"是的,这是一个有效的用户",然后我们检查我们的注册用户数据库.如果找不到Google用户名(或Facebook id,如果使用Facebook),我们可以创建新用户.然后我们缓存访问令牌的散列值.
我正在使用spring oauth2和JWT令牌.有人可以帮助我如何撤销JWT令牌?
正如 http://projects.spring.io/spring-security-oauth/docs/oauth2.html所述,撤销是通过刷新令牌完成的.但它似乎没有用.
为什么在Facebook OAuth2身份验证流程中需要"代码"和"令牌",如下所述:https://developers.facebook.com/docs/authentication/?
如果您查看OAuth对话框参考(https://developers.facebook.com/docs/reference/dialogs/oauth/),您似乎只使用该令牌来获取有关该用户的信息,并且如果您指定response_type
参数为token
或code,token
,然后您第一次获得令牌.
为什么需要获取"代码"然后使用代码获取"令牌"而不是直接获取令牌?
我想我误解了关于OAuth如何工作的基本信息,但是https://graph.facebook.com/oauth/access_token
如果你第一次使用对话框获得令牌,你似乎完全避免了请求.
由于offline_access
权限是在Facebook的弃用认证流程,我们有问题歌厅所谓的长期生活的访问令牌没有这个权限.
在Facebook的文档中有关它的弃用说,服务器端OAuth生成的访问令牌将是长期存在的,但事实并非如此.
我错过了什么吗?应用设置中的一些设置?我需要使用一些特殊代码来延长访问令牌的到期时间?据我所知,对于服务器端身份验证,getAccessToken()
当用户登录时,可以通过PHP SDK 的方法访问访问令牌.
php facebook-graph-api oauth-2.0 facebook-oauth facebook-php-sdk
我正在尝试制作一个服务器应用程序来定期从我自己的GA帐户中提取Google Analytics数据.请注意,它是一个访问我自己的数据的个人服务器端应用程序,即没有最终用户访问此应用程序.
因此,我在Google API控制台中将我的应用程序注册为服务应用程序,该应用程序为我提供了客户端ID和私钥.据我所知,服务应用程序不使用应用程序密钥和重定向URL,因为此服务器到服务器身份验证流程中没有最终用户.实际上,Google API控制台没有给我任何机密,也没有提示我提供重定向网址.
不幸的是,我无法弄清楚如何在Google的PHP客户端API中验证我的服务应用程序.有关于验证的Web应用程序广泛的文件与最终用户.
Google的文档表明,可以通过使用私钥对JWT请求进行签名来验证服务器到服务器.我只是无法弄清楚如何在PHP客户端API中做(虽然我浏览了源代码,但肯定有一个脚本用私钥签署请求.)
我在这里错过了什么吗?如何使用我的私钥和Google PHP客户端API对服务应用程序执行身份验证?
编辑清晰
我正在使用 firebase 及其 google auth 工具,一切正常,用户数据保存在数据库中,但每次出现弹出窗口时我都会收到错误(Cross-Origin-Opener-Policy 策略会阻止 window.close 调用)
我正在使用 next js 并帮助我解决错误,谢谢
我找到了这个问题,它有一个答案,但从那时起facebook改变了令牌格式,现在它是这样的:
AAACEdEose0cBACgUMGMCRi9qVbqO3u7mdATQzg[more funny letters]ig8b3uss9WrhGZBYjr20rnJu263BAZDZD
Run Code Online (Sandbox Code Playgroud)
简而言之,你无法从中推断出任何东西.我还找到了访问令牌调试器,它显示了我正在寻找的信息,如果你粘贴一个令牌,这很好,但不能帮助我以编程方式进行.
重点是,如果有人为用户获取令牌,他可以使用它来访问图表,这就是我在我的应用程序中所做的事情 - 我想确保人们转发我的应用程序发给他们的令牌,而不是另一个.
我的申请流程是:
我的应用程序是安全的,无论facebook如何,访问完成也都经过身份验证,但是!在这个流程中,我发现的弱链接是我无法验证我获得的访问令牌是否已经为我的应用程序签名 - 我不喜欢它,因为我将令牌缓存用于离线使用,我希望100%确定它们是我的应用程序,具有我的权限.
那么验证我获得的令牌与我的应用程序相关的(最佳)方式是什么(与用户的关系,我使用令牌来访问/我并查看此令牌用于哪个用户)
我不需要解密令牌(我猜它是某种AES),我只是在找一个会告诉我令牌与我的应用程序ID匹配的端点.
(编辑:使用C#SDK,如果重要..但是图形/休息调用以提供该信息同样好:))
我有一个带有OAuth 2.0身份验证的Google App.一切都习以为常,但最近我开始获得以下"请求许可"屏幕:
奇怪的是,当我通过时,我得到了这个屏幕access_type=online
.再次,这曾经工作到最近.
这可能是什么原因?TIA
编辑:
要求的范围是:
https://www.googleapis.com/auth/userinfo.email
https://www.googleapis.com/auth/userinfo.profile
Run Code Online (Sandbox Code Playgroud)
我已经尝试过了:
access_type=online
approval_prompt=auto
编辑#2:
这是我用来生成身份验证URL的python代码:
encoded_params = urllib.urlencode({
"response_type" : "code",
"client_id" : MY_CLIENT_ID,
"scope" : " ".join(MY_SCOPES),
"redirect_uri" : MY_REDIRECT_URI,
"state" : random_security_token,
"access_type" : "online",
"approval_prompt" : "auto",
})
auth_url = "https://accounts.google.com/o/oauth2/auth?" + encoded_params
Run Code Online (Sandbox Code Playgroud)
更新(10月14日):
即使使用新的范围,我仍然会获得同意屏幕.最近我得到了一个我用于身份验证的新设备.
我的 SPA 应用程序使用以下架构(来源):
这假设我的客户端应用程序知道刷新令牌,因为如果不存在用户凭据(例如电子邮件/密码),我需要它来请求新的访问令牌。
我的问题:我在哪里存储我的客户端应用程序中的刷新令牌?关于这个话题有很多关于 SO 的问题/答案,但关于刷新令牌,答案尚不清楚。
访问令牌和刷新令牌不应存储在本地/会话存储中,因为它们不是任何敏感数据的地方。因此,我会将访问令牌存储在httpOnly
cookie 中(即使有 CSRF),无论如何,我对资源服务器的大多数请求都需要它。
但是刷新令牌呢?我不能将它存储在 cookie 中,因为 (1) 它会随着每个请求发送到我的资源服务器,这也使它容易受到 CSRF 的攻击和 (2) 它会发送暴露访问/刷新令牌与相同的攻击向量.
我能想到的解决方案有以下三种:
1) 将刷新令牌存储在内存中的 JavaScript 变量中,这有两个缺点:
尤其是后一个缺点会导致糟糕的用户体验。
2) 将访问令牌存储在会话存储中,并通过Bearer access_token
授权标头将其发送到我的资源服务器。然后我可以使用httpOnly
cookie 作为刷新令牌。这有一个我能想到的缺点:
3) 将两个令牌保存在httpOnly
cookie 中,这具有上述缺点,即两个令牌都暴露于相同的攻击向量。
也许除了我提到的缺点之外还有另一种或更多的方式(请告诉我),但最终一切都归结为我将刷新令牌保存在客户端的什么位置?它是httpOnly
cookie 还是内存中的 JS 变量?如果是前者,那么我应该把我的访问令牌放在哪里?
很高兴从熟悉该主题的人那里获得有关如何以最佳方式执行此操作的任何线索。