Asp.NET Core集成谷歌登录

作者 the7
发布于 2020年01月12日
评论 0
浏览 255

开篇

要集成谷歌登录,首先得会科学上网,毕竟所有操作都是在墙外。
开发者中心 : https://console.developers.google.com 注册APP,获取client_id,client_secret等
基础集成教程 : https://developers.google.com/identity/sign-in/web/sign-in#before_you_begin
比较全面的教程 :https://developers.google.com/identity/choose-auth

Asp.Net Core官方集成

关于.net core集成谷歌登录,微软官方有一篇文章 https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/google-logins?view=aspnetcore-2.2 看上去也挺简单,去谷歌官方注册账号,创建应用,获取client_id,client_secrent。在startup.cs里添加类似代码即可

services.AddAuthentication()
    .AddGoogle(googleOptions => { ... })

这种方法没有试过,不知道会不会配合ef+codefirst等手段,而且集成太深,受制于人的感觉总是不太好,所以放弃。

JS集成

教程 https://developers.google.com/identity/sign-in/web/ 集成比较简单,这种方式是在前端就可以获取到id_token ,然后在传回后端,后端使用类似GoogleIdToken idToken = verifier.verify(idTokenString); 后去具体token信息(包括email,uid,姓名等)

(adsbygoogle)

尝试谷歌官方sdk

惯性思维觉得,这种登录授权,官方一定有相应的SDK,也会有教程,按照教程撸代码就可以了。google登录授权的sdk

Install-Package Google.Apis.Auth -Version 1.38.0

这个sdk是支持.net core的,
github网址 https://github.com/googleapis/google-api-dotnet-client
开发文档 https://developers.google.com/api-client-library/dotnet/get_started

1. 集成跳转代码

获取授权信息,如果未获取到,跳转到谷歌官方(此步不需要VPN等)

var flow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
{
    ClientSecrets = new ClientSecrets
    {
        ClientId = "你的client_id",
        ClientSecret = "你的client_secret"
    },
    Scopes = new []{"openid"},
    DataStore = null
});
var auth = new AuthorizationCodeWebApp(flow, "http://localhost:5000/auth/google", "");
var result = auth.AuthorizeAsync("[谷歌给的userid]", CancellationToken.None).GetAwaiter().GetResult();
if (result.Credential != null)
{
    //获取授权信息
}
else
{
    return Redirect(result.RedirectUri);
}

2. 回调

(当用户在谷歌官网同意授权后,将跳回你的网站),url大概如下

http://localhost:5000/auth/google?
code=&
scope=openid&
authuser=0&
session_state=f3d5712ae1881ee4d1d1e3409819ce4bb309467f..99d2
&prompt=consent 

通过url里的code,再去换取access_token,代码如下

flow.ExchangeCodeForTokenAsync()

问题就出在回调页上,在与谷歌换取access_token的时候,一直超时最后报错,因为googleapis.com在天朝是打不开的,那就上VPN吧,但即便在开启vpn的情况下,也超时出错,谷歌一圈,有人说是httpclient的问题,感觉也不好修复。

HTTP/REST集成

教程 https://developers.google.com/identity/protocols/OpenIDConnect#userinfocall
其实为什么集成登录这件事,喜欢用SDK,因为SDK封装了请求、加密、序列化等一系列操作,但我看了下谷歌的http/rest,感觉尤其简单。

1. 拼接跳转的url

https://accounts.google.com/o/oauth2/v2/auth?
scope=openid&
access_type=offline&
include_granted_scopes=true&
state=1&
redirect_uri=http%3A%2F%2Flocalhost:5000%2Fauth%2Fgoogle&
response_type=code&
client_id=[你的clientid]

所有scope : https://developers.google.com/identity/protocols/googlescopes

2.通过回调的code换取id_token

换取id_token时,注意把googleapis.com 换成googleapis.cn

var url = $"https://www.googleapis.cn/oauth2/v4/token";
var formDataDictionary = new Dictionary<string, string>()
 {
         {"code", code.Trim() },
         {"client_id", "你的client-id" },
         {"client_secret", "你的client-secret" },
         {"redirect_uri","http://localhost:5000/auth/google"},
         {"grant_type","authorization_code"}
};
var formData = new FormUrlEncodedContent(formDataDictionary);
var responseMessage = await _httpClient.PostAsync(url, formData);
var resp = await responseMessage.Content.ReadAsStringAsync();

在resp里可以获取到id_token, id_token实际上是jwt,可以decode成一个json字符串,然后获取email,头像等信息

0条评论

请先登录后发表评论
提交评论
标签云
css (1) less calc (1) C# (4) C#进制转换 (1) asp.net core (8) Authentication (1) 注销 (1) 登录 (1) 验证 (1) scroll-view (1) 微信小程序 (4) 滚动到底部 (1) StackExchange.Redis (1) google (1) 百度 (1) nginx (2) 大文件 (2) 微信小程序c#解密 (1) 微信小程序获取手机号 (1) openid (1) session_key (1) CDN (1) URL鉴权 (1) 阿里云 (1) async (1) await (1) 禁止下拉上滑效果 (1) Index类型 (1) Range类型 (1) dontent publish (1) dotnet publish在线生成器 (1) System.DrawingCore.GDIPlus报错 (1) centos (1) 中文字体 (1) SqlBulkCopy (1) SqlSugar (1) JWT (5) 认证 (3) RSA JWT (1) 非对称加密 (1) 写信 (1) 见字如面 (1) 优化建议 (2) 正确操作字符串 (1) Java (1) JWT退出 (1) RefreshToken (1) .NET Core网站开发框架 (1) Moz (3) 墨子 (1) JSON.NET (1) Newtonsoft (1) System.Text.Json (1) 自定义后台路径 (1) .netcore (1) quartz (2) 作业调度框架 (1) 作业调度 (1) 定时任务 (1) exception (1) 异常处理 (1) HttpClient (1) IHttpClientFactory (1) RDM (1) Redis (1) Redis Desktop Manager (1) RedisDesktopManager (1) linux (1) mac (1) windows (1) Could not get any response (1) postman (1) leetcode (2) 力扣 (1) 回文字符串 (1) 面试刷题 (1) centos7 (1) php安装 (1) 网易云插件 (1) 马甲App (1) Discuz插件 (1) 网易云音乐 (1) Blazor (1) 五子棋 (1) c#解题 (1) 最长连续序列 (1) Swagger (1) 在线文档 (1) blob (1) mp4 (1) 视频 (1) big file (1) 上传 (1) s (1) Azure (1) Azure Key Vault (1) Configuration (1) 密钥保管库 (1) Dapper安装 (1) Dapper是什么 (1) Dapper连接Mysql (1) Dapper连接SqlServer (1) dapper (1)