LINEのログインURLを作成する
AWS cognitoのOIDCでLINEの連携は行ったものの、ログインのUIは自前のものを使用したいと考えた。
LINEのログインURLが欲しいが、SDKやAPIを使って取得する方法は見つけられなかったので、cognitoのホストされたUIに表示されているLINEログインURLを確認した。
※SDKやAPIでURLが提供されている場合は教えてください。
前提条件
・AWS cognitoとLINEは連携済みであること。AWS Cognito ユーザープールにLINEサインイン連携を設定するを参照。
結論
下記のような形となる
https://{APP_CLIENT_DOMAIN}.auth.ap-northeast-1.amazoncognito.com/oauth2/authorize?identity_provider={PROVIDER_NAME}&redirect_uri={CALLBACK_URL}&response_type=CODE&client_id={APP_CLIENT_ID}&scope=aws.cognito.signin.user.admin%20email%20openid%20profile
APP_CLIENT_DOMAIN:cognitoのユーザープールのアプリケーション統合で設定したドメイン名
PROVIDER_NAME:cognitoのユーザープールのサインインエクスペリエンスのフェデレ―テッドアイデンティティプロバイダーで設定したIDプロバイダー名
CALLBACK_URL:cognitoのユーザープールのアプリケーションに設定したホストされたUIに設定した許可されているコールバックURL
APP_CLIENT_ID:cognitoのユーザープールのアプリケーションのクライアントID
※カスタムドメインの場合、一部修正が必要かもしれません。
以下詳細
URLを確認する
lambdaで実装
import json
import os
import uuid
import boto3
# LINEログインのコールバックURL
CALLBACK_URL = os.environ.get('LINE_CALLBACK_URL')
# cognitoのアプリケーションのクライアントID
APP_CLIENT_ID = os.environ.get('CLIENT_ID')
# cognitoのアプリケーションのドメイン名
APP_CLIENT_DOMAIN = os.environ.get('CLIENT_DOMAIN')
# ユーザーがログインするためのURLを生成する
def generate_login_url(state):
login_url = f"https://{APP_CLIENT_DOMAIN}.auth.ap-northeast-1.amazoncognito.com/oauth2/authorize?identity_provider=LINE&redirect_uri={CALLBACK_URL}&response_type=CODE&client_id={APP_CLIENT_ID}&scope=aws.cognito.signin.user.admin%20email%20openid%20profile"
return login_url
# Lambda関数のエントリーポイント
def lambda_handler(event, context):
state = str(uuid.uuid4()) # 任意の文字列を指定
login_url = generate_login_url(state)
return {
"statusCode": 200,
"body": json.dumps({
"login_url": login_url,
}),
}
作成したURLにアクセスする
ログイン後は設定したコールバック関数が呼ばれる。
まとめ
ログインURLはstatusを固定値にしてしまえばURLが変わることはないためサーバーから返さなくても画面に固定値で埋め込むことは出来るかもしれない。
(statusは固定値でいいのか、nonceを設定した方がいいのかなど考慮する必要はある)
サーバーはREST APIで構築しようとして考えたため、そもそもログイン後のセッションなどはどうなるのかいまいちわかっていない。
これから試していきます。