摘要:你可以試著注冊一個賬號然后進行登錄,登錄完成后可以在控制臺中觀察到登錄狀況。編寫函數編寫函數推薦使用這個,控制臺中的函數編寫堪稱讓人痛不欲生。在控制臺中安裝在中引入包后會一起打包上傳到運行時中。
Amazon Web Services(AWS) 雖然作為市場份額全球第一的云計算廠商,其產品也不是完美無缺的,Cognito (AWS 的身份認證解決方案)及其附帶的中文文檔就是一個反面教材,其難用程度令人發指。當然,除了不易用之外,還有訪問速度緩慢,不適用于中國市場等問題存在。
而國產的 Authing 可以解決使用 Cognito 的諸多問題,先看一下 Authing 的介紹:
Authing 是一個身份認證服務商,其提供了企業級身份認證和管理解決方案,客戶分布教育、IoT、互聯網和電商等多個行業。
Lambda 是一個由 AWS 提供的 Function-as-a-Service (FaaS) 平臺 。Lambda 和 AWS 生態結合的非常緊密,接入 Lambda 后,開發者可以使用 AWS 生態內的所有資源。比如,我們可以創建一個 Lambda 函數,讓用戶通過 Cognito 登錄(當然這篇文章是讓用戶使用 Authing 登錄),然后再調用另外一個可以上傳文件到 S3(AWS 的存儲服務) 的 Lambda 函數。
這類平臺(現在多被稱為 Serverless,無服務器架構)的一個好處是可以讓開發者無需擔心基礎設施,專心業務研發。
FaaS 或者說 Serverless 平臺正在逐漸獲得市場關注,因為這種類型的平臺可以讓開發者不用再關注基礎設施。"What is serverless" 這篇文章詳細的講解了什么是「無服務器計算」和「無服務器計算」的好處,推薦讀一下。
這篇文章的主要目的是介紹如何使用 Authing + Lambda 替代 AWS Cogito,線上體驗地址為:https://sample.authing.cn/aws。
此外,Authing 遵循 OIDC 規范,所以本篇文章將使用 OIDC 來做認證,如果你還不了解什么是 OIDC,請先到網上搜索一下。
首先確認下用戶的操作流程打開頁面:sample.authing.cn/aws/;
點擊 Login 進行登錄,此時跳轉到 Authing 的登錄頁面(應用的二級域名);
輸入賬號密碼進行登錄,若沒有賬號密碼則先進行注冊;
登錄成功后返回第一步打開的頁面,并顯示登錄用戶的頭像;
此時用戶可以看到從 AWS Lambda 請求回來的 Private 信息;
創建一個 Authing 應用如果你還沒有注冊 Authing,那么請點擊這里進行注冊,注冊完成后,按以下步驟創建一個 Authing 應用。
1. 創建應用 2. 填寫基本信息,應用類型選擇 Web 應用 3. 創建完成后會進入到應用主頁(空空如也) 創建 OIDC 應用創建完應用后相當于你有了一個用戶池,接下來你可以創建 OIDC 應用來授權其他程序(你自己寫的或其他第三方程序)訪問你的用戶池。
4. 點擊「第三方登錄」開始創建 OIDC 應用 5. 選擇「OIDC 應用」選項卡,并點擊「創建 OIDC 應用」 6. 填寫應用名和認證地址,并勾選 id_token token這里要說明一下,創建 OIDC 應用時的認證地址將由 Authing 生成一個二級域名(支持 HTTPS),且不能重復,回調 URL 填寫你自己的回調地址即可,在這里我用的是 https://authing.cn,注意,OIDC 協議中不允許回調 URL 為 localhost,請使用代理工具進行調試。
7. 點擊確認,就可以看到我們有了第一個基于 OIDC 協議的授權應用創建完成后你可以訪問 lambda.authing.cn ,此時會看到報了一個錯,別害怕,這是因為我們發起的授權鏈接不正確。
8. 訪問 lambda.authing.cn 時報的錯發起正確授權請求的方式請繼續往下看。
發起授權請求和絕大多數的 OAuth 應用差不多,OIDC 的授權鏈接也需要拼接(如果你開發過微信應用,應該會很容易理解),Authing OIDC 應用的授權鏈接符合標準規范,具體格式為:
https://lambda.authing.cn/oau...;應用 ID>&redirect_uri=<回調 URL,必須和平臺配置完全一樣>&scope=openid profile&response_type=
若需要查看詳細的參數,請點擊這里查看。
例如:
https://lambda.authing.cn/oau...://authing.cn&scope=openid profile&response_type=id_token token&state=jacket
為了簡單起見,這里我們的 response_type 設置為「id_token token」,這樣不需要使用「code」換取 token,token 會直接附帶到回調地址中。
9. 如果你的授權鏈接正確,應該可以看到上圖這樣的登錄窗口如果你的授權鏈接正確,應該可以看到上圖這樣的登錄窗口,同時這個窗口也是你的終端用戶所使用的窗口,他們都將從這里登錄然后回調到你配置好的回調 URL 中。
你可以試著注冊一個賬號然后進行登錄,登錄完成后可以在控制臺中觀察到登錄狀況。
10. 注冊成功 11. 登錄之后的授權頁面 12. 控制臺中觀察到的用戶數據在你登錄成功后應該會看到回調到了你填寫 URL 中,并且附帶了很多參數,接下來我們會闡述如何使用這些參數。
獲取用戶信息
回調到在控制臺中配置的 redirect_uri 中后,將附帶以下信息:
{ "id_token": "JWT_TOKEN", "access_token": "JWT_TOKEN", "expires_in": "3600", "token_type": "Bearer", "state": "jacket", "session_state": "644d7b324ba61d517fdedd28b5b6e365d78f2a8178f2ee742474d5b57a99eb3f" }
可以看到其中包含了 access_token 和 id_token,其中 access_token 可以幫助你從 Authing 后端獲取用戶信息,而 id_token 中包含了基本的信息,如果你要獲取用戶的頭像,那么是需要通過 access_token 獲取的。
我們先看一個 id_token 的例子:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InIxTGtiQm8zOTI1UmIyWkZGckt5VTNNVmV4OVQyODE3S3gwdmJpNmlfS2MifQ.eyJzdWIiOiI1Y2MyYTg1MTFiYmFmMDRmOTNjZTQ4OWYiLCJub25jZSI6IjE4MzEyODkiLCJzaWQiOiI5MzkwZDA1ZC01ZTM3LTQ3ZWUtODJjNi1jNTQ1ZjA2ODhhMDAiLCJhdF9oYXNoIjoiNmxZMGRXajZYUTY0aExWdHAtR2tEdyIsInNfaGFzaCI6IlZVOU5QYV9JQ0VTSEdxRmxUZ3A2LUEiLCJhdWQiOiI1Y2MyYjU0OGQxNGM3NDJkYjg5M2JhNTUiLCJleHAiOjE1NTYzNjY0ODksImlhdCI6MTU1NjM2Mjg4OSwiaXNzIjoiaHR0cHM6Ly9vYXV0aC5hdXRoaW5nLmNuL29hdXRoL29pZGMifQ.Qc_OMqMf6_wwzW2SsEgEtiaGr3ZY1FWHnRrMU2M7LADGlNpq_pvPrFxAVsR2j-BFr1y48M-Trvq6yAu4_ZOUBHPtIIpoQ5W2bnABytUV693ZcwNlf9CCiLc-k0LG3o1U-BmiH3L6NAV7aKGsfVHS8toiNbVDuimPVdYJsRrF2C1jj1meM1K8FBVwqozXm6YtB--u3sqY4IszHnd5PMEWguLsOkpZJIh7xWeYPpVQ5WKfx0cA8rB_T2puSCbeaUVhgIwNADy06qBqXhUOiA4gdcNbHtx7tvGZMxzMC3rdjpXoZk89Duh3O5tHlMtaBlidJGYavUSjVl7potESecSlBg
使用 jwt.io 解析后將得到如下結果:
{ "sub": "5cc2a8511bbaf04f93ce489f", "nonce": "1831289", "sid": "9390d05d-5e37-47ee-82c6-c545f0688a00", "at_hash": "6lY0dWj6XQ64hLVtp-GkDw", "s_hash": "VU9NPa_ICESHGqFlTgp6-A", "aud": "5cc2b548d14c742db893ba55", "exp": 1556366489, "iat": 1556362889, "iss": "https://oauth.authing.cn/oauth/oidc" }
其中包含了簽發時間(iat)、過期時間(exp)等字段,可以用來判斷用戶有沒有被認證過,在 OIDC 的規范中,JWT 使用 OIDC 應用的 secret 簽發,需要開發者在后端驗證(這一步我們將會在 Lambda 中執行)后繼續執行開發者本身的業務流程。
再來看看 access_token 的例子:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InIxTGtiQm8zOTI1UmIyWkZGckt5VTNNVmV4OVQyODE3S3gwdmJpNmlfS2MifQ.eyJqdGkiOiJza0p-bTNaYmZsTjVxVGEzR2J2YlMiLCJzdWIiOiI1Y2MyYTg1MTFiYmFmMDRmOTNjZTQ4OWYiLCJpc3MiOiJodHRwczovL29hdXRoLmF1dGhpbmcuY24vb2F1dGgvb2lkYyIsImlhdCI6MTU1NjM2Mjg4OSwiZXhwIjoxNTU2MzY2NDg5LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIiwiYXVkIjoiNWNjMmI1NDhkMTRjNzQyZGI4OTNiYTU1In0.Uf3YK4D9HL-G71hkA4cWt5kitDo5rNgwVA9Vqlv4RjAILNDTylYWtkacKJpLcOSS81ivaNpDVNYYzBSoyN-eMH80VhArPUre74F9SHdonA-IVFVPT0DHRtOAJI9kqDW4tgTXhZeZMUm-MCjVjR-q8XrayXaqrC5Hu5W3D1N-K_jZOlwxzIBf51nuC4NMvSI_wPpYj2WPzGxFwpfTCEbnhj5RO0CcThRpC3EdmpbtcJqStd7AZQhkLyTb1TQLHJOel8DSxLnLnoIU0rZXsodK6EjE_oqRLagetNXF1cKfRmnGFaAKZKqgvHc527S_CVkgXIwcHBRmDeqo93CCId_hmQ
使用 jwt.io 解析后將得到如下結果:
{ "jti": "skJ~m3ZbflN5qTa3GbvbS", "sub": "5cc2a8511bbaf04f93ce489f", "iss": "https://oauth.authing.cn/oauth/oidc", "iat": 1556362889, "exp": 1556366489, "scope": "openid profile", "aud": "5cc2b548d14c742db893ba55" }
可以看到 access_token 相比 id_token 是少了很多信息的,這里有一段英文的介紹,該介紹講解了 access_token 和 id_token 的區別:
ID Tokens vs Access Tokens. The ID Token is a security token granted by the OpenID Provider that contains information about an End-User. This information tells your client application that the user is authenticated, and can also give you information like their username or locale.You can pass an ID Token around different components of your client, and these components can use the ID Token to confirm that the user is authenticated and also to retrieve information about them.Access tokens, on the other hand, are not intended to carry information about the user. They simply allow access to certain defined server resources. More discussion about when to use access tokens can be found in Validating Access Tokens.
簡單來講,id_token 告訴你用戶被驗證過了,而 access_token 是一個你可以訪問資源服務器(這里就是 Authing) 的一個憑證。
同時也可以看到,idtoken 包含的信息較少,如果想獲取更多信息,需要使用 access_token 來獲取。獲取方式也非常簡單,只需要往以下鏈接發送 GET 請求并且附帶 access_token 即可,如:
$ curl https://users.authing.cn/oauth/oidc/user/userinfo?access_token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InIxTGtiQm8zOTI1UmIyWkZGckt5VTNNVmV4OVQy...balabala...verylong...
可以獲取到 id 等信息,獲取到 id 之后你可以將 id 存儲到你自己的數據庫中以完成自己的實際業務。
{ "sub":"5cc2a8511bbaf04f93ce489f", "nickname":"", "picture":"https://usercontents.authing.cn/authing-avatar.png" }
上面的 JSON 是一個使用 access_token 換取用戶數據后的返回結果。
好了,現在我們已經獲取到 Token 了,接下來我們需要在 Lambda 中驗證這個 Token 的合法性并在前端顯示不同的信息。
編寫 Lambda 函數編寫 Lambda 函數推薦使用 Serverless 這個 CLI,AWS 控制臺中的函數編寫堪稱讓人痛不欲生。
同時,你可以到這里查看完整代碼。
Lambda 在這篇文章中主要用來做三件事:
對 id_token 進行認證,以獲取用戶是否被認證過;
提供一個 Public API,此 API 可以直接被訪問;
提供一個 Private API,此 API 需要經過認證后被訪問;
對 id_token 進行認證認證 id_token 首先需要知道 OIDC 應用的 secret,此值可以在 Authing 控制臺查看 OIDC 應用的詳情中找到:
id_token 在簽發時的簽名是此 secret ,因此在 JavaScript 中可以直接使用 jsonwebtoken 這個庫來驗證 id_token 的合法性(詳情請參考:驗證 Token 合法性)。
在控制臺中安裝 jsonwebtoken:
$ npm install jsonwebtoken --save
P.S. 在 lambda 中引入包后會一起打包上傳到 AWS Lambda 運行時中。
const jwt = require("jsonwebtoken"); // Policy helper function // 這是 AWS 提供的模版代碼,這里不需要做修改 const generatePolicy = (principalId, effect, resource) => { const authResponse = {}; authResponse.principalId = principalId; if (effect && resource) { const policyDocument = {}; policyDocument.Version = "2012-10-17"; policyDocument.Statement = []; const statementOne = {}; statementOne.Action = "execute-api:Invoke"; statementOne.Effect = effect; statementOne.Resource = resource; policyDocument.Statement[0] = statementOne; authResponse.policyDocument = policyDocument; } return authResponse; }; // Reusable Authorizer function, set on `authorizer` field in serverless.yml module.exports.auth = async (event, context, cb) => { if (event.authorizationToken) { // remove "bearer " from token const token = event.authorizationToken.substring(7); try { let decoded = jwt.verify(token, "YOUR_OIDC_APP_SECRET"), expired = (Date.parse(new Date()) / 1000) > decoded.exp; if (expired) { cb("Unauthorized, Login information has expired."); }else { cb(null, generatePolicy("user", "Allow", event.methodArn)); } } catch (error) { cb("Unauthorized"); } } else { cb("Unauthorized"); } };公共 API
// Public API module.exports.publicEndpoint = (event, context, cb) => { cb(null, { message: "Welcome to our Public API!" }); };私有 API
// Private API module.exports.privateEndpoint = (event, context, cb) => { cb(null, { message: "Only logged in users can see this" }); };serverless.yml
service: serverless-authorizerprovider: name: aws runtime: nodejs8.10functions: auth: handler: handler.auth getUserInfo: handler: handler.getUserInfo events: - http: path: api/userInfo method: get integration: lambda cors: true publicEndpoint: handler: handler.publicEndpoint events: - http: path: api/public method: get integration: lambda cors: true privateEndpoint: handler: handler.privateEndpoint events: - http: path: api/private method: get integration: lambda authorizer: auth # See custom authorizer docs here: http://bit.ly/2gXw9pO cors: true
此文件可用來配置需要鑒權的路由,如上面代碼中的 privateEndpoint,配置了 authorizer 為 auth 函數。
完整代碼請參考:https://github.com/authing/au...
測試 Lambda寫完了代碼之后我們需要進行測試。
Lambda 支持直接在本地測試,可以使用如下命令:
$ sls invoke local -f auth --data "{"authorizationToken": "Bearer"}"
如果本地測試返回了如下信息則表示驗證成功:
{ "principalId": "user" }部署 Lambda
$ serverless deploy
部署完成后會得到三個鏈接,這三個鏈接分別是上述代碼的三個函數。
使用 curl 或 postman 將 OIDC 登錄后的 id_token 攜帶到 header 的 Authorization 中即可查看結果,如:
$ curl --header "Authorization:"
curl- Should work! Public! curl - Should not work curl --header "Authorization: " - Should work! Authorized!
最后,在我們的前端補充上相關信息,在點擊登錄后應該可以看到如下信息:
線上體驗地址:sample.authing.cn/aws/
Enjoy! 什么是 Authing?Authing 提供專業的身份認證和授權服務。
我們為開發者和企業提供用以保證應用程序安全所需的認證模塊,這讓開發人員無需成為安全專家。
你可以將任意平臺的應用接入到 Authing(無論是新開發的應用還是老應用都可以),同時你還可以自定義應用程序的登錄方式(如:郵箱/密碼、短信/驗證碼、掃碼登錄等)。
你可以根據你使用的技術,來選擇我們的 SDK 或調用相關 API 來接入你的應用。當用戶發起授權請求時,Authing 會幫助你認證他們的身份和返回必要的用戶信息到你的應用中。
官網:http://authing.cn
小登錄:https://wxapp.authing.cn/#/
倉庫: 歡迎 Star,歡迎 PR
https://gitee.com/Authi_ng
https://github.com/authing
Demo:
https://sample.authing.cn
https://github.com/Authing/qr...
文檔:https://docs.authing.cn/authing/
歡迎關注 Authing 技術專欄文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/106984.html
摘要:編寫函數編寫函數推薦使用這個,控制臺中的函數編寫堪稱讓人痛不欲生。在控制臺中安裝在中引入包后會一起打包上傳到運行時中。 Amazon Web Services(AWS) 雖然作為市場份額全球第一的云計算廠商,其產品也不是完美無缺的,Cognito (AWS 的身份認證解決方案)及其附帶的中文文檔就是一個反面教材,其難用程度令人發指。當然,除了不易用之外,還有訪問速度緩慢,不適用于中國市...
摘要:企業通過微信微博等為消費者提供社交認證或其他更多第三方身份提供商。支持多樣身份提供方案良好的身份管理解決方案應該支持幾乎所有流行的身份來源。易于遷移應支持移入和移出身份管理解決方案而不受限 IDaaS 身份即服務是隨著云計算發展起來的新軟件即服務。 showImg(https://segmentfault.com/img/remote/1460000020177039?w=800&h=...
摘要:而云端身份認證就是這樣一個構建軟件基礎設施的細分市場。可見,云端身份認證的市場在海外已經被打開,這同時也是中國的機會。在中國,是認證行業的領頭羊,其已在新三板上市。這有助于防止身份盜用,消除了個人數字身份在不同場景使用時信息不一致的風險。 showImg(/Users/jack/Authing/images/idaas.jpg); 云端身份認證,也叫IDaaS(Identity As ...
摘要:例如,控制臺使用調用類型,因此當您使用控制臺調用函數時,控制臺將顯示返回的值。如果別名用于調用函數,將為別名指向的版本。 場景:現在需要開發一個前后端分離的應用,后端采用 RESTful API 最為方便,但是如果這個后端服務會在一天中的某些時候有高并發的情況,使用什么樣的架構最為簡單呢? 剛思考這個問題的時候我想到的解決方案可能有以下幾種: 使用CDN內容分發網絡,減少主服務器的...
閱讀 1002·2021-09-30 09:58
閱讀 2829·2021-09-09 11:55
閱讀 2001·2021-09-01 11:41
閱讀 991·2019-08-30 15:55
閱讀 3350·2019-08-30 12:50
閱讀 3495·2019-08-29 18:37
閱讀 3295·2019-08-29 16:37
閱讀 2011·2019-08-29 13:00