OAuth2登录(非授权)

OAuth2登录(非授权),oauth,oauth-2.0,Oauth,Oauth 2.0,我已经根据实现了OAuth2注册工作流(Java) 我使用GitLab作为OAuth2提供者 在用户为他的帐户授予访问我的应用程序的权限之后,我得到了一个OAuth令牌(以及刷新令牌和其他东西),我能够代表用户发出API请求,所以这工作正常 这样我就可以获得用户的电子邮件地址,我用它来创建一个内部用户 我的问题是: 我的应用程序为用户生成一个令牌(连同OAuthToken)是一种实践,还是应该只使用OAauth提供者发布的令牌?(我的应用程序还具有本地身份验证和承载令牌)。此令牌将用于进一步的A

我已经根据实现了OAuth2注册工作流(Java)

我使用GitLab作为OAuth2提供者

在用户为他的帐户授予访问我的应用程序的权限之后,我得到了一个OAuth令牌(以及刷新令牌和其他东西),我能够代表用户发出API请求,所以这工作正常

这样我就可以获得用户的电子邮件地址,我用它来创建一个内部用户

我的问题是:

  • 我的应用程序为用户生成一个令牌(连同OAuthToken)是一种实践,还是应该只使用OAauth提供者发布的令牌?(我的应用程序还具有本地身份验证和承载令牌)。此令牌将用于进一步的API-客户端通信(作为承载存储在Angular2本地存储器中)

  • 如何只登录?当OAuth用户访问我的web服务时,我如何知道该用户是OAuth用户以及哪个OAuth令牌属于他?用户如何在不提供电子邮件或密码的情况下登录?(用户没有密码)我想我必须再次将他重定向到OAuth提供程序,但我不希望我的用户每次登录时都授予访问权限


  • 答案1:

    尽管您可以使用OAuth提供商提供的令牌,但考虑到可能会出现将其公开的风险,您不应使用它

    相反,您应该将OAuth提供者提供的令牌安全地保存到数据库中,并使用另一个令牌对进一步的api调用进行身份验证。(你可以用)

    答案2:

    有两种类型的系统

  • 它始终使用OAuth提供程序来标识用户。(例)
  • 它提供OAuth登录和传统登录/注册。(例)
  • 如果希望应用程序遵循第二种方法,则应在用户使用OAuth提供程序登录时要求用户首次创建密码

    这将允许用户通过传统和OAuth两种方法登录您的应用程序

  • 要识别应用程序的用户,您应该使用HTTP会话或发行自己的令牌。不要使用OAuth2提供程序生成的令牌-它们仅用于后端(扮演OAuth2客户机的角色)
  • 要在应用程序中使用外部身份验证,可能需要使用OpenID Connect,而不是纯OAuth2。OpenID Connect扩展了OAuth2,它用于身份验证而不是权限委托。然后使用scope=openid的隐式流(而不是身份验证代码授权),前端应用程序(HTML+JavaScript)将获得一个由OAuth2提供者签名的ID令牌。签名验证成功后,您的后端可以相信该客户端就是ID令牌(在其“子”字段中)中描述的客户端。然后,您可以继续使用ID令牌,也可以生成自己的令牌

  • 也许我不清楚:我的问题是如何在没有用户名和密码的情况下登录用户,就像很多网站上的Facebook或Google登录按钮一样。