OpenAuth详解

发布时间:2023-05-20

一、OpenAuth开发

OpenAuth是基于OAuth2.0协议实现的开放授权框架,是大多数开发者集成第三方登录、发起授权等OAuth2.0相关操作的首选框架之一。 在OpenAuth的开发中,一般需要先完成如下步骤:

  1. 安装OpenAuth.Core Nuget包
    Install-Package OpenAuth.Core -Version 5.3.0
    
  2. 在Web.config中配置数据库连接字符串
    <connectionStrings>
      <add name="OpenAuthConnection" connectionString="{连接字符串}" providerName="System.Data.SqlClient" />
    </connectionStrings>
    
  3. 创建数据库,运行OpenAuth.Core的SQL脚本
  4. 在Global.asax中注册OpenAuth.Core
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            // 注册OpenAuth.Core
            OpenAuthConfig.RegisterOpenAuth();
        }
    }
    
  5. 间接在RegisterOpenAuth方法中,绑定登录类型以及第三方应用信息
  6. 使用授权信息发起授权请求,在授权回调中获取授权码,用授权码换取AccessToken
    public ActionResult Callback()
    {
        string code = Request["code"]; // 获取授权码
        // 使用授权码grant_code获取登陆用户的access_token 此access_token与QQ的access_token一样有授权时间,超时需要要求用户重新授权
        var tokenResult = OpenAuthAccessToken.GetAccessTokenByCode(code, login_type);
        var userInfo = OpenAuthUserInfo.GetByAccessToken(tokenResult.access_token, login_type); // 获取用户信息
        // 将获取到的用户信息保存到数据库或在session中缓存一段时间
        ...
    }
    

二、OpenAuth嵌套流程

OpenAuth的嵌套流程就是将OpenAuth集成在自己的Web应用程序中,通过OAuth2.0版本的标准流程来授权第三方应用访问用户数据和资源。 OpenAuth的嵌套流程一般包括以下步骤:

  1. 向第三方应用申请secret id和key secret等信息,第三方应用将调用授权接口,易错点是防止将应用的数据放错或漏传。
    private void BindUseAuth()
    {
       OpenAuthConfig.ReGetThirdPartyConfigWhenOAuthFailed = true; // 如果授权失败,重新获取第三方配置信息
       var useAuth = new useAuth();
       useAuth.AuthorizeSucceed += useAuth_AuthorizeSucceed;
       useAuth.OpenLogin(openAuthType.QQ);
       if (OAuthClient.Instance.GetCurrentOAuthUserInfo(openAuthType.QQ) != null)
       {
           useAuth_AuthorizeSucceed(null, null);
       }
    }
    
  2. 获取access_token。
    string accessTokenUrlTemplate = "https://graph.qq.com/oauth2.0/token?client_id={0}&client_secret={1}&code={2}&grant_type=authorization_code&redirect_uri={3}";
    var accessTokenApiResult = HttpHelper.HttpGet(string.Format(accessTokenUrlTemplate, QQ_LoginConfig.AppId, QQ_LoginConfig.AppSecret, code, QQ_LoginConfig.CallbackUrl));
    var accessToken = OAuthUtility.GetQueryParameter(accessTokenApiResult.Response, "access_token");
    
  3. 利用access_token请求用户数据。
    string userInfoUrlTemplate = "https://graph.qq.com/user/get_user_info?oauth_consumer_key={0}&access_token={1}&openid={2}";
    var userInfoApiResult = HttpHelper.HttpGet(string.Format(userInfoUrlTemplate, QQ_LoginConfig.AppId, accessToken, openId));
    var userInfo = JsonConvert.DeserializeObject<qq_userinfo>(userInfoApiResult.Response);
    

三、OpenAuth.net

OpenAuth.net是开源的身份认证框架,是一套基于ASP.NET的开源OAuth组件,是基于OpenAuth.Core组件的一套完整的用户登录和授权机制的解决方案。 OpenAuth.net方便集成基于OAuth协议的第三方认证登录,支持QQ、微博、微信等登录方式,同时支持自定义OAuth客户端。

四、OpenAuth Token

OpenAuth Token是OpenAuth.Core组成部分之一,是基于OAuth协议的access_token的实现,主要负责access_token的创建、验证和删除等。 在使用access_token时,我们通过传递access_token参数来访问接口。

var parameter = new List<KeyValuePair<string, string>>();
parameter.Add(new KeyValuePair<string, string>("access_token", accessToken));
...
var result = HttpHelper.HttpGet(...);

五、OpenAuth.Core

OpenAuth.Core组件是OpenAuth框架中最核心的部分,负责OpenAuth框架全局配置、授权有效性验证等操作。 在OpenAuth.Core中,我们可以进行如下操作:

  1. 授权有效性验证
    // 验证授权有效性
    if (!OAuthValidate.CheckValidate(appId, appSecret, code, state, this, out msg))
    {
        // 授权错误,抛出异常
        throw new Exception(msg);
    }
    
  2. 全局配置
    public static void RegisterOpenAuth()
    {
        // 配置缓存的类型和列表
        CacheConfig.ConfigureCache();
        // 配置OpenAuth通用参数
        OpenAuthConfig.SSOService = new SSOService();
        OpenAuthConfig.AuthDomain = ConfigurationManager.AppSettings["AuthDomain"]; 
        ...
    }
    

六、OpenAuth Pro源码

OpenAuth Pro是OpenAuth框架的旗舰版本,提供更多更好的特性,支持多租户、提供外部用户系统导入以及管理、扩展视图和功能等。 OpenAuth Pro的源码可以通过Github进行下载,实现库地址为:https://github.com/szwang/OpenAuth.Net

七、OpenAuth多租户

在OpenAuth的开发中,我们常常需要将OpenAuth框架集成到多客户端中。OpenAuth可以依据客户端申请的应用id和密钥,实现多租户授权的效果。 两个客户端申请的应用的appId和appScrete是不同的,这样谁用谁的,同时第三方登陆应用也不是光凭证access_token判断客户端,而是通过区分客户端Id去查找客户应TOKEN。

八、OpenAuth.alipay.com

OpenAuth的实现原理可以参照支付宝的登陆方式,通过open_auth_token授权过程去完成。 使用open_auth_token完成支付宝的登录,一般包括以下步骤:

  1. 获取Authorization Code
    https://openauth.alipay.com/oauth2/appToAppAuth.htm?app_id=APPID&scope=SCOPE&redirect_uri=ENCODED_REDIRECT_URI&state=STATE
    
  2. 使用Authorization Code 换取 Access Token
    https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=APPID&scope=SCOPE&redirect_uri=ENCODED_REDIRECT_URI&state=STATE
    
  3. 使用Access Token取用户信息。
    https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=APPID&scope=SCOPE&redirect_uri=ENCODED_REDIRECT_URI&state=STATE
    

以上就是关于OpenAuth的详解,通过本文,我们可以更加深入地了解OpenAuth的开发、嵌套流程、core组件、多租户等相关内容。