标签: oauth-2.0

通过Postman调用OWIN OAuth安全Web Api尝试获取JWT时获取"错误":"unsupported_grant_type"

我已按照本文实现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)

c# oauth-2.0 asp.net-web-api owin

64
推荐指数
4
解决办法
9万
查看次数

使用OAuth2为app*和*网站进行身份验证

我正在开发一个主要通过应用程序访问的网站,我想使用OAuth2进行用户注册和身份验证.由于它是Android应用程序,我将开始使用Google的OAuth2内容,因为它在Android上提供了不错的用户界面.

Google表示,"您可以选择使用Google的身份验证系统作为外包用户身份验证的方式.这可以消除创建,维护和保护用户名和密码存储的需要." 这就是我想要做的.然而,当我浏览他们的所有示例和诸如此类的东西时,我只能找到有关网站应用程序根据Google服务对用户进行身份验证的内容.

事实上,当我使用Google的OAuth2注册我的应用程序("客户端")时,网站客户端和"已安装"客户端(即移动应用程序)可以选择,但不能同时选择两者.我可以创建两个单独的客户端,但我读了OAuth2草案,我认为会有一个问题,我现在将解释.

以下是我设想的工作方式:

OAuth2流程图

  1. 用户要求MyApp访问他的私人数据.
  2. 应用程序使用Android的AccountManager类为Google的API请求访问令牌.
  3. Android向用户说"应用'MyApp'希望在Google上访问您的基本信息.这可以吗?"
  4. 用户说是的.
  5. AccountManager 使用手机上存储的凭据连接到Google的OAuth2服务器,并要求提供访问令牌.
  6. 返回访问令牌(在绿线后面).
  7. AccountManager 将访问令牌返回给MyApp.
  8. MyApp向MySite发送请求以获取用户的私有数据,包括访问令牌.
  9. MySite需要使用访问令牌验证用户.它验证了此处描述的令牌,谷歌 - "谷歌,这个令牌有效吗?".
  10. 现在,我想要发生的事情是谷歌说"是的,无论是谁给你的确是那个用户."但我认为实际发生的事情(基于OAuth2草案和Google的文档)是它会说"不"方式!该令牌仅对MyApp有效,而且你是MySite.GTFO!".

那我该怎么做呢?请不要说"使用OpenID"或"不要使用OAuth2"或其他类似无益的答案.哦,我真的想用漂亮的,以保持AccountManager用户界面,而不是糟糕的弹出WebView小号

编辑

来自Nikolay的临时答案(我会报告它是否有效!)它实际上应该有效,而Google的服务器并不关心访问令牌的来源.对我来说似乎有点不安全,但我会看看它是否有效!

更新

我用Facebook而不是Google实现了这种模式,它完全有效.OAuth2服务器不关心访问令牌的来源.至少Facebook没有,所以我认为谷歌也没有.

鉴于此,存储访问令牌是一个非常糟糕的主意!但是我们也不想让Facebook/Google的服务器检查每个请求的身份验证,因为它会减慢一切.可能最好的办法是为您的站点添加一个额外的身份验证cookie,当您的访问令牌被验证时,您可以将其分发,但更简单的方法就是将访问令牌视为密码并存储其哈希值.你不需要加盐它,因为访问令牌真的很长.所以上面的步骤变成了:

9. MySite需要使用访问令牌验证用户.首先,它检查哈希有效访问令牌的缓存.如果在那里找到令牌的散列,则它知道用户已经过身份验证.否则,它会按照此处所述与Google进行核对- Google,"此令牌是否有效?".

10.如果Google说访问令牌无效,我们会告诉用户GTFO.否则谷歌说"是的,这是一个有效的用户",然后我们检查我们的注册用户数据库.如果找不到Google用户名(或Facebook id,如果使用Facebook),我们可以创建新用户.然后我们缓存访问令牌的散列值.

android oauth google-authentication oauth-2.0

63
推荐指数
2
解决办法
2万
查看次数

如何撤销JWT令牌?

我正在使用spring oauth2和JWT令牌.有人可以帮助我如何撤销JWT令牌?

