office365client.pp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. unit office365client;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpwebclient, fpoauth2, fpjwt;
  6. Type
  7. TAuthMethod = (amOAuth2);
  8. { TAzureADClaims }
  9. // Claims returned by Azure AD.
  10. TAzureADClaims = Class(TClaims)
  11. private
  12. FFamilyName: String;
  13. FGivenName: String;
  14. FOID: String;
  15. Fpwd_exp: string;
  16. Fpwd_url: string;
  17. FTid: String;
  18. FUniqueName: string;
  19. Fupn: String;
  20. Fver: String;
  21. Published
  22. Property unique_name : string read FUniqueName Write FUniqueName;
  23. Property family_name : String read FFamilyName Write FFamilyName;
  24. Property given_name : String read FGivenName Write FGivenName;
  25. Property pwd_exp : string Read Fpwd_exp Write Fpwd_exp;
  26. Property pwd_url : string Read Fpwd_url Write Fpwd_url;
  27. Property tid : String Read FTid Write FTID; // GUID
  28. Property upn : String Read Fupn Write Fupn;
  29. Property ver : String Read Fver Write Fver;
  30. Property oid : String Read FOID Write FOID; // GUID
  31. end;
  32. { TAzureIDToken }
  33. TAzureIDToken = Class(TJWTIDtoken)
  34. private
  35. function GetAzureClaims: TAzureADClaims;
  36. Protected
  37. Function CreateClaims : TClaims; override;
  38. Public
  39. Constructor Create;
  40. Function GetUniqueUserID : String; override;
  41. Function GetUniqueUserName : String; override;
  42. Function GetUserDisplayName : String; override;
  43. Property AzureClaims : TAzureADClaims Read GetAzureClaims;
  44. end;
  45. { TAzureADOAuth2Handler }
  46. TAzureADOAuth2Handler = Class(TOAuth2Handler)
  47. Protected
  48. function CreateIDToken: TJWTIDToken;override;
  49. Public
  50. Constructor Create(AOwner : TComponent); override;
  51. Class Function AuthScopeVariableName : String; override;
  52. Class Function DefaultHostedDomain : String; override;
  53. end;
  54. // Authentication V2...
  55. { TAzureAD2OAuth2Handler }
  56. TAzureAD2OAuth2Handler = Class(TAzureADOAuth2Handler)
  57. Public
  58. Constructor Create(AOwner : TComponent); override;
  59. Class Function AuthScopeVariableName : String; override;
  60. Class Function DefaultHostedDomain : String; override;
  61. end;
  62. TOffice365Client = CLass(TComponent)
  63. Private
  64. FWebClient: TAbstractWebClient;
  65. FAuthHandler : TOAuth2Handler;
  66. function GetOnUserConsent: TUserConsentHandler;
  67. procedure SetAuthHandler(AValue: TOAuth2Handler);
  68. procedure SetClient(AValue: TAbstractWebClient);
  69. procedure SetOnUserConsent(AValue: TUserConsentHandler);
  70. Protected
  71. Procedure CheckDefaults; virtual;
  72. Public
  73. Constructor Create(AOwner : TComponent); override;
  74. Function GetAuthHandler : TOAuth2Handler;
  75. Published
  76. Property AuthHandler : TOAuth2Handler Read GetAuthHandler Write SetAuthHandler;
  77. Property WebClient : TAbstractWebClient Read FWebClient Write SetClient;
  78. Property OnUserConsent : TUserConsentHandler Read GetOnUserConsent Write SetOnUserConsent;
  79. end;
  80. EOffice365 = Class(Exception);
  81. Const
  82. DefAUTHURL = 'https://login.windows.net/%HostedDomain%/oauth2/authorize';
  83. DefTOKENURL = 'https://login.windows.net/%HostedDomain%/oauth2/token';
  84. DefAUTHURLV2 = 'https://login.microsoftonline.com/%HostedDomain%/oauth2/v2.0/authorize';
  85. DefTOKENURLV2 = 'https://login.microsoftonline.com/%HostedDomain%/oauth2/v2.0/token';
  86. implementation
  87. Function StringToAuthMethod (Const S : String) : TAuthMethod;
  88. begin
  89. Case Lowercase(S) of
  90. 'oauth2' : Result:=amOAuth2;
  91. end;
  92. end;
  93. Function StringToAccessType(const S : String) : TAccessType;
  94. begin
  95. Case lowercase(S) of
  96. 'online' : Result:=atonline;
  97. 'offline' : Result:=atoffline;
  98. end;
  99. end;
  100. { TAzureAD2OAuth2Handler }
  101. constructor TAzureAD2OAuth2Handler.Create(AOwner: TComponent);
  102. begin
  103. inherited Create(AOwner);
  104. Config.TokenURL:=DefTOKENURLV2;
  105. Config.AuthURL:=DefAuthURLV2;
  106. end;
  107. class function TAzureAD2OAuth2Handler.AuthScopeVariableName: String;
  108. begin
  109. Result:='scope';
  110. end;
  111. class function TAzureAD2OAuth2Handler.DefaultHostedDomain: String;
  112. begin
  113. Result:='common';
  114. end;
  115. { TAzureIDToken }
  116. function TAzureIDToken.GetAzureClaims: TAzureADClaims;
  117. begin
  118. if Claims is TAzureADClaims then
  119. Result:=TAzureADClaims(Claims)
  120. else
  121. Result:=Nil;
  122. end;
  123. function TAzureIDToken.CreateClaims: TClaims;
  124. begin
  125. If ClaimsClass=Nil then
  126. Result:=TAzureADClaims.Create
  127. else
  128. Result:=inherited CreateClaims;
  129. end;
  130. constructor TAzureIDToken.Create;
  131. begin
  132. Inherited CreateWithClasses(TAzureADClaims,Nil)
  133. end;
  134. function TAzureIDToken.GetUniqueUserID: String;
  135. begin
  136. if Assigned(AZureClaims) then
  137. Result:=AZureClaims.upn
  138. else
  139. Result:=inherited GetUniqueUserID;
  140. end;
  141. function TAzureIDToken.GetUniqueUserName: String;
  142. begin
  143. if Assigned(AZureClaims) then
  144. Result:=AZureClaims.unique_name
  145. else
  146. Result:=inherited GetUniqueUserName;
  147. end;
  148. function TAzureIDToken.GetUserDisplayName: String;
  149. begin
  150. if Assigned(AZureClaims) then
  151. Result:=AZureClaims.Given_Name+' '+AZureClaims.Family_Name
  152. else
  153. Result:=inherited GetUserDisplayName;
  154. end;
  155. { TAzureOAuth2Handler }
  156. function TAzureADOAuth2Handler.CreateIDToken: TJWTIDToken;
  157. begin
  158. Result:=TAzureIDToken.CreateWithClasses(TAzureADClaims,Nil);
  159. end;
  160. Constructor TAzureADOAuth2Handler.Create(AOwner: TComponent);
  161. begin
  162. inherited Create(AOwner);
  163. Config.TokenURL:=DefTOKENURL;
  164. Config.AuthURL:=DefAuthURL;
  165. end;
  166. Class Function TAzureADOAuth2Handler.AuthScopeVariableName: String;
  167. begin
  168. Result:='resource';
  169. end;
  170. Class Function TAzureADOAuth2Handler.DefaultHostedDomain: String;
  171. begin
  172. Result:='common';
  173. end;
  174. { TOffice365Client }
  175. procedure TOffice365Client.SetClient(AValue: TAbstractWebClient);
  176. Var
  177. AH : TOAuth2Handler;
  178. begin
  179. if FWebClient=AValue then Exit;
  180. if Assigned(FWebClient) then
  181. FWebClient.RemoveFreeNotification(Self);
  182. FWebClient:=AValue;
  183. if Assigned(FWebClient) then
  184. begin
  185. FWebClient.FreeNotification(Self);
  186. AH:=GetAuthHandler;
  187. FWebClient.RequestSigner:=AH;
  188. AH.WebClient:=FWebClient;
  189. end;
  190. end;
  191. function TOffice365Client.GetOnUserConsent: TUserConsentHandler;
  192. begin
  193. Result:=GetAuthHandler.OnUserConsent;
  194. end;
  195. procedure TOffice365Client.SetAuthHandler(AValue: TOAuth2Handler);
  196. begin
  197. if FAuthHandler=AValue then Exit;
  198. FAuthHandler:=AValue;
  199. end;
  200. procedure TOffice365Client.SetOnUserConsent(AValue: TUserConsentHandler);
  201. begin
  202. GetAuthHandler.OnUserConsent:=AValue;
  203. end;
  204. Constructor TOffice365Client.Create(AOwner: TComponent);
  205. begin
  206. inherited Create(AOwner);
  207. CheckDefaults;
  208. end;
  209. Procedure TOffice365Client.CheckDefaults;
  210. begin
  211. If (AuthHandler.Config.AuthURL='') then
  212. AuthHandler.Config.AuthURL:=DefAuthURL;
  213. If (AuthHandler.Config.TokenURL='') then
  214. AuthHandler.Config.TokenURL:=DefTokenURL;
  215. end;
  216. Function TOffice365Client.GetAuthHandler: TOAuth2Handler;
  217. begin
  218. if (FAuthHandler=Nil) then
  219. begin
  220. FAuthHandler:=TAzureADOAuth2Handler.Create(Self);
  221. if Assigned(FWebClient) then
  222. begin
  223. FWebClient.RequestSigner:=FAuthHandler;
  224. FAuthHandler.WebClient:=FWebClient;
  225. end;
  226. end;
  227. Result:=FAuthHandler;
  228. end;
  229. end.