当前位置: 首页 > 知识库问答 >
问题:

在客户端之间使用联合登录(Google,FB等)的正确方法

古凌
2023-03-14

我在Android这样的流行平台上看到了这个问题的解决

  • 我有一个RESTful服务器
  • 我有一个移动客户端

如何去

  1. 创建一个使用联邦OAuth(Google、FB、Microsoft等)的注册,并使用它进一步验证后续API调用

这就是我的想法

  1. 客户端应用程序调用登录提供商的OAuth对话框,并接收(在用户同意后)、访问令牌和用户ID。
  2. 它存储在客户机上,并传递给服务器
  3. 服务器可以使用accessToken验证(检索)用户信息
  4. 服务器可以返回IDtoken/RefreshToken,客户端可以在后续的API调用中使用

我的问题是

  1. 这是正确的方法吗

有没有一个例子,如何在不使用SDK的情况下为Google Auth(用于客户端和Web服务器)实现这一点。

共有3个答案

苏丰茂
2023-03-14

这是正确的方法吗?

是的,差不多。你在描述标准承载令牌授权。访问

客户端是否可以存储访问权限(最佳实践?)

对必须存储OAuth刷新令牌。您可以存储ID和访问令牌(而不是将它们保存在内存中)

在网络上,您不应该使用本地存储。相反,使用http只cookie。

在手机上,使用平台功能,如Android的账户管理器或iOS的钥匙扣服务。

客户端能否将accessToken传递到后端(最佳做法?)

是的,这就是它的目的。

有没有一个例子,如何在不使用SDK的情况下为Google Auth(用于客户端和Web服务器)实现这一点。

我不建议这样做有几个原因。首先,你的实现不如谷歌的安全,谷歌有一个团队致力于确保他们的软件开发工具包是最安全的。其次,你还没有准备好尝试这个实现。从软件开发工具包开始,让它工作,然后回到这个问题上来。

使用Auth0这样的解决方案将是最简单的开始方式。

房学文
2023-03-14

首先,任何调用Google API的应用程序都需要在API控制台中启用这些API。

现在,任何使用OAuth 2.0访问Google API的应用程序都必须具有授权凭据,该凭据可识别Google OAuth 2.0服务器上的应用程序。

有关凭据,请转到凭据页面,然后根据您的申请填写表格。

注意:谷歌建议您设计应用程序的认证endpoint,这样应用程序就不会向页面上的其他资源公开授权代码。

获取凭据后,从API控制台下载client_secret.json文件,并将文件安全地存储在只有应用程序可以访问的位置。

对于HTTP/REST,不需要安装任何库来调用oAuth 2.0

Google的OAuth 2.0endpoint位于https://accounts.google.com/o/oauth2/v2/auth。此endpoint只能通过HTTPS访问。普通HTTP连接将被拒绝。

作为客户机,基本身份验证只需在HTTP请求中包含一个授权头,由用户名和密码组成,用冒号分隔,然后用Base64编码。例如,在Ruby(1.9)中使用RestClient:

require 'restclient'
require 'base64'
auth = "Basic " + Base64::strict_encode64("#{username}:#{password}")
response = RestClient.get("https://myhost/resource",:authorization=>auth)

令牌值对客户端是不透明的,但是可以由资源服务器解码,以便它可以检查客户端和用户是否有访问请求资源的权限。

Authorization: Bearer <TOKEN_VALUE>

将用户发送到谷歌的OAuth 2.0服务器。示例URL:

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.metadata.readonly&
 access_type=offline&
 include_granted_scopes=true&
 state=state_parameter_passthrough_value&
 redirect_uri=http%3A%2F%2Foauth2.example.com%2Fcallback&
 response_type=code&
 client_id=client_id

请求访问令牌。示例:

POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=your_client_id&
client_secret=your_client_secret&
redirect_uri=https://oauth2.example.com/code&
grant_type=authorization_code

使用API。例子:

GET /drive/v2/files HTTP/1.1
Authorization: Bearer <access_token>
Host: www.googleapis.com/
董花蜂
2023-03-14

标准选项是在移动应用程序中实现AppAuth模式,这意味着它登录并使用来自授权服务器(AS)的令牌。然后,移动应用程序将访问令牌发送到您的API。

完成后,通过谷歌、脸书等登录只需要在自动化系统中进行配置更改。添加新的登录/身份提供程序不需要更改您的用户界面或应用编程接口中的代码。

以下是我的Android和iOS示例,它们使用这种方法,你可以运行它们,或许可以借鉴它们的一些想法。

他们使用AWS Cognito作为as——如果我愿意,我可以将Cognito配置为使用Google或Facebook登录。此外,我还完全控制添加到访问令牌的作用域和声明,我的API可以使用这些令牌来授权请求。

答案

>

  • 几乎正确-您的客户端应用程序重定向到AS,而不是Google/Facebook直接

    是-移动客户端可以将刷新令牌存储在应用程序专用的操作系统安全存储中,这样用户就不需要在每次应用程序重启时登录。我的样品就是这么做的。

    是-移动客户端使用访问令牌作为API消息凭据

    图书馆

    我同意你的观点——在你的应用程序中避免谷歌/脸书库。然而,建议使用受人尊敬的AppAuth库——一旦集成,你的应用程序就符合任何自动化系统,并支持其所有身份验证流。

    出于兴趣,AppAuth模式甚至可能支持未来的高级场景,比如App2App,因为as可以与另一家公司的as联合(尽管我怀疑这与您目前的情况有关)。

    学习曲线

    最后值得一提的是,AppAuth的实现很棘手——有一些麻烦——但一旦完成,架构就处于良好状态。

  •  类似资料:
    • 我正在使用 我能够授权用户,然后我使用这个api给出了一个链接来gign出用户 它也注销了用户,但是当我刷新页面时,它不再要求重新登录。它是直接加载用户帐户,我想让它要求用户再次登录。有人能告诉我怎么做吗?

    • 问题内容: 我的项目使用Node.js和Express,但问题在于通用方法。 我们的用户全部来自FB,除FB外,我们没有其他任何身份验证。我们需要将某些操作与特定的FB用户相关联,还需要他们的令牌才能与FB通信。 目前, 我们这样做: 用户来到页面 有一些 看不见的 块:一个带有占位符,用于存储用户的化身和姓名(“已登录”),另一个带有用于触发FB登录的按钮(“已退出”) 使用FB JS SDK,

    •  说明 调用方法: $.f2e.util.yy.isInstallYY(fn); 函数说明: UDB登陆 参数说明: 参数名 类型 说明 备注 fn function 回调函数 null为未登录YY客户端 无 脚本 <script> $.f2e.util.yy.isInstallYY(function(data){ if(data){ //有登录

    • 这是我的场景(使用一个完全虚构的应用程序): Joe注册了“contests R Us”,这将帮助用户为其业务创建新的比赛 乔让人们亲自报名参加比赛(有些人不会使用电脑) 然后,Joe使用“Contests R Us”为每个注册并填写其信息(名、姓、电话)的人创建一个新的。这是将从中抽取胜利者的人才库。 一些亲自报名的人想要检查他们是否赢了,所以在“Contests R Us”创建一个新的用户帐户

    • 我试图使用Microsoft Graph API从应用程序管理Azure AD B2C用户,但我无法使用我的客户端id/secret进行身份验证。 首先,我按照这里的步骤注册了一个应用程序:https://docs.microsoft.com/en-us/azure/active-directory-b2c/microsoft-graph-get-started?tabs=app-雷加 在文章的最