正如 http://projects.spring.io/spring-security-oauth/docs/oauth2.html所述,撤销是通过刷新令牌完成的.但它似乎没有用.

oauth-2.0 spring-security-oauth2

62
推荐指数
5
解决办法
3万
查看次数

Facebook OAuth 2.0"代码"和"令牌"

为什么在Facebook OAuth2身份验证流程中需要"代码"和"令牌",如下所述:https://developers.facebook.com/docs/authentication/

如果您查看OAuth对话框参考(https://developers.facebook.com/docs/reference/dialogs/oauth/),您似乎只使用该令牌来获取有关该用户的信息,并且如果您指定response_type参数为tokencode,token,然后您第一次获得令牌.

为什么需要获取"代码"然后使用代码获取"令牌"而不是直接获取令牌?

我想我误解了关于OAuth如何工作的基本信息,但是https://graph.facebook.com/oauth/access_token如果你第一次使用对话框获得令牌,你似乎完全避免了请求.

facebook oauth-2.0 facebook-authentication

61
推荐指数
8
解决办法
3万
查看次数

自offline_access弃用以来如何扩展访问令牌的有效性

由于offline_access 权限是在Facebook的弃用认证流程,我们有问题歌厅所谓的长期生活的访问令牌没有这个权限.

Facebook的文档中有关的弃用说,服务器端OAuth生成的访问令牌将是长期存在的,但事实并非如此.

我错过了什么吗?应用设置中的一些设置?我需要使用一些特殊代码来延长访问令牌的到期时间?据我所知,对于服务器端身份验证,getAccessToken()当用户登录时,可以通过PHP SDK 的方法访问访问令牌.

php facebook-graph-api oauth-2.0 facebook-oauth facebook-php-sdk

60
推荐指数
3
解决办法
5万
查看次数

服务应用程序和Google Analytics API V3:服务器到服务器OAuth2身份验证?

我正在尝试制作一个服务器应用程序来定期从我自己的GA帐户中提取Google Analytics数据.请注意,它是一个访问我自己的数据的个人服务器端应用程序,即没有最终用户访问此应用程序.

因此,我在Google API控制台中将我的应用程序注册为服务应用程序,该应用程序为我提供了客户端ID私钥.据我所知,服务应用程序不使用应用程序密钥重定向URL,因为此服务器到服务器身份验证流程中没有最终用户.实际上,Google API控制台没有给我任何机密,也没有提示我提供重定向网址.

不幸的是,我无法弄清楚如何在Google的PHP客户端API中验证我的服务应用程序.有关于验证的Web应用程序广泛的文件最终用户.

Google的文档表明,可以通过使用私钥对JWT请求进行签名来验证服务器到服务器.我只是无法弄清楚如何在PHP客户端API中做(虽然我浏览了源代码,但肯定有一个脚本用私钥签署请求.)

我在这里错过了什么吗?如何使用我的私钥和Google PHP客户端API对服务应用程序执行身份验证?

编辑清晰

php google-api google-analytics-api oauth-2.0 jwt

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

使用 google auth 时,Cross-Origin-Opener-Policy 策略会阻止 window.close 调用错误

我正在使用 firebase 及其 google auth 工具,一切正常,用户数据保存在数据库中,但每次出现弹出窗口时我都会收到错误(Cross-Origin-Opener-Policy 策略会阻止 window.close 调用)

在此输入图像描述 在此输入图像描述

我正在使用 next js 并帮助我解决错误,谢谢

cors oauth-2.0 firebase firebase-authentication next.js

60
推荐指数
3
解决办法
5万
查看次数

从用户访问令牌获取应用程序ID(或验证源应用程序是否有令牌)

我找到了这个问题,它有一个答案,但从那时起facebook改变了令牌格式,现在它是这样的:

AAACEdEose0cBACgUMGMCRi9qVbqO3u7mdATQzg[more funny letters]ig8b3uss9WrhGZBYjr20rnJu263BAZDZD
Run Code Online (Sandbox Code Playgroud)

简而言之,你无法从中推断出任何东西.我还找到了访问令牌调试器,它显示了我正在寻找的信息,如果你粘贴一个令牌,这很好,但不能帮助我以编程方式进行.

重点是,如果有人为用户获取令牌,他可以使用它来访问图表,这就是我在我的应用程序中所做的事情 - 我想确保人们转发我的应用程序发给他们的令牌,而不是另一个.

我的申请流程是:

  1. 从Facebook获取访问令牌(没有什么特别的,就像在这里描述的那样,服务器端流.(也是iPhone和Android和使用,但如果我没记错的话他们有类似的流程))
    [设备] < - > [facebook ]
  2. 使用该访问令牌,设备将使用令牌
    [device] < - > [Jonathan的应用程序] 访问我的应用程序服务器
    在我的服务器上,我将访问令牌附加到用户并使用它来为我的应用程序中的该用户授予权限.(使用facebook连接验证用户)


我的应用程序是安全的,无论facebook如何,访问完成也都经过身份验证,但是!在这个流程中,我发现的弱链接是我无法验证我获得的访问令牌是否已经为我的应用程序签名 - 我不喜欢它,因为我将令牌缓存用于离线使用,我希望100%确定它们是我的应用程序,具有我的权限.

那么验证我获得的令牌与我的应用程序相关的(最佳)方式是什么(与用户的关系,我使用令牌来访问/我并查看此令牌用于哪个用户)

我不需要解密令牌(我猜它是某种AES),我只是在找一个会告诉我令牌与我的应用程序ID匹配的端点.

(编辑:使用C#SDK,如果重要..但是图形/休息调用以提供该信息同样好:))

facebook oauth-2.0 facebook-c#-sdk facebook-oauth

59
推荐指数
3
解决办法
3万
查看次数

"当app_type = online时,此应用程序希望:具有脱机访问权限"

我有一个带有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日):

即使使用新的范围,我仍然会获得同意屏幕.最近我得到了一个我用于身份验证的新设备.

oauth-2.0 google-oauth

58
推荐指数
5
解决办法
2万
查看次数

在哪里存储客户端上的刷新令牌?

我的 SPA 应用程序使用以下架构(来源):

在此处输入图片说明

这假设我的客户端应用程序知道刷新令牌,因为如果不存在用户凭据(例如电子邮件/密码),我需要它来请求新的访问令牌。

我的问题:我在哪里存储我的客户端应用程序中的刷新令牌?关于这个话题有很多关于 SO 的问题/答案,但关于刷新令牌,答案尚不清楚。

访问令牌和刷新令牌不应存储在本地/会话存储中,因为它们不是任何敏感数据的地方。因此,我会将访问令牌存储在httpOnlycookie 中(即使有 CSRF),无论如何,我对资源服务器的大多数请求都需要它。

但是刷新令牌呢?我不能将它存储在 cookie 中,因为 (1) 它会随着每个请求发送到我的资源服务器,这也使它容易受到 CSRF 的攻击和 (2) 它会发送暴露访问/刷新令牌与相同的攻击向量.

我能想到的解决方案有以下三种:


1) 将刷新令牌存储在内存中的 JavaScript 变量中,这有两个缺点:

  • a) 易受 XSS 攻击(但可能不如本地/会话存储那么明显
  • b) 如果用户关闭浏览器选项卡,它会丢失“会话”

尤其是后一个缺点会导致糟糕的用户体验。


2) 将访问令牌存储在会话存储中,并通过Bearer access_token授权标头将其发送到我的资源服务器。然后我可以使用httpOnlycookie 作为刷新令牌。这有一个我能想到的缺点:

  • a) 每次向资源服务器发出请求时,刷新令牌都会暴露给 CSRF。

3) 将两个令牌保存在httpOnlycookie 中,这具有上述缺点,即两个令牌都暴露于相同的攻击向量。


也许除了我提到的缺点之外还有另一种或更多的方式(请告诉我),但最终一切都归结为我将刷新令牌保存在客户端的什么位置?它是httpOnlycookie 还是内存中的 JS 变量?如果是前者,那么我应该把我的访问令牌放在哪里?

很高兴从熟悉该主题的人那里获得有关如何以最佳方式执行此操作的任何线索。

authentication cookies oauth token oauth-2.0

58
推荐指数
4
解决办法
5万
查看次数