国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

使用 Authing + Lambda 替代 AWS Cognito

Vultr / 836人閱讀

摘要:編寫函數(shù)編寫函數(shù)推薦使用這個,控制臺中的函數(shù)編寫堪稱讓人痛不欲生。在控制臺中安裝在中引入包后會一起打包上傳到運(yùn)行時中。

Amazon Web Services(AWS) 雖然作為市場份額全球第一的云計算廠商,其產(chǎn)品也不是完美無缺的,Cognito (AWS 的身份認(rèn)證解決方案)及其附帶的中文文檔就是一個反面教材,其難用程度令人發(fā)指。當(dāng)然,除了不易用之外,還有訪問速度緩慢,不適用于中國市場等問題存在。

而國產(chǎn)的 Authing 可以解決使用 Cognito 的諸多問題,先看一下 Authing 的介紹:

Authing 是一個身份認(rèn)證服務(wù)商,其提供了企業(yè)級身份認(rèn)證和管理解決方案,客戶分布教育、IoT、互聯(lián)網(wǎng)和電商等多個行業(yè)。

Lambda 是一個由 AWS 提供的 Function-as-a-Service (FaaS) 平臺 。Lambda 和 AWS 生態(tài)結(jié)合的非常緊密,接入 Lambda 后,開發(fā)者可以使用 AWS 生態(tài)內(nèi)的所有資源。比如,我們可以創(chuàng)建一個 Lambda 函數(shù),讓用戶通過 Cognito 登錄(當(dāng)然這篇文章是讓用戶使用 Authing 登錄),然后再調(diào)用另外一個可以上傳文件到 S3(AWS 的存儲服務(wù)) 的 Lambda 函數(shù)。

這類平臺(現(xiàn)在多被稱為 Serverless,無服務(wù)器架構(gòu))的一個好處是可以讓開發(fā)者無需擔(dān)心基礎(chǔ)設(shè)施,專心業(yè)務(wù)研發(fā)。

FaaS 或者說 Serverless 平臺正在逐漸獲得市場關(guān)注,因為這種類型的平臺可以讓開發(fā)者不用再關(guān)注基礎(chǔ)設(shè)施。"What is serverless" 這篇文章詳細(xì)的講解了什么是「無服務(wù)器計算」和「無服務(wù)器計算」的好處,推薦讀一下。

這篇文章的主要目的是介紹如何使用 Authing + Lambda 替代 AWS Cogito,點擊這里體驗最終 demo。

此外,Authing 遵循 OIDC 規(guī)范,所以本篇文章將使用 OIDC 來做認(rèn)證,如果你還不了解什么是 OIDC,請查看這篇文章。

首先確認(rèn)下用戶的操作流程:

打開頁面:https://sample.authing.cn/aws/;

點擊 Login 進(jìn)行登錄,此時跳轉(zhuǎn)到 Authing 的登錄頁面(應(yīng)用的二級域名);

輸入賬號密碼進(jìn)行登錄,若沒有賬號密碼請先進(jìn)行注冊;

登錄成功后返回第一步打開的頁面,并顯示登錄用戶的頭像;

此時用戶可以看到從 AWS Lambda 請求回來的 Private 信息;

最終效果如下圖所示:

點擊這里體驗 DEMO

創(chuàng)建一個 Authing 應(yīng)用

如果你還沒有注冊 Authing,那么請點擊這里進(jìn)行注冊,注冊完成后,按以下步驟創(chuàng)建一個 Authing 應(yīng)用。

創(chuàng)建應(yīng)用

填寫基本信息,應(yīng)用類型選擇 Web 應(yīng)用

創(chuàng)建完成后會進(jìn)入到應(yīng)用主頁(空空如也)

創(chuàng)建 OIDC 應(yīng)用

創(chuàng)建完應(yīng)用后相當(dāng)于你有了一個用戶池,接下來你可以創(chuàng)建 OIDC 應(yīng)用來授權(quán)其他程序(你自己寫的或其他第三方程序)訪問你的用戶池。

如果你還不清楚什么是 OIDC,請參考這篇文章。

