首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跨平台多oauth2 API设计

跨平台多oauth2 API设计
EN

Stack Overflow用户
提问于 2016-09-19 10:18:52
回答 2查看 558关注 0票数 1

我正在使用RESTfull Web 2构建ASP.NET后端。FTM有三个客户端: AngularJs web应用程序、ASP.NET和IPhone应用程序。

我需要通过谷歌和Facebook为他们建立登录,并需要您的帮助,以设计它。

我的想法如下(以Google为例):

  1. 在Google控制台中,我创建了4 "OAuth 2.0客户机in“:
代码语言:javascript
复制
- for AngularJS app (type Web application, with allowed origins)
- for Android (type Android)
- for IOs (type IOs)
- for WEB API backend (type Web application without any allowed origins)

  1. 每个客户端都将通过自己的库/apis与Google联系,授权并请求用户同意所需的范围(),但也可以离线使用。这样,authorization_code就会被来自谷歌的客户端接收。
  2. 每个客户端都将调用web后端、获取方法、ExternalLogin和发送authorization_code作为输入参数。
  3. 网络后端将交换(通过Google ) re authorization_code到access_token,并从Google (通过Google )接收所有所需的用户信息。如果用户已经注册(如果没有- app将创建一个帐户),请检查数据库,然后发出本地访问令牌,用于所有对web后端的进一步调用。

好处很简单:

  • 简单的流程,每个客户都是一样的
  • 为每个客户端登录/注册的单一方法
  • 收集用户数据的逻辑位于一个地方(web后端)--因此,如果我们需要从用户那里收集额外的数据,我们只需要对后端进行更改。客户端只需要向同意屏幕添加作用域。

我的问题是:

  • 下面的流程是否正确和稳定?它也适用于Facebook auth吗?
  • FTM我被困在第4步,AngularJs用它的authorization_code和它的ClientId。Web后端正试图将这个authorization_code与另一个ClientId (web后端在Google中有自己的ClientId )交换为access_token ,我收到了一个错误: unauthorized_client。奇怪的是,在控制台中,所有客户端in都位于同一个“项目”中。有办法让它起作用吗?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-19 11:56:27

这个流程很好,但有一个例外:您只需要为实际的客户端应用程序(因此是)设置客户机ID(即Authorized JavaScript origins),而不是为后端设置。

至少在后端(只是一个不同的验证库),Facebook几乎是一样的,您应该不会有任何问题来抽象出一个通用的提供者接口。

至于在服务器端上验证ID令牌的完整性-在Google的端点上做一个GET来验证这个令牌,让他们担心验证算法:https://www.googleapis.com/oauth2/v3/tokeninfo?id_token={0}

以下是这幅画的样子:

代码语言:javascript
复制
private const string GoogleApiTokenInfoUrl = "https://www.googleapis.com/oauth2/v3/tokeninfo?id_token={0}";

public ProviderUserDetails GetUserDetails(string providerToken)
{
    var httpClient = new MonitoredHttpClient();
    var requestUri = new Uri(string.Format(GoogleApiTokenInfoUrl, providerToken));

    HttpResponseMessage httpResponseMessage;
    try
    {
        httpResponseMessage = httpClient.GetAsync(requestUri).Result;
    }
    catch (Exception ex)
    {
        return null;
    }

    if (httpResponseMessage.StatusCode != HttpStatusCode.OK)
    {
        return null;
    }

    var response = httpResponseMessage.Content.ReadAsStringAsync().Result;
    var googleApiTokenInfo = JsonConvert.DeserializeObject<GoogleApiTokenInfo>(response);

    if (!SupportedClientsIds.Contains(googleApiTokenInfo.aud))
    {
        Log.WarnFormat("Google API Token Info aud field ({0}) not containing the required client id", googleApiTokenInfo.aud);
        return null;
    }

    return new ProviderUserDetails
    {
        Email = googleApiTokenInfo.email,
        FirstName = googleApiTokenInfo.given_name,
        LastName = googleApiTokenInfo.family_name,
        Locale = googleApiTokenInfo.locale,
        Name = googleApiTokenInfo.name,
        ProviderUserId = googleApiTokenInfo.sub
    };
}
票数 1
EN

Stack Overflow用户

发布于 2016-09-20 05:27:51

您应该签出火源Auth (从谷歌身份工具包重命名)。这将使您非常容易,您所要做的就是在后端接受一个令牌。

请注意,您不需要使用firebase数据库使用Firebase Auth。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39570718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档