1+ using Meowv . Blog . Domain . Users ;
2+ using Meowv . Blog . Dto . Authorize ;
3+ using Meowv . Blog . Extensions ;
4+ using Meowv . Blog . Options . Authorize ;
5+ using System . Collections . Generic ;
6+ using System . Net . Http ;
7+ using System . Threading . Tasks ;
8+ using System . Web ;
9+
10+ namespace Meowv . Blog . Authorize . OAuth . Impl
11+ {
12+ public class OAuthQQService : OAuthServiceBase < QQOptions , AccessTokenBase , QQUserInfo >
13+ {
14+ public override async Task < string > GetAuthorizeUrl ( string state )
15+ {
16+ var param = BuildAuthorizeUrlParams ( state ) ;
17+ var url = $ "{ Options . Value . AuthorizeUrl } ?{ param . ToQueryString ( ) } ";
18+
19+ return await Task . FromResult ( url ) ;
20+ }
21+
22+ public override async Task < User > GetUserByOAuthAsync ( string type , string code , string state )
23+ {
24+ var accessToken = await GetAccessTokenAsync ( code , state ) ;
25+ var userInfo = await GetUserInfoAsync ( accessToken ) ;
26+
27+ return await UserService . CreateUserAsync ( userInfo . Email , type , userInfo . Id , userInfo . Name , userInfo . Avatar , userInfo . Email ) ;
28+ }
29+
30+ public override async Task < AccessTokenBase > GetAccessTokenAsync ( string code , string state )
31+ {
32+ var param = BuildAccessTokenParams ( code , state ) ;
33+ Options . Value . AccessTokenUrl = $ "{ Options . Value . AccessTokenUrl } ?{ param . ToQueryStringWithEncode ( ) } ";
34+
35+ using var client = HttpClient . CreateClient ( ) ;
36+ var response = await client . GetStringAsync ( Options . Value . AccessTokenUrl ) ;
37+
38+ var qscoll = HttpUtility . ParseQueryString ( response ) ;
39+
40+ return new AccessTokenBase
41+ {
42+ AccessToken = qscoll [ "access_token" ]
43+ } ;
44+ }
45+
46+ public override async Task < QQUserInfo > GetUserInfoAsync ( AccessTokenBase accessToken )
47+ {
48+ using var client = HttpClient . CreateClient ( ) ;
49+
50+ var openIdResponse = await client . GetStringAsync ( $ "{ Options . Value . OpenIdUrl } ?access_token={ accessToken . AccessToken } ") ;
51+
52+
53+ var response = await client . GetStringAsync ( Options . Value . UserInfoUrl ) ;
54+
55+ var userInfo = response . DeserializeToObject < QQUserInfo > ( ) ;
56+ return userInfo ;
57+ }
58+
59+ protected Dictionary < string , string > BuildAuthorizeUrlParams ( string state )
60+ {
61+ return new Dictionary < string , string >
62+ {
63+ [ "client_id" ] = Options . Value . ClientId ,
64+ [ "response_type" ] = "code" ,
65+ [ "redirect_uri" ] = Options . Value . RedirectUrl ,
66+ [ "scope" ] = Options . Value . Scope ,
67+ [ "state" ] = state
68+ } ;
69+ }
70+
71+ protected Dictionary < string , string > BuildAccessTokenParams ( string code , string state )
72+ {
73+ return new Dictionary < string , string > ( )
74+ {
75+ [ "client_id" ] = Options . Value . ClientId ,
76+ [ "client_secret" ] = Options . Value . ClientSecret ,
77+ [ "grant_type" ] = "authorization_code" ,
78+ [ "redirect_uri" ] = Options . Value . RedirectUrl ,
79+ [ "code" ] = code ,
80+ [ "state" ] = state
81+ } ;
82+ }
83+ }
84+ }
0 commit comments