點擊「第三方登錄」開始創(chuàng)建 OIDC 應(yīng)用

選擇「OIDC 應(yīng)用」選項卡,并點擊「創(chuàng)建 OIDC 應(yīng)用」

填寫應(yīng)用名和認(rèn)證地址,并勾選 id_token token

這里要說明一下,創(chuàng)建 OIDC 應(yīng)用時的認(rèn)證地址將由 Authing 生成一個二級域名(支持 HTTPS),且不能重復(fù),回調(diào) URL 填寫你自己的回調(diào)地址即可,在這里我用的是 https://authing.cn,注意,OIDC 協(xié)議中不允許回調(diào) URL 為 localhost,請使用代理工具進(jìn)行調(diào)試。

點擊確認(rèn),就可以看到我們有了第一個基于 OIDC 協(xié)議的授權(quán)應(yīng)用

創(chuàng)建完成后你可以訪問 lambda.authing.cn ,此時會看到報了一個錯,別害怕,這是因為我們發(fā)起的授權(quán)鏈接不正確。

發(fā)起正確授權(quán)請求的方式請繼續(xù)往下看。

發(fā)起授權(quán)請求

和絕大多數(shù)的 OAuth 應(yīng)用差不多,OIDC 的授權(quán)鏈接也需要拼接(如果你開發(fā)過微信應(yīng)用,應(yīng)該會很容易理解),Authing OIDC 應(yīng)用的授權(quán)鏈接符合標(biāo)準(zhǔn)規(guī)范,具體格式為:

https://lambda.authing.cn/oau...;應(yīng)用 ID>&redirect_uri=<回調(diào) URL,必須和平臺配置完全一樣>&scope=openid profile&response_type=&state=<一個隨機(jī)字符串,用來防范 CSRF 攻擊>

若需要查看詳細(xì)的參數(shù),請點擊這里查看。

例如:

https://lambda.authing.cn/oau...://authing.cn&scope=openid profile&response_type=id_token token&state=jacket

為了簡單起見,這里我們的 response_type 設(shè)置為「id_token token」,這樣不需要使用「code」換取 token,token 會直接附帶到回調(diào)地址中。

如果你的授權(quán)鏈接正確,應(yīng)該可以看到上圖這樣的登錄窗口,同時這個窗口也是你的終端用戶所使用的窗口,他們都將從這里登錄然后回調(diào)到你配置好的回調(diào) URL 中。

你可以試著注冊一個賬號然后進(jìn)行登錄,登錄完成后可以在控制臺中觀察到登錄狀況。

注冊成功

登錄之后的授權(quán)頁面

控制臺中觀察到的用戶數(shù)據(jù)

在你登錄成功后應(yīng)該會看到回調(diào)到了你填寫 URL 中,并且附帶了很多參數(shù),接下來我們會闡述如何使用這些參數(shù)。

獲取用戶信息
回調(diào)到在控制臺中配置的 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 解析后將得到如下結(jié)果:

{
  "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"
}

其中包含了簽發(fā)時間(iat)、過期時間(exp)等字段,可以用來判斷用戶有沒有被認(rèn)證過,在 OIDC 的規(guī)范中,JWT 使用 OIDC 應(yīng)用的 secret 簽發(fā),需要開發(fā)者在后端驗證(這一步我們將會在 Lambda 中執(zhí)行)后繼續(xù)執(zhí)行開發(fā)者本身的業(yè)務(wù)流程。

再來看看 access_token 的例子:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InIxTGtiQm8zOTI1UmIyWkZGckt5VTNNVmV4OVQyODE3S3gwdmJpNmlfS2MifQ.eyJqdGkiOiJza0p-bTNaYmZsTjVxVGEzR2J2YlMiLCJzdWIiOiI1Y2MyYTg1MTFiYmFmMDRmOTNjZTQ4OWYiLCJpc3MiOiJodHRwczovL29hdXRoLmF1dGhpbmcuY24vb2F1dGgvb2lkYyIsImlhdCI6MTU1NjM2Mjg4OSwiZXhwIjoxNTU2MzY2NDg5LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIiwiYXVkIjoiNWNjMmI1NDhkMTRjNzQyZGI4OTNiYTU1In0.Uf3YK4D9HL-G71hkA4cWt5kitDo5rNgwVA9Vqlv4RjAILNDTylYWtkacKJpLcOSS81ivaNpDVNYYzBSoyN-eMH80VhArPUre74F9SHdonA-IVFVPT0DHRtOAJI9kqDW4tgTXhZeZMUm-MCjVjR-q8XrayXaqrC5Hu5W3D1N-K_jZOlwxzIBf51nuC4NMvSI_wPpYj2WPzGxFwpfTCEbnhj5RO0CcThRpC3EdmpbtcJqStd7AZQhkLyTb1TQLHJOel8DSxLnLnoIU0rZXsodK6EjE_oqRLagetNXF1cKfRmnGFaAKZKqgvHc527S_CVkgXIwcHBRmDeqo93CCId_hmQ

使用 jwt.io 解析后將得到如下結(jié)果:

{
  "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 的區(qū)別:

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 是一個你可以訪問資源服務(wù)器(這里就是 Authing) 的一個憑證。

同時也可以看到,idtoken 包含的信息較少,如果想獲取更多信息,需要使用 access_token 來獲取。獲取方式也非常簡單,只需要往以下鏈接發(fā)送 GET 請求并且附帶 access_token 即可,如:

$ curl https://users.authing.cn/oauth/oidc/user/userinfo?access_token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InIxTGtiQm8zOTI1UmIyWkZGckt5VTNNVmV4OVQy...balabala...verylong...

可以獲取到 id 等信息,獲取到 id 之后你可以將 id 存儲到你自己的數(shù)據(jù)庫中以完成自己的實際業(yè)務(wù)。

{
    "sub":"5cc2a8511bbaf04f93ce489f",
    "nickname":"",
    "picture":"https://usercontents.authing.cn/authing-avatar.png"
}

上面的 JSON 是一個使用 access_token 換取用戶數(shù)據(jù)后的返回結(jié)果。

好了,現(xiàn)在我們已經(jīng)獲取到 Token 了,接下來我們需要在 Lambda 中驗證這個 Token 的合法性并在前端顯示不同的信息。

編寫 Lambda 函數(shù)

編寫 Lambda 函數(shù)推薦使用 Serverless 這個 CLI,AWS 控制臺中的函數(shù)編寫堪稱讓人痛不欲生。

同時,你可以到這里查看完整代碼。

Lambda 在這篇文章中主要用來做三件事:

對 id_token 進(jìn)行認(rèn)證,以獲取用戶是否被認(rèn)證過;

提供一個 Public API,此 API 可以直接被訪問;

提供一個 Private API,此 API 需要經(jīng)過認(rèn)證后被訪問;

對 id_token 進(jìn)行認(rèn)證

認(rèn)證 id_token 首先需要知道 OIDC 應(yīng)用的 secret,此值可以在 Authing 控制臺查看 OIDC 應(yīng)用的詳情中找到:

請務(wù)必保管好此值,避免向任何人泄漏

id_token 在簽發(fā)時的簽名是此 secret ,因此在 JavaScript 中可以直接使用 jsonwebtoken 這個庫來驗證 id_token 的合法性(詳情請參考:驗證 Token 合法性)。

在控制臺中安裝 jsonwebtoken:

$ npm install jsonwebtoken --save

P.S. 在 lambda 中引入包后會一起打包上傳到 AWS Lambda 運(yùn)行時中。

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-authorizer

provider: 
 name: aws
 runtime: nodejs8.10

functions:
  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

此文件可用來配置需要鑒權(quán)的路由,如上面代碼中的 privateEndpoint,配置了 authorizer 為 auth 函數(shù)。

點擊此處查看完整代碼。

測試 Lambda

寫完了代碼之后我們需要進(jìn)行測試。

Lambda 支持直接在本地測試,可以使用如下命令:

$ sls invoke local -f auth --data "{"authorizationToken": "Bearer "}"

如果本地測試返回了如下信息則表示驗證成功:

{
    "principalId": "user"
}
部署 Lambda
$ serverless deploy

部署完成后會得到三個鏈接,這三個鏈接分別是上述代碼的三個函數(shù)。

紅框中的路由是在 serverless.yml 中定義好的,可以直接映射到函數(shù)中。

使用 curl 或 postman 將 OIDC 登錄后的 id_token 攜帶到 header 的 Authorization 中即可查看結(jié)果,如:

$ curl --header "Authorization: " 

上述三個路由的結(jié)果應(yīng)該為:

curl  - Should work! Public!
curl  - Should not work
curl --header "Authorization: "  - Should work! Authorized!

最后,在我們的前端補(bǔ)充上相關(guān)信息,在點擊登錄后應(yīng)該可以看到如下信息:

線上體驗地址:https://sample.authing.cn/aws/

Enjoy!
Authing.cn - 領(lǐng)先的身份認(rèn)證云

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/104010.html

相關(guān)文章

  • IDaaS | 使用 Authing + Lambda 輕松替代 AWS Cognito

    摘要:你可以試著注冊一個賬號然后進(jìn)行登錄,登錄完成后可以在控制臺中觀察到登錄狀況。編寫函數(shù)編寫函數(shù)推薦使用這個,控制臺中的函數(shù)編寫堪稱讓人痛不欲生。在控制臺中安裝在中引入包后會一起打包上傳到運(yùn)行時中。 showImg(https://segmentfault.com/img/remote/1460000020183336?w=800&h=422); Amazon Web Services(A...

    DangoSky 評論0 收藏0
  • AWS-Lambda 使用入門

    摘要:例如,控制臺使用調(diào)用類型,因此當(dāng)您使用控制臺調(diào)用函數(shù)時,控制臺將顯示返回的值。如果別名用于調(diào)用函數(shù),將為別名指向的版本。 場景:現(xiàn)在需要開發(fā)一個前后端分離的應(yīng)用,后端采用 RESTful API 最為方便,但是如果這個后端服務(wù)會在一天中的某些時候有高并發(fā)的情況,使用什么樣的架構(gòu)最為簡單呢? 剛思考這個問題的時候我想到的解決方案可能有以下幾種: 使用CDN內(nèi)容分發(fā)網(wǎng)絡(luò),減少主服務(wù)器的...

    RobinQu 評論0 收藏0
  • 【譯】Serverless架構(gòu) - 1

    摘要:在這個思想指導(dǎo)下,并且將大量行為移到前端,此類架構(gòu)移除了對傳統(tǒng)部署在應(yīng)用后永遠(yuǎn)在線的服務(wù)系統(tǒng)。在這種情況下,這種系統(tǒng)可以明顯減少運(yùn)維成本和復(fù)雜度,代價是對廠商的依賴和目前不太成熟的支持服務(wù)。可以認(rèn)為這就是。是目前最流行的實現(xiàn),但還有其他的。 原文: https://martinfowler.com/arti... Serverless架構(gòu)特指那些依賴第三方服務(wù)(即后端即服務(wù)或者是Baa...

    ysl_unh 評論0 收藏0
  • 無服務(wù)器架構(gòu)(Serverless Architectures)(上)

    摘要:原文作者無服務(wù)器架構(gòu)是指一個應(yīng)用大量依賴第三方服務(wù)后端即服務(wù),,簡稱,或者把代碼交由托管的短生命周期的容器中執(zhí)行函數(shù)即服務(wù),,簡稱。這些服務(wù)最早被稱為,下文將對此簡稱為。是目前的熱門實現(xiàn)之一,下文將對此簡稱為。它同樣經(jīng)由網(wǎng)關(guān)暴露給外部使用。 譯注: 為了便于對照參考,Serverless、BaaS 等術(shù)語文中不做翻譯。 原文很長,這里分成上下兩篇。翻譯過程在 GitHub 上進(jìn)行。...

    ConardLi 評論0 收藏0

發(fā)表評論

0條評論

Vultr

